web-dev-qa-db-ja.com

自分の環境を持つ別のユーザーとしてのsudo

$ 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は存在しません)

64
user80551

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では特別なオプションは必要ありません。

94
Pavel Šimerda

あなたはバッシュにクレジットを与えすぎています。すべての「ログインシェル」とは、起動時とシャットダウン時に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 bashSudoを設計した場合でも、要求または構成されていない限り、環境は変更されないため、bash他のユーザーがシェルから継承したため。

Sudoで期待どおりに環境をより多く処理したい場合は、Sudoの-iスイッチを確認してください。試してください:

Sudo -S -u otheruser -i /bin/bash -l -c 'echo $HOME'

Sudoのmanページで詳しく説明されていますが、あまりよくありませんが、次のように思います。 http://linux.die.net/man/8/Sudo

10
Jeff Snider