我读了一些关于真实用户 ID 和有效用户 ID 之间的区别的文章。我以为我明白了,但我有一个疑问:根据我的理解,在下面的示例中,命令$ id -un
应该返回root
为有效用户,而不是jack
:
$ sudo cp /usr/bin/bash /usr/bin/bashroot
$ sudo chmod u+s /usr/bin/bashroot
$ ls -l /usr/bin/bashroot
-rwsr-xr-x 1 root root 1234376 oct. 25 15:42 /usr/bin/bashroot
$ bashroot
$ id -un
jack
$ id -unr
jack
bashroot
已经 setuid 并属于root
,所以根据我的理解我预计$ id -un
会返回root
,而不是jack
。
我想念什么?
[编辑] 更具体地说,既然两者都有 setuid ,为什么/usr/bin/bashroot
行为不像?/usr/bin/passwd
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 63960 févr. 7 2020 /usr/bin/passwd
$ ls -l /usr/bin/bashroot
-rwsr-xr-x 1 root root 1234376 oct. 25 15:42 /usr/bin/bashroot
$ passwd
Changing password for jack.
Current password:
然后,在另一个终端中:
$ bashroot
$ ps -a | grep passwd
1682362 pts/3 00:00:00 passwd
$ ps -eo pid,ruid,euid | grep 1682362
1682362 1000 0
$ ps -a | grep bashroot
1682405 pts/4 00:00:00 bashroot
$ ps -eo pid,ruid,euid | grep 1682405
1682405 1000 1000
的有效 UID 为passwd
( root
0),这是预期的。为什么有效 UID 为bashroot
1000 ( jack
) 而不是root
?
[编辑2:操作系统]
$ cat /etc/debian_version
11.6
$ uname -a
Linux d11work 5.10.0-20-amd64 #1 SMP Debian 5.10.158-2 (2022-12-13) x86_64 GNU/Linux
$ bash --version
GNU bash, version 5.1.4(1)-release (x86_64-pc-linux-gnu)
[编辑3]参见斯蒂芬·基特的回答:
$ bashroot -p
# id -un
root
# id -unr
jack
答案1
Bash 强制执行此操作:如果它是 setuid,但未运行在特权模式下(查找-p
),它将有效用户 ID 设置为真实用户 ID:
如果 shell 启动时有效用户(组)id 不等于真实用户(组)id,并且
-p
未提供该选项,则执行这些操作并将有效用户 id 设置为真实用户 id。如果-p
在启动时提供该选项,则不会重置有效用户 ID。关闭此选项会导致有效用户和组 ID 设置为真实用户和组 ID。
为了获得您想要的效果,您需要运行bashroot -p
.您会立即注意到差异:shell 提示符是#
而不是$
。