thrig Asked: 2017-12-08 06:55:51 +0800 CST2017-12-08 06:55:51 +0800 CST 2017-12-08 06:55:51 +0800 CST 用空格分割 /proc/pid/stat 的缺点是什么? 772 /proc/pid/stat在 Linux 上按空格分割的缺点是什么?例如使用bash一个可以通过访问第三列 $ cat /proc/$$/stat 14198 (bash) S 14195 14198 14198 34816 ... $ x=($(< /proc/$$/stat)); echo ${x[2]} S $ 一切似乎都很好? linux proc 2 个回答 Voted thrig 2017-12-08T06:58:27+08:002017-12-08T06:58:27+08:00 主要问题是空格字符 ( 0x20) 既用于记录之间的分隔符,也可能出现在记录中;本地用户是否可以设置进程名称 $ perl -e '$0="like this"; sleep 999' & [1] 14343 $ 那么由空格分割的解析将失败 $ x=($(< /proc/14343/stat)); echo ${x[2]} this) $ 因为命令名称包含一个空格。 $ cat /proc/14343/stat 14343 (like this) S 14198 14343 ... $ 这能有多糟糕?根据proc(5)“进程的控制终端”是有趣的 tty_nr %d (7) The controlling terminal of the process. (The minor device number is contained in the combination of bits 31 to 20 and 7 to 0; the major device number is in bits 15 to 8.) 因此,如果一个进程滥用了由于有人更改了该信息而错误解析的控制终端信息/proc/pid/stat,那么您可能会遇到安全漏洞。 解析更加复杂,因为)尽管有 15 个字符的限制,但可以将 a 放在进程名称中 $ perl -e '$0="lisp) a b c d e f g h i"; sleep 999' & [4] 14440 $ cat /proc/14493/stat 14493 (lisp) a b c d e) S 14198 14493 14198 34816 ... $ 解析这个接口疣的想法 由于进程名称可以在空字符串和几乎任何内容的 15 个字节之间变化 1234 () S ... 4321 (xxxxxxxxxxxxxxx) S ... 一个想法是在第一个空格上拆分以获得 pid,然后从该字符串的末尾向后工作以找到第一个);右边第一个之前的东西)应该是进程名称,左边是常规字段。强烈建议对代码进行单元测试... Best Answer ilkkachu 2017-12-08T08:31:42+08:002017-12-08T08:31:42+08:00 如果您甚至需要考虑它,为什么不直接阅读/proc/$pid/status。它在标记良好的行上提供相同的信息,并转义出现在进程名称中的换行符和反斜杠: $ perl -e '$0="foo\nbar\n"; system "head -3 /proc/$$/status";' Name: foo\nbar\n Umask: 0022 State: S (sleeping)
主要问题是空格字符 (
0x20
) 既用于记录之间的分隔符,也可能出现在记录中;本地用户是否可以设置进程名称那么由空格分割的解析将失败
因为命令名称包含一个空格。
这能有多糟糕?根据
proc(5)
“进程的控制终端”是有趣的因此,如果一个进程滥用了由于有人更改了该信息而错误解析的控制终端信息
/proc/pid/stat
,那么您可能会遇到安全漏洞。解析更加复杂,因为
)
尽管有 15 个字符的限制,但可以将 a 放在进程名称中解析这个接口疣的想法
由于进程名称可以在空字符串和几乎任何内容的 15 个字节之间变化
一个想法是在第一个空格上拆分以获得 pid,然后从该字符串的末尾向后工作以找到第一个
)
;右边第一个之前的东西)
应该是进程名称,左边是常规字段。强烈建议对代码进行单元测试...如果您甚至需要考虑它,为什么不直接阅读
/proc/$pid/status
。它在标记良好的行上提供相同的信息,并转义出现在进程名称中的换行符和反斜杠: