$ whoami
admin
$ Sudo -S -u otheruser whoami
otheruser
$ Sudo -S -u otheruser /bin/bash -l -c 'echo $HOME'
/home/admin
bashがログインシェルとして呼び出されたにもかかわらず、$HOME
が/home/otheruser
に設定されないのはなぜですか?
具体的には、/home/otheruser/.bashrc
が提供されていません。また、/home/otheruser/.profile
は提供されていません。 -(/home/otheruser/.bash_profile
は存在しません)
Sudo
を使用してログインシェルを呼び出すには、-i
を使用します。コマンドが指定されていない場合は、ログインシェルプロンプトが表示されます。それ以外の場合は、コマンドの出力が表示されます。
例(ログインシェル):
Sudo -i
例(ユーザーを指定した場合):
Sudo -i -u user
例(コマンドを使用):
Sudo -i -u user whoami
例(ユーザーの$HOME
を印刷):
Sudo -i -u user echo \$HOME
注:バックスラッシュ文字は、ドル記号がターゲットユーザーのシェルに到達し、呼び出し元のユーザーのシェルでは解釈されないことを保証します。
straceを使用して最後の例を確認したところ、何が起こっているかが正確にわかります。以下の出力は、bashへの明示的な呼び出しと同様に、シェルが--login
および指定されたコマンドで呼び出されていることを示していますが、さらに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クライアントがアクセスするログインシェルを作成するため、SSHでは特別なオプションは必要ありません。
あなたはバッシュにクレジットを与えすぎています。すべての「ログインシェル」とは、起動時とシャットダウン時にBashがどのファイルを取得するかを意味します。 $HOME
変数はそれには影響しません。
Bashのドキュメントでは、ログインシェルの意味をさらに詳しく説明しています: https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html#Bash-Startup-Files
実際、Bashは$HOME
を設定するために何もしません。 $HOME
は、シェルを呼び出すもの(ログイン、sshなど)によって設定され、シェルはそれを継承します。シェルを管理者セット$HOME
として開始してからexec-ed bash
、Sudo
を設計した場合でも、要求または構成されていない限り、環境は変更されないため、bash
他のユーザーがシェルから継承したため。
Sudo
で期待どおりに環境をより多く処理したい場合は、Sudoの-i
スイッチを確認してください。試してください:
Sudo -S -u otheruser -i /bin/bash -l -c 'echo $HOME'
Sudoのmanページで詳しく説明されていますが、あまりよくありませんが、次のように思います。 http://linux.die.net/man/8/Sudo