/var/run/utmp文件内容含义说明

5 login od files

我想了解以下文件系统的内容/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
Run Code Online (Sandbox Code Playgroud)

这些数字/字符是什么意思?它是在哪个编码系统中编写的?以及如何将其翻译成有意义的文本?

小智 8

文本文件只包含字符,而二进制文件包含所有可能的字符值,包括控制字符od带有标志-c(od 代表octal dump)的命令显示包含控制字符的文件。

在屏幕上显示二进制文件时,文件中的控制字符会为工作站设置不良模式,并可能导致输出显示不清晰(即乱码),甚至可能导致工作站停止响应。为了找到二进制文件的线索(即以安全的方式显示它),我们可以使用命令cat,odhexdump

该命令cat -v将使控制字符以安全的方式可见,并且不会将屏幕置于任何奇怪的模式。此命令用插入符号 (^) 和相应的可打印字符表示每个控制字符。

该命令od代表八进制转储,它使用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
. . . . 
. . . . 
. . . . 
. . . . 
Run Code Online (Sandbox Code Playgroud)

现在,-b在命令中添加标志(-b 表示选择八进制字节)od会将每个单词分成两个字节或字符。例如,之前的文本将显示如下:

$ 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
. . . . 
. . . . 
. . . . 
. . . . 
Run Code Online (Sandbox Code Playgroud)

根据 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
. . . . 
. . . . 
. . . . 
. . . . 
Run Code Online (Sandbox Code Playgroud)

为了将前面的表格转换为有意义的文本,我们可以使用该命令strings来查找长度约为四个字符或更长的任何可打印字符的字符串。例如,在上表中:

  • 行 <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.10.0-693.11.1.el7.x86_64"

$ strings  /var/run/utmp 
reboot
3.10.0-693.11.1.el7.x86_64
. . . . 
. . . . 
. . . . 
. . . . 
Run Code Online (Sandbox Code Playgroud)