![/var/run/utmp 文件内容含义解释](https://linux22.com/image/143809/%2Fvar%2Frun%2Futmp%20%E6%96%87%E4%BB%B6%E5%86%85%E5%AE%B9%E5%90%AB%E4%B9%89%E8%A7%A3%E9%87%8A.png)
我想了解以下文件系统的内容/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
代表八进制转储,它使用八进制显示文件或管道的每个字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 表示选择八进制字节)添加到命令中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
. . . .
. . . .
. . . .
. . . .
按照 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
该命令将查找长度约为四个字符或更长的任何可打印字符串。例如,在上表中:
- 行<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
. . . .
. . . .
. . . .
. . . .
答案2
od -c /var/run/utmp
尽力输出有意义的文本,在可以的情况下以明文形式逐个字符地打印文件,在不能的情况下以某种二进制/八进制表示形式打印文件。您可以od
通过设置多个选项来影响 的行为。utmp
是一个具有固定记录的二进制文件,因此在没有翻译/解释/格式化的情况下实际读取其内容的机会很低。
答案3
要查看此文件中写入的内容,您可以检查utmpdump /var/run/utmp
。
在那里您可以看到人类可读形式的所有 utmp 条目。