次のファイルシステムの内容を理解したい/var/run/utmp
。コマンドod
を使用してそれを開くと、次のように表示されます。
[john@iceman ~]$ od -c /var/run/utmp
0000000 002 \0 \0 \0 \0 \0 \0 \0 ~ \0 \0 \0 \0 \0 \0 \0
0000020 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000040 \0 \0 \0 \0 \0 \0 \0 \0 ~ ~ \0 \0 r e b o
0000060 o t \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000100 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 3 . 1 0
0000120 . 0 - 6 9 3 . 1 1 . 1 . e l 7 .
0000140 x 8 6 _ 6 4 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000160 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
これらの数字/文字はどういう意味ですか?それはどのコーディングシステムで書かれましたか?そして、それをどのように意味のあるテキストに翻訳できますか?
テキストファイルには文字のみが含まれますが、 バイナリファイル には 制御文字 を含むすべての可能な文字値が含まれます。コマンド_od
とフラグ_-c
_ (odは_octal dump
_を表します)、制御文字を含むファイルを表示します。
バイナリファイルを画面に表示するとき、ファイル内の制御文字がワークステーションに望ましくないモードを設定し、出力が不明瞭(つまり意味不明)に見える可能性があり、ワークステーションが応答を停止する場合さえあります。バイナリファイルへの手がかりを見つける(つまり、安全な方法で表示する)ために、コマンドcat
、od
またはhexdump
を使用できます。
コマンド_cat -v
_は、制御文字を安全な方法で表示し、画面を奇妙なモードにしません。このコマンドは、各制御文字をキャレット(^)と対応する印刷可能な文字で表します。
コマンドod
は8進ダンプを表し、_the base eight numbering system
_を使用してファイルまたはパイプラインのすべてのワードを8進で表示します。たとえば、コマンドod
は、システムファイル_/var/run/utmp
_を次のように表示します。
_$ od /var/run/utmp
0000000 000002 000000 000000 000000 000176 000000 000000 000000
0000020 000000 000000 000000 000000 000000 000000 000000 000000
0000040 000000 000000 000000 000000 077176 000000 062562 067542
0000060 072157 000000 000000 000000 000000 000000 000000 000000
0000100 000000 000000 000000 000000 000000 000000 027063 030061
0000120 030056 033055 031471 030456 027061 027061 066145 027067
0000140 034170 057466 032066 000000 000000 000000 000000 000000
0000160 000000 000000 000000 000000 000000 000000 000000 000000
. . . .
. . . .
. . . .
. . . .
_
次に、フラグ_-b
_(-bは8進バイトを選択することを意味します)をコマンドod
に追加すると、各Wordが2バイトまたは2文字に分割されます。たとえば、前のテキストは次のように表示されます。
_$ od -b /var/run/utmp
0000000 002 000 000 000 000 000 000 000 176 000 000 000 000 000 000 000
0000020 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000
0000040 000 000 000 000 000 000 000 000 176 176 000 000 162 145 142 157
0000060 157 164 000 000 000 000 000 000 000 000 000 000 000 000 000 000
0000100 000 000 000 000 000 000 000 000 000 000 000 000 063 056 061 060
0000120 056 060 055 066 071 063 056 061 061 056 061 056 145 154 067 056
0000140 170 070 066 137 066 064 000 000 000 000 000 000 000 000 000 000
0000160 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000
. . . .
. . . .
. . . .
. . . .
_
ASCII(7)
manに従って、前の表の数値をASCIIと一致させます。
000
_はnull
を意味します。002
_は_start of text
_を意味します176
_は文字_~
_を表しますなど、すべての数値はASCII(7)
テーブルにコーディングされます。
反対に、フラグ_-c
_(コマンドod
に選択可能な印刷可能な文字またはバックスラッシュエスケープを表す)を追加すると、出力内に印刷可能な文字が表示されます。上記の同じ例は次のようになります。
_$ od -c /var/run/utmp
0000000 002 \0 \0 \0 \0 \0 \0 \0 ~ \0 \0 \0 \0 \0 \0 \0
0000020 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000040 \0 \0 \0 \0 \0 \0 \0 \0 ~ ~ \0 \0 r e b o
0000060 o t \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000100 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 3 . 1 0
0000120 . 0 - 6 9 3 . 1 1 . 1 . e l 7 .
0000140 x 8 6 _ 6 4 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000160 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
. . . .
. . . .
. . . .
. . . .
_
前の表を意味のあるテキストに変換するには、コマンドstrings
を使用して、長さが約4文字以上の印刷可能な文字列を検索できます。たとえば、前の表では:
r e b o
_が含まれています。o t
_が含まれています。その結果、コマンドstrings
はこれらの文字をWordに変換します_"reboot".
_同様に、
3 . 1 0
_が含まれます。. 0 - 6 9 3 . 1 1 . 1 . e l 7 .
_が含まれています。x 8 6 _ 6 4
_が含まれます。コマンドstring
は、これらの3つの行を_"3.10.0-693.11.1.el7.x86_64"
_に変換します
_$ strings /var/run/utmp
reboot
3.10.0-693.11.1.el7.x86_64
. . . .
. . . .
. . . .
. . . .
_
od -c /var/run/utmp
は、意味のあるテキストを出力できるように最善を尽くし、ファイルを1文字ずつ、可能な場合はクリアテキストで、出力できない場合は2進/ 8進表記で出力します。いくつかのオプションを設定することにより、od
の動作に影響を与えることができます。 utmp
は固定レコードのバイナリファイルであるため、翻訳/解釈/フォーマットを行わずに実際にその内容を読み取る可能性は低いです。
このファイルに何が書き込まれているかを確認するには、utmpdump /var/run/utmp
。
そこには、すべてのutmpエントリが人間が読める形式で表示されます。