有效与真实用户 ID :为什么在我的示例中它不返回 root 作为有效 ID?

有效与真实用户 ID :为什么在我的示例中它不返回 root 作为有效 ID?

我读了一些关于真实用户 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( root0),这是预期的。为什么有效 UID 为bashroot1000 ( 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 提示符是#而不是$

相关内容