为什么 zsh 可以获得 root 而 bash 却不能?

sne*_*ies 1 bash shell zsh

我有点困惑。如果我将 zsh 复制到 tmp 并更改 Set-UID 位,chmod u+s则更改用户,然后运行复制的 zsh。如果我运行whoami我就会获得 root 权限。如果我对 bash 做同样的事情,那么在运行 bash 后,我会得到我之前登录的用户。他们的行为不同有什么原因吗?

Gor*_*son 5

这是 bash 有意为之的特性;要禁用它,请使用该-p选项运行 bash。

更详细地说:当您运行 setuid 二进制文件时,进程的有效 uid (euid) 将设置为二进制文件的有效 uid,但其真实 uid 不会更改。bash 检测到差异,并且(如果-p未传递该选项)它将其 euid 重置为真实的 uid。

来自bash 手册

使用不相等的有效和真实 UID/GID 进行调用

如果 Bash 启动时有效用户(组)id 不等于真实用户(组)id,并且-p未提供该选项,则不会读取启动文件,shell 函数不会从环境继承,SHELLOPTSBASHOPTSCDPATHGLOBIGNORE变量如果出现在环境中,将被忽略,有效用户 ID 将设置为真实用户 ID。如果-p在调用时提供该选项,则启动行为是相同的,但不会重置有效用户 ID。