Sudo
sudo和su在繼承環境中的區別
- 為什麼命令可以通過
sudo
繼承父shell程序的環境來執行,而sudo su
root使用者之後的shell程序不能?t@ocean:/tmp$ export ME=tim t@ocean:/tmp$ sudo echo $ME tim t@ocean:/tmp$ sudo su root@ocean:/tmp# echo $ME root@ocean:/tmp# exit
- 環境是否從父程序繼承到子程序?
- root 使用者之後的 shell 程序是否是
sudo su
前一個使用者的 shell 程序的子程序?謝謝。
- 變數擴展由您的互動式 shell 執行。您正在使用
sudo
參數echo
和tim
. 如果您希望擴展發生在由 呼叫的 shell 中sudo
,請告訴它執行一個 shell 並將字元串傳遞echo $ME
給該 shell:sudo sh -c 'echo $ME'
sudo
從環境中刪除大多數變數,因為它們在某些情況下可能是安全風險。有關詳細資訊,請參閱手冊和您機器的配置。使用典型配置,變數ME
將從環境中刪除,因此sudo sh -c 'echo $ME'
不會列印任何內容。 2. 程序的環境是其父程序的副本,除非父程序決定更改它。(更準確地說,環境被傳遞給execve
;大多數程序只是通過它們擁有的任何東西。) Sudo 是決定改變環境的程序之一。 3. 如果您執行sudo su
,則執行一個 shell(因為您沒有將命令傳遞給su
)。該shell 程序的父程序是被呼叫的程序sudo
,即您執行命令的shellsudo su
。
環境變數擴展由 shell 完成,因此您實際執行的命令是“sudo echo tim”。這一切都是在執行 sudo 之前完成的。