次のファイルシステムの内容を理解したいと思います/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
この数字/文字はどういう意味ですか?どのエンコーディングシステムで書かれましたか?そしてそれを意味のあるテキストに翻訳する方法は?
答え1
テキストファイルには文字のみが含まれますが、バイナリファイル以下を含む、すべての可能な文字値を含めます。制御文字od
フラグ-c
(odで表示)を持つコマンドは、octal dump
制御文字を含むファイルを表示します。
バイナリファイルが画面に表示されると、ファイルの制御文字はワークステーションに望ましくないモードを設定でき、出力が明確に表示されない(歪みなど)、ワークステーションが応答を停止する可能性があります。バイナリの手がかりを見つけるには(つまり、安全な方法で表示するために)cat
、od
またはコマンドを使用できますhexdump
。
注文するcat -v
これにより、制御文字が安全な方法で表示され、画面が奇妙なモードに切り替わりません。このコマンドは、キャレット(^)と対応する印刷可能文字で各制御文字を表します。
注文するod
ファイルまたはパイプ内のすべての単語を8進数で表示する8進数ダンプを表しますthe base eight numbering system
。たとえば、このコマンドはシステムファイルを次のように 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
単語が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)
上の表の数字を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文字以上の印刷可能な文字列を見つけることができます。たとえば、上記の表では:
- 行<0000040>文字が含まれています
r e b o
。 - 行<0000060>文字が含まれている
o t
ため、コマンドはstrings
これらの文字を単語に変換します。"reboot".
同様に、
- 行<0000100>含む
3 . 1 0
。 - 行<0000120>含む
. 0 - 6 9 3 . 1 1 . 1 . e l 7 .
。 - 行<0000140>含む
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
. . . .
. . . .
. . . .
. . . .
答え2
od -c /var/run/utmp
可能であれば、ファイルを文字ごとにプレーンテキストで印刷し、不可能な場合はバイナリ/8進表現でファイルを印刷して意味のあるテキストを出力するようにしてください。od
複数のオプションを設定して動作に影響を与えることができます。utmp
固定レコードがあるバイナリファイルなので、翻訳/解釈/形式を指定せずに実際に内容を読む可能性は低いです。
答え3
このファイルに記録されている内容を表示するには、を確認してくださいutmpdump /var/run/utmp
。
ここでは、人間が読める形式ですべてのutmpエントリを表示できます。