我有两台电脑,一台运行 Xubuntu 12.04,另一台运行 Linux Mint 14。
在 Xubuntu 上:
$ sudo gedit
在另一个终端中:
$ kill [pid of the gedit process]
bash: kill: ([pid]) - Operation not permitted
$ kill [pid of the sudo process]
最后一个命令实际上成功终止了 sudo(以及与之相关的 gedit),尽管 sudo 是以 root(setuid)身份运行的,而普通用户不应该能够终止 root 的进程。但我的猜测是,因为我们自己启动了它,所以我们对它有某种特殊权限。
关于 Mint:
$ sudo gedit
在另一个终端中:
$ kill [pid of the gedit process]
bash: kill: ([pid]) - Operation not permitted
$ kill [pid of the sudo process]
bash: kill: ([pid]) - Operation not permitted
那么为什么我们可以杀死 sudo作为普通用户Xubuntu 上有,但 Mint 上没有?这是什么原因造成的?我该如何改变这种行为?
我是不是寻找终止进程的方法,显然sudo kill
会有效。
答案1
我敢说,这是一个给定进程的实际用户 ID 和有效用户 ID 之间的区别,以及 sudo 在两台机器上的运行方式。
MINT 似乎在 sudo 进程时将有效用户 ID(root)和真实用户 ID(调用进程的用户)都更改为 root。因此,原始用户无法终止 sudo 进程或被 sudo 的进程(gedit)。Xubuntu(以及我的情况中的 Fedora)不会这样做。真实用户 ID 仍然是原始用户。
使用 ps 命令查看用户拥有的进程(实际或有效)。我运行了您的 sudo gedit 命令。ps uaxf
生成了此树:
myuserid 22868 0.0 0.0 163400 4872 pts/2 Ss 13:19 0:00 | \_ -zsh
root 30392 0.0 0.0 205044 3736 pts/2 S+ 13:45 0:00 | | \_ sudo gedit
root 30417 0.0 0.1 699788 23692 pts/2 Sl+ 13:45 0:00 | | \_ gedit
显然,sudo 和 gedit 的有效用户 ID 都是 root,而不是我自己。然后我使用 ps 和 --User 选项(--User userlist 按真实用户 ID(RUID)或名称选择。)来查看进程的真实用户 ID 是谁:
ps --User "myuserid"
这产生了很多输出,但有一行非常突出:
30392 pts/2 00:00:00 sudo
但进程 30417 却明显缺失了......
然后我跑了:
ps --User "root"
这也产生了很多输出,但这一行很突出:
30417 pts/2 00:00:00 gedit
但进程 30392 不存在。
因此,看起来,尽管 sudo 进程 (30392) 的有效所有者是 root,但实际所有者是我,我可以将其终止。另一方面,gedit 进程的有效所有者和实际所有者均为 root,因此我无法(直接)终止它。我猜在 Lint 上,这两个进程的实际所有者和实际所有者均为 root。
我认为这可能会受到stay_setuid选择/etc/sudoers,但对此的描述实际上并没有使这看起来有可能。
您的/etc/sudoersMint 和 Xubuntu 之间的文件?
答案2
这可能最好在评论中发布,但我还不能发表评论。尝试
ps aux | grep sudo
并查看该 sudo 进程的用户(所有者)。 sudo 进程可能以您的用户身份而不是 root 用户身份运行。
我刚刚在我的 Red Hat 系统上尝试过,无法从我的本地普通用户那里终止 sudo 进程,因为它归 root 所有。
答案3
在这两种情况下,以 root 身份运行命令都会终止进程。它在 Mint 中不起作用的原因可能是因为桌面环境中没有像 ?buntu 中那样的“自动提升”管理器。
这个问题并不完全相关,但可接受的答案触及了感知差异的原因。