当以非 root 身份运行时,如果我尝试使用readlink(2)
对于/proc/<pid>/exe
不属于我的进程,我收到权限错误。那么,如何使用不是 setuid root 的选项来确定不同用户进程的可执行文件呢ps
?-f
答案1
该-f
选项不显示可执行文件的完整路径,而是显示用于调用可执行文件的命令行。此信息是世界可读的,来自,与可执行文件的路径不同,可执行文件的路径只能由执行该进程的用户读取。/proc/PID/cmdline
/proc/PID/exe
您可以ps
通过观察其系统调用来检查正在读取哪些数据 - runstrace ps -ef -p 1 | less
:
…
stat("/proc/1", {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0
open("/proc/1/stat", O_RDONLY) = 6
read(6, "1 (init) S 0 1 1 0 -1 4202752 78"..., 1024) = 191
read(6, "", 833) = 0
close(6) = 0
open("/proc/1/status", O_RDONLY) = 6
read(6, "Name:\tinit\nState:\tS (sleeping)\nT"..., 1024) = 752
read(6, "", 272) = 0
close(6) = 0
…
open("/proc/1/cmdline", O_RDONLY) = 6
read(6, "/sbin/init", 2047) = 10
close(6) = 0
…
如果传递该c
选项,则ps
报告来自 的命令名称,该名称也是世界可读的。这是截断为 16 个字符的可执行文件的基本名称(没有路径信息)。/proc/PID/stat
我认为没有ps
选项可以报告 中找到的可执行文件的路径。您可以使用(/proc/PID/exe
lsof
txt
它被称为“文件描述符”——/proc/1/exe (readlink: Permission denied)
当被要求打印有关另一个用户进程的信息时,它会不出所料地抱怨。
注:我的回答是关于 Linux 的。可以报告有关其他用户进程的哪些信息以及其工作原理的详细信息在 Unix 变体中存在很大差异。