相反,它使用新的用户 ID 启动一个新的 shell 进程。原始 shell 会被阻止,直到新 shell 完成并 su 退出。为什么会这样呢?
答案1
很简单:因为它不能。没有系统调用来更改另一个进程的 uid。如果您不想让父 shell 等待su
退出,请在其前面加上exec
内置命令,这会导致 shell 直接执行而无需先分叉。当然,如果您输入的密码错误,则不会有 shell 可返回,因此您的会话将终止。
答案2
正如已经指出的那样,没有办法做到这一点。当然,如果有意愿,就有办法:没有这样的系统调用并不是它的理由不能做完了。也就是说,正如 mtk 在评论中提到的想象一下,使用系统调用来更改不相关进程的安全上下文可能会造成严重破坏。如果不出意外的话,我会看到竞争条件在三...二...一...中爆发(我们甚至不开始了解更改init
or的安全上下文getty
可以做什么。)
一其他原因是su
不仅调用一个新的 shell。它还能够控制启动哪个 shell(使用-s
或--shell
),并通过(在 GNU 中)/ -
/-l
和--login
( -c
)--command
参数传递参数来控制它。传递给 su 的参数也会对新 shell 的环境产生影响。所以即使你可以只需更改父进程的安全上下文,您不一定想这样做。