ps如何获取其他用户进程的可执行文件?

Mat*_*ine 5 linux permissions ps

当以非 root 身份运行时,如果我尝试使用不属于我的进程,则会收到权限错误readlink(2)/proc/<pid>/exe那么,如何ps使用-f不是 setuid root 的选项来确定不同用户进程的可执行文件呢?

Gil*_*il' 2

-f选项不显示可执行文件的完整路径,而是显示用于调用可执行文件的命令行。此信息是世界可读的,来自,与可执行文件的路径不同,可执行文件的路径只能由执行该进程的用户读取。/proc/PID/cmdline/proc/PID/exe

\n\n

ps您可以通过观察其系统调用 \xe2\x80\x94 run 来检查正在读取的数据strace ps -ef -p 1 | less

\n\n
\xe2\x80\xa6\nstat("/proc/1", {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0\nopen("/proc/1/stat", O_RDONLY)          = 6\nread(6, "1 (init) S 0 1 1 0 -1 4202752 78"..., 1024) = 191\nread(6, "", 833)                        = 0\nclose(6)                                = 0\nopen("/proc/1/status", O_RDONLY)        = 6\nread(6, "Name:\\tinit\\nState:\\tS (sleeping)\\nT"..., 1024) = 752\nread(6, "", 272)                        = 0\nclose(6)                                = 0\n\xe2\x80\xa6\nopen("/proc/1/cmdline", O_RDONLY)       = 6\nread(6, "/sbin/init", 2047)             = 10\nclose(6)                                = 0\n\xe2\x80\xa6\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果传递该c选项,则ps报告来自 的命令名称,该名称也是世界可读的。这是截断为 16 个字符的可执行文件的基本名称(没有路径信息)。/proc/PID/stat

\n\n

我认为没有ps选项可以报告 中找到的可执行文件的路径。您可以使用(文件描述符)\xe2\x80\x94\xc2\xa0列出它,并且当要求打印有关另一个用户进程的信息时,它可以预见地会抱怨。/proc/PID/exelsoftxt/proc/1/exe (readlink: Permission denied)

\n\n

注:我的回答是关于 Linux 的。不同 Unix 变体中,可以报告其他用户进程的哪些信息及其工作方式的详细信息有很大不同。

\n