Bash
sudo 作為另一個使用者使用他們的環境
$ whoami admin $ sudo -S -u otheruser whoami otheruser $ sudo -S -u otheruser /bin/bash -l -c 'echo $HOME' /home/admin
即使將 bash 作為登錄 shell 呼叫,為什麼也沒有
$HOME
設置為?/home/otheruser
具體來說,
/home/otheruser/.bashrc
沒有被採購。還有,/home/otheruser/.profile
不是貨源。-(/home/otheruser/.bash_profile
不存在)
要呼叫登錄 shell,
sudo
只需使用-i
. 如果未指定命令,您將獲得登錄 shell 提示,否則您將獲得命令的輸出。範例(登錄外殼):
sudo -i
範例(使用指定使用者):
sudo -i -u user
範例(使用命令):
sudo -i -u user whoami
範例(列印使用者的
$HOME
):sudo -i -u user echo \$HOME
注意:反斜杠字元確保美元符號到達目標使用者的 shell,並且不會在呼叫使用者的 shell 中解釋。
我剛剛用strace檢查了最後一個例子,它告訴你到底發生了什麼。下面的輸出顯示 shell 正在
--login
使用指定的命令呼叫,就像您對 bash 的顯式呼叫一樣,但此外sudo可以做自己的工作,比如設置$HOME
.# strace -f -e process sudo -S -i -u user echo \$HOME execve("/usr/bin/sudo", ["sudo", "-S", "-i", "-u", "user", "echo", "$HOME"], [/* 42 vars */]) = 0 ... [pid 12270] execve("/bin/bash", ["-bash", "--login", "-c", "echo \\$HOME"], [/* 16 vars */]) = 0 ...
我注意到您正在使用
-S
,但我認為這通常不是一個好的技術。如果您想以不同的使用者身份執行命令而不從鍵盤執行身份驗證,您可能希望改用 SSH。它適用localhost
於其他主機,也適用於其他主機,並提供無需任何互動式輸入即可工作的公鑰身份驗證。ssh user@localhost echo \$HOME
注意:對於 SSH,您不需要任何特殊選項,因為 SSH 伺服器總是創建一個登錄 shell 以供 SSH 客戶端訪問。