Su
為什麼 su 不更改執行它的 shell 的使用者 ID?
相反,它使用新的使用者 ID 啟動一個新的 shell 程序。原來的 shell 被阻塞,直到新的 shell 完成並且 su 退出。為什麼它會這樣工作?
很簡單:因為它不能。沒有系統呼叫來更改另一個程序的 uid。如果您不想讓父 shell 等待
su
退出,請在其前面加上exec
內置命令,這會導致 shell 直接執行而無需先分叉。當然,如果您輸入錯誤的密碼,將無法返回到 shell,因此您的會話將終止。
正如已經指出的那樣,沒有辦法做到這一點。當然,如果有意願,有辦法:沒有這樣的系統呼叫是沒有理由不能完成的。也就是說,正如 mtk 在評論中提到的那樣,想像一下它可能造成的破壞,有一個系統呼叫來改變一個不相關程序的安全上下文。如果不出意外,我看到一個競爭條件在三……二……一……中爆發(我們甚至不開始討論改變安全上下文
init
或getty
可以做什麼。)另一個原因是它
su
不僅呼叫了一個新的 shell。它還能夠控制啟動哪個 shell(使用-s
or--shell
),並通過(在 GNU 中)-
/-l
/--login
和-c
(--command
) 參數傳遞參數來控制它。傳遞給 su 的參數也會對新 shell 的環境產生影響。因此,即使您可以只更改父程序的安全上下文,您也不一定想要這樣做。