いますぐ実践! Linuxシステム管理

いますぐ実践! Linux システム管理 / Vol.265 / 読者数:2686名

こんばんは、うすだです。

申し訳ございません、またしても、またしても、遅れております。
(公私ともに、最近「申し訳ございません」を連発中です…。)

そしてさらに、これから年末にかけて、いろいろ逼迫していきそうです。

自分でも、大丈夫なのか? と心配になっているのですが、最近とある本を読み、 微粒子レベルで前向きに考えられるようになってきました。

自分のための人生
http://www.amazon.co.jp/exec/obidos/ASIN/4837957536/usupiorg-22

自分の人生をきちんと生きている人にとっては、当たり前のことが書いてあるだけです。 が、そうでない人にとっては、自分の思い込みや間違った考え方を、 やんわりと広範囲に指摘してくれる、良い本です。

とりあえず、私の場合、悪しき習慣が1つ減りました。 それだけでも価値があったと思います。

とはいえ、まだまだ未熟なところが山脈のようにそびえ立っています。
今後も、一種のチェックシートとして、定期的に読み返そうと思います。

個人的な話はもういいですね、はい、今回もはりきってまいりますね。

今回のお題 - ファイルの中身が妥当なことを確認する (レベル:初級)

サーバには、いろいろな役割があり、その役割によって、 扱うファイルの形式が異なります。

そのため、扱うサーバの種類が増えると、 システム管理者が扱うファイルの形式の種類も増えていきます。

うまく動いているうちはよいのですが、想定していないファイルの形式になっていると、 処理の過程で実行するコマンドや利用するサービスがトチ狂ってしまう可能性が、 少なからずあるのではないかと思います。

また、一般ユーザの方々が、うまく動作しないとか文字化けして読めないとか、 いろいろ文句をおっしゃられたりすることも、それなりにあるかもしれません。

そんなとき、ぱぱっと調べ、ぱぱっと問題箇所を修正できると、 システム管理者の地位も上がり、成功への階段を一気に駆け上がれることになる… かもしれません。

というわけで今回は、よくありがちなファイルの中身を確認したり、 変換する方法をご紹介したいと思います。具体的には、以下の通りです。
(実のところ、CSVファイルの確認は、少し前に実務で行いました。)

  • CSVファイルのカンマの数を確認する
  • テキストファイルの文字コードや改行コードを確認する
  • テキストファイルの文字コードや改行コードを変換する

CSVファイルのカンマの数を確認する

サーバの情報をCSVファイルの形にまとめて、Excelかなにかで処理する、 というのは、よく行われているのではないかと思います。

ですが、何かの拍子にあるカラムの出力をすっ飛ばしてしまうなどして、 データのずれた出力をしてしまうことが、まれにあります。

ミスをやらかしてしまうのは仕方がないとしても、「,」の数をチェックして、 問題を事前に察知できるようにしておくと、 惨事を食い止められるのではないかと思うのです。

というわけで、CSVファイルのカンマの数を確認したいと思います。
それには、「awk」コマンドで、区切り文字を「,」にして、 フィールドの数を数えればよさそうです。

  $ awk 'BEGIN {FS=","} {print NF}' csvfile
  16
  16
  15  ← あ、少ないのがある!
  16
  ...後略...

各行のフィールドの数が出力されるので、みんな同じ値なら、 カンマの数が同じだと言えます。
ですが、数百行数千行(あるいはもっとたくさん)あると、目視では確認が大変です。 じゃあ、「uniq」コマンドで重複する行をまとめてしまえば、 出力が1行なら OK、2行以上だと NG、といえますね。

  $ awk 'BEGIN {FS=","} {print NF}' csvfile | uniq
  16
  15  ← おかしい!
  16

以下のように、スクリプトにしてもよさそうです。

#!/bin/sh
if [ $# -ne 1 ]; then
    echo "Usage: $0 csvfile"
    exit 1
fi
if [ $(awk 'BEGIN {FS=","} {print NF}' $1 | uniq | wc -l) -eq 1 ]
then
    echo "正しいっすよ"
else
    echo "間違ってるっすよ"
fi

どうせなら、間違っている行も、できれば知りたいですよね。
じゃあ、前の行のフィールド数を覚えておいて、 今の行のフィールド数と一致しないとき、 行番号とフィールド数を出力してしまいましょう。

  $ awk 'BEGIN {FS=","} { if(prev!=NF && NR>1) print NR,NF; prev=NF}' csvfile

さっきとは違って、一致しない行があるときだけ、出力されます。
uniqコマンドも要らなくなりました。

テキストファイルの文字コードや改行コードを確認する

Unix系のOSで作ったテキストファイルを Windows に持ってきたら、 文字化けしたり、全部1行で表示されてしまってゲンナリした、 という経験はないでしょうか。

おっとその前に、文字コードと改行コードの種類について、 最小限未満の説明をしておきます。

まず、文字コードですが、厳密には文字集合と符号化方式に分かれます。

たとえば、「EUC-JP」「Shift_JIS」「JIS(ISO-2022-JP)」は、 いずれも JIS X 0208 という文字集合を用いますが、符号化方式が異なります。
(といいますか、これらはそもそも符号化方式の名前です。)

「UTF-8」「UTF-16」も、Unicodeで定められた符号化方式で、 やはり同じ文字集合を使います。

で、最近は、Unix系でもWindowsでもUTF-8が使われます。
ですが、最近でないと、Unix系では EUC-JP が、 Windowsでは Shift_JIS がデフォルトの文字コードだったりします。

それから、改行コードには、以下の2つの文字が使われます。

  • LF(Line Feed) : ASCII文字コードで 0x0a
  • CR(Carriage Return) : ASCII文字コードで 0x0d

Unix 系では LF、Windows では CR+LF、 Mac OS 9までの Mac では CR が改行コードとして使われます。

 

さて、とあるテキストファイルの文字コードや改行コードがなんなのか、 確認したいと思ったら、どうすればよいでしょうか。

「hexdump」コマンドを使うと、 改行コードは比較的簡単に確認することができます。
(以下ではオプションを細かく指定していますが、 横長に出力されるのがイヤなだけで、 みなさんは「-C」オプションで済ませてください。)

  $ hexdump -e '12/1 "%02x "' -e '12/1 "%c""\n"' /etc/debian_version
  6a 65 73 73 69 65 2f 73 69 64 0a   jessie/sid

上記の場合、行末が 0a だけなので、Unix系ということがわかります。

文字コードの場合は、まず以下の例をご覧ください。
「あア亜」というテキストを hexdump した結果です。

  [JIS の場合]
  $ hexdump -e '16/1 "%02x "" "' -e '16/1 "%_p""\n"' aaa-jis
  1b 24 42 24 22 25 22 30 21 1b 28 42 0a          .$B$"%"0!.(B.

  [EUC-JP の場合]
  $ hexdump -e '16/1 "%02x "" "' -e '16/1 "%_p""\n"' aaa-euc
  a4 a2 a5 a2 b0 a1 0a                            .......

  [Shift_JIS の場合]
  $ hexdump -e '16/1 "%02x "" "' -e '16/1 "%_p""\n"' aaa-sjis
  82 a0 83 41 88 9f 0a                            ...A...

  [UTF-8 の場合]
  $ hexdump -e '16/1 "%02x "' -e '16/1 "%c""\n"' aaa-utf8
  e3 81 82 e3 82 a2 e4 ba 9c 0a                   あア亜

JISの場合は、すべて7ビット(0〜0x7f)で表されるので、 もっとも判別がしやすいと思います。
(ESC $ B 〜 ESC ( B などで囲まれているように見えます。)

EUC-JP と Shift_JIS の場合は、全角文字1文字が2バイトで表されます。
区別がしにくいのですが、 EUC-JP は2バイトとも 0x80〜0xff の範囲内におさまります。ですが、 Shift_JIS の場合は、2バイト目が 0x7f 以下になることがあります。ただ、 必ずそうなるとは限りません。
(上記の例では、「ア」が 83 41 なので、そうなっています。)

UTF-8 の場合は、全角文字1文字が2バイト以上で表されます。
そのため、EUC-JP や Shift_JIS よりも長くなります。

まとめますと、日本語の部分に注目して、以下のように判断できます。

  • 7ビットで表されていれば JIS
  • 2バイトで、いずれかの2バイト目に 0x7f 以下があれば Shift_JIS
  • 全部8ビットだと EUC-JP (の可能性が高い)
  • 2バイトより長ければ UTF-8

 

…とはいえ、もうちょっと、すぱっとわかったほうがいいですよね。
実は、調べるためのコマンドがあります。「nkf」さんです。

そもそもは文字コードを変換するコマンドですが、 知らないうちに機能がいろいろと増えていらっしゃいました。
で、「--guess」オプションをつけると、たぶんこれ、と出力します。

  $ nkf --guess nazo-no-file
  ISO-2022-JP (LF)

この場合、JIS で、Unix系の改行コードというのが分かります。
お察しの通り、括弧内が改行コードを表します。「CRLF」だとWindows、 「CR」だとMacです。

テキストファイルの文字コードや改行コードを変換する

文字コードおよび改行コードの変換も、nkf コマンドでできます。

まずは文字コードです。
UTF-8、JIS、EUC-JP、Shift_JIS へ変換するには、 それぞれ「-w」「-j」「-e」「-s」オプションを指定します。
たとえば、Shift_JIS に変換するには、以下のように実行します。

  $ nkf -s foo.txt > foo-sjis.txt

ありがたいことに、入力ファイルの文字コードは指定不要です。

ちなみに、UTF-16 への変換は、「-w16B」もしくは「-w16L」オプションを指定します。 前者がビッグエンディアン、後者がリトルエンディアンになります。

  $ nkf -w16B aaa | hexdump -e '16/1 "%02x "' -e '16/1 """\n"'
  fe ff 30 42 30 a2 4e 9c 00 0a

  $ nkf -w16L aaa | hexdump -e '16/1 "%02x "' -e '16/1 """\n"'
  ff fe 42 30 a2 30 9c 4e 0a 00

先ほど書き忘れましたが、判別は、先頭の feff, fffe でできます。
(そもそも、エンディアンを判別するための「BOM(Byte Order Mark)」と言うものです。)

 

次に、改行コードです。
LF、CRLF、CR への変換には、 それぞれ「-Lu」「-Lw」「-Lm」オプションを指定します。
たとえば、Macな改行コードにするには、以下のように実行します。

  $ nkf -Lm bar-unix.txt > bar-mac.txt

もちろん、まとめて変換できます。
Windows のメモ帳で開けるようにするには、以下のように実行します。
(つまり、Shift_JIS + CRLF に変換しています。)

  $ nkf -sLw baz.txt > baz-win.txt

おわりに

以上、テキストファイルに関する微妙なコネタ集を、お送りしました。

本当は、scriptコマンドで取得したファイルから、 エスケープシーケンスを取り除きたかったのですが、方法がわかりませんでした。
(端末で cat してコピペ、というベタな方法は教えてもらいました。)

すっきりした方法がわかりましたら、ネタとして紹介したいと思います。
もしご存じな方がいらっしゃいましたら、ぜひ教えてください!

宿題の答え

前回の宿題は、

  Dockerで、GUIを動かすためのコンテナを作ってみましょう。

でした。

ようするに、Docker の中のXクライアントが、 ホストOS のXサーバに接続できればよいわけですね。

通常、別のホストのXサーバを使わせてもらうには、 TCPの6000番ポートを開放してもらうか、SSHのX11フォワーディング機能を使います。

ですが、最近のLinuxのデスクトップな環境では、 デフォルトでは前者が使えないようになっています。
具体的には、「-nolisten tcp」というオプションつきで Xサーバが起動されるため、 TCPで待ち受けてくださらないのです。

じゃあ、後者のSSHか…となりそうですが、Docker の場合、 同じホストで動作していますので、 UNIXドメインソケットをコンテナから見えるようにしてあげれば、 もう少し簡単に動きそうです。
(SSH だと、X11フォワーディングを有効にしないと使えませんし。)

実は、「run」コマンドには、「-v」というオプションがあり、 指定したホストのパスをコンテナにマウントして見せることができます。

というわけで、こんな風にコンテナを run してあげましょう。
(あ、以降では、CentOS 6 をベースにしています。)

  # docker.io run -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=:0 \
  -it --name cent6-xclient centos:centos6 /bin/bash
  bash-4.1#  (← コンテナの中のbashのプロンプトです)

Xで使用するUNIXドメインソケットは「/tmp/.X11-unix/」以下にありますので、 ここをコンテナから見えるようにします。
ついでに、環境変数DISPLAYも設定してあげています。

さて次に、動かしたいXクライアントが「xterm」だと仮定して、 xterm をインストールします。

  bash-4.1# yum install xterm

あとは、xterm を起動すれば…と言いたいところですが、起動しません。
Xでは、ホストとユーザ双方とも、アクセス制御がかかっています。
UNIXドメインソケット経由という時点で、ホストは許可されているのですが、 ユーザは許可されていません。
そこで、以下の手順で許可してあげます。まずは、 「xauth」コマンドと「ssh」コマンドが必要になるため、以下のパッケージを入れます。

  bash-4.1# yum install openssh-clients xorg-x11-xauth

次に、以下を実行して、ホストの承認情報を得ます。
(ホストで直接 xauth extract - :0 を実行してコピペするなら、ssh は不要です。)

  bash-4.1# ssh ユーザ@172.17.42.1 xauth extract - :0
  ホスト/unix:0  MIT-MAGIC-COOKIE-1  秘密のキー

そして、上記の情報を、xauthの「add」コマンドで追加してあげます。
「list」コマンドで下記のように出力されれば、問題ありません。

  bash-4.1# xauth add :0 MIT-MAGIC-COOKIE-1  秘密のキー
  bash-4.1# xauth list
  コンテナ/unix:0  MIT-MAGIC-COOKIE-1  秘密のキー

今度こそ、xterm が画面に現れます。現れるはずです。現れてください。

  bash-4.1# xterm

えーと、そもそも何の話か忘れてしまった貴兄は、下記をご覧ください。

Vol.263 - Docker を使ってみる
http://www.usupi.org/sysad/263.html
Vol.264 - Docker をもう少し深く使ってみる
http://www.usupi.org/sysad/264.html

今回の宿題

今回の宿題は、

  CSVファイルの特定のカラムの値を取り出してみましょう。

です。

もうぜんぜん確認ではなくなってしまっていますね…。

でも、特定のカラムの値を取り出したり、 取り出した値をチェックしたりすることもあるのではないかと思い、 宿題としてみました。

あとがき

各所で使うIDやパスワードを全部同じにしていると、どれか1つでもバレたら、 全部乗っ取られる恐れがある、というのは、みなさんご存じのことだと思います。

わたしも、以前話題になった「全部やられた」とならないように、 主要なサービスで使うパスワードは、全部違うものを設定しています。

でも、面倒なんですよね。忘れて途方に暮れることもたまにありますし。

だけどやはり、パスワードの使い回しはやっぱりよくないということで、 泣く子も黙る?「JPCERT/CC」様が、下記の呼びかけを行われています。

STOP!!パスワード使い回し!! パスワードリスト攻撃による不正ログイン防止に向けた呼びかけ
https://www.jpcert.or.jp/pr/2014/pr140004.html

ここに書かれている対策は、以前から言われていることかもしれません。
ですが、ここで上記を読み、あらためて対策を検討してみる、 というのをやってみてはいかがでしょうか。

被害にあったとき、被害者が自分だけ、とは限りません。
周囲の人のためにも、よきように行動すべきだと思います。

 

ところで、SSHの鍵ですが、アレの使い回しも、危険なのでしょうか。
いっぱいあると大変なので、わりと同じ鍵を使いがちですが、 もし万が一誰かの手に渡ったら、非常にまずいように思います。

普段持ち歩いてガリゴリ使っているノートPCには、各所の鍵が保存されています。 このPCはぜったい盗まれないようにしないといけません。

ダヴィンチコードのクリプテックスみたく、 無理矢理アクセスを試みたら中のデータが消える、 みたいな仕組みがあるといいかもしれませんね。

…いやいやいや、消えるのも困りますね…。

 

今回も、ここまで読んでいただき、誠にありがとうございました。
次回は、11月2日(日) 未明にお会いしましょう!
(だんだん不定期発行になってきているような…が、がんばります。)

 

「いますぐ実践! Linux システム管理」はこちらです。
メルマガの解除、バックナンバーなども、以下からどうぞ。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

その他、作者に関するページは、概ね以下にございます。
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)
http://twitter.com/kuriking/ (twitter)
http://facebook.com/kuriking3 (facebook)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本