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


56

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

編集:正確な問題は実際にはhttps://stackoverflow.com/questions/27738224/mkvirtualenv-with-fabric-as-another-user-failsです


この質問に対する解決策は、他の質問も解決します。この状況で他の質問を削除することもできます。
パベルシメルダ

回答:


83

を使用してログインシェルを呼び出すには、を使用sudoします-i。コマンドが指定されていない場合はログインシェルプロンプトが表示され、そうでない場合はコマンドの出力が表示されます。

例(ログインシェル):

sudo -i

例(指定されたユーザー):

sudo -i -u user

例(コマンドを使用):

sudo -i -u user whoami

例(ユーザーの印刷$HOME):

sudo -i -u user echo \$HOME

注:バックスラッシュ文字により、ドル記号がターゲットユーザーのシェルに到達し、呼び出しユーザーのシェルで解釈されないことが保証されます。

最後に、何が起きているのかを正確に伝えるstraceの例を確認しました。以下の出力は、--loginbashの明示的な呼び出しと同様に、指定されたコマンドでシェルが呼び出されていることを示していますが、さらに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で特別なオプションは必要ありません。


2
sudo -i -u user echo \$HOME私にはうまくいきません。出力:$HOME。straceは、あなたと同じ出力を提供します。問題は何ですか?
John_West

アイデアはありません、それはまだ私のために動作します。
パベルシメルダ

10

あなたはBashにあまりにも多くのクレジットを与えています。すべての「ログインシェル」は、Bashにとって、起動時とシャットダウン時にファイルが提供されることを意味します。$HOME変数は、それに理解しません。

Bashのドキュメントでは、ログインシェルの意味をさらに詳しく説明しています。https//www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html#Bash-Startup-Files

実際、Bashは設定$HOMEするために何もしません。$HOMEシェルを起動するもの(ログイン、sshなど)によって設定され、シェルはそれを継承します。admin setとしてシェルを起動し、$HOMEexec-ed bashで起動したものは、他のユーザーがシェルから継承するsudoように、要求または設定しない限り、設計によって環境を変更しませんbash

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

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

sudoのmanページで詳細が説明されていますが、あまりよくありませんが、私は思う:http : //linux.die.net/man/8/sudo


4
$ HOMEはbashによって設定されません-ありがとう、私はそれを知りませんでした。
-user80551

私の答えでstraceを探してください。これは、を/bin/bash -l -c 'echo $HOME'使用するときに自分でコマンドラインをビルドする必要がないことを示しています-i
パベルシメルダ

1
そのsudo構文は私のマシンにエラーを投げました。(su-cオプションを使用しますが、私はそうは思いsudoません。)私は幸運があった:HomeDir=$( sudo -u "$1" -H -s echo "\$HOME" )
palswim

ええ、@ palswimは正しいです。わからない-S(必要なかったので省いた)が、-cここでは動作しません-s。代わりに必要です。
多項式
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.