为什么“普通用户”在 OS X 上执行“ps ux”时报告的用户是“root”?这是正常行为吗?

sni*_*ies 3 root osx-snow-leopard user ps macos

我正在运行 OS X 10.6.1 。当我以组工作人员的普通用户身份登录并执行

ps ux
Run Code Online (Sandbox Code Playgroud)

它列出了我的 ps ux 命令由 root 运行:

snies   181   0.0  0.3  2774328  12500   ??  S     6:00PM   0:20.96 /System/Library...
root   1673   0.0  0.0  2434788    508 s001  R+    8:16AM   0:00.00 ps ux
snies   177   0.0  0.0  2457208    984   ??  Ss    6:00PM   0:00.52 /sbin/launchd
snies  1638   0.0  0.0  2435468   1064 s001  S     8:13AM   0:00.03 -bash
Run Code Online (Sandbox Code Playgroud)

这是正常行为吗?如果是这样,为什么?请注意,该用户不是管理员帐户,无法执行 sudo。

Chr*_*sen 10

对于 Mac OS X 来说是正常的。它曾经在几乎所有 Unix-oid 系统上都是正常的。它在没有sudo的情况下以 root 身份运行,因为ps二进制文件设置为以 root 身份运行(例如在我的 10.4 系统上):

% ls -l $(which ps)
-rwsr-xr-x   1 root  wheel  31932 Mar 20  2005 /bin/ps
Run Code Online (Sandbox Code Playgroud)

s代替user-owner一x栏意味着它是set-uid(和user-executable),所有者是root;这意味着无论谁运行它,它都会以root身份运行)

传统上(在 Mac OS X 系统上仍然如此),它必须以 root 身份运行,因为它需要的信息只能通过 root 可访问的设备(例如 /dev/kmem)或仅限 root 的系统调用获得。这是可以的,因为(除非实现中存在错误)ps程序的编写方式不会让调用者获得他们不应该获得的信息。

其他系统有其他机制可以访问ps需要的信息,因此不需要 set-uid ps二进制文件。值得注意的是,Linux 系统(和其他系统)上的/proc 虚拟文件系统可以以同样细粒度的权限发布非常细粒度的内核信息。这样的模型足以允许非特权ps获得所需的一切,而不允许访问内核信息的更敏感位。