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

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

当以非 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/exelsoftxt它被称为“文件描述符”——/proc/1/exe (readlink: Permission denied)当被要求打印有关另一个用户进程的信息时,它会不出所料地抱怨。

注:我的回答是关于 Linux 的。可以报​​告有关其他用户进程的哪些信息以及其工作原理的详细信息在 Unix 变体中存在很大差异。

相关内容