Sudo

sudo和su在繼承環境中的區別

  • May 9, 2015
  1. 為什麼命令可以通過sudo繼承父shell程序的環境來執行,而sudo suroot使用者之後的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
  1. 環境是否從父程序繼承到子程序?
  2. root 使用者之後的 shell 程序是否是sudo su前一個使用者的 shell 程序的子程序?

謝謝。

  1. 變數擴展由您的互動式 shell 執行。您正在使用sudo參數echotim. 如果您希望擴展發生在由 呼叫的 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,即您執行命令的shell sudo su

環境變數擴展由 shell 完成,因此您實際執行的命令是“sudo echo tim”。這一切都是在執行 sudo 之前完成的。

引用自:https://unix.stackexchange.com/questions/202337