Bash

sudo 作為另一個使用者使用他們的環境

  • November 3, 2019
$ 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 客戶端訪問。

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