$ 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
存在しない)
答え1
ログインシェルを呼び出すには、sudo
を使用します-i
。コマンドを指定しない場合はログインシェルプロンプトが表示され、それ以外の場合はコマンド出力が表示されます。
はい(ログインシェル):
sudo -i
はい(指定されたユーザーを使用):
sudo -i -u user
はい(コマンドを含む):
sudo -i -u user whoami
はい(ユーザーの印刷$HOME
):
sudo -i -u user echo \$HOME
注:バックスラッシュ文字は、ドル記号がターゲットユーザーのシェルに到達し、呼び出されるユーザーのシェルから解釈されないようにします。
最後の例を確認しました。ストレス何が起こったのか正確に教えてくれます。以下の出力は、--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サーバーは常にSSHクライアントにアクセスできるログインシェルを作成するため、特別なオプションは必要ありません。
答え2
あなたはBashをとても信頼しています。 Bashのすべての「ログインシェル」は、起動時と終了時に取得されるファイルです。この$HOME
変数は含まれません。
Bashのドキュメントでは、ログインシェルが何であるかを詳しく説明します。https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html#Bash-Startup-Files
$HOME
実際、Bashは何の設定もまったく行いません。$HOME
シェルを呼び出すすべてのもの(ログイン、SSHなど)によって設定され、シェルはそれを継承します。$HOME
adminでシェルを起動してexec-edすることに関係なくbash
、他のユーザーがシェルから継承するようにsudo
要求または構成されていない限り、設計上の環境は変更されません。bash
予想される方法でより多くの環境を処理するには、sudoスイッチをsudo
見てください。-i
努力する:
sudo -S -u otheruser -i /bin/bash -l -c 'echo $HOME'
sudo のマニュアルページにこれについての詳細が記載されていますが、それほど良くありません。http://linux.die.net/man/8/sudo
答え3
sudo -u www-data bash -i -c "env"
-i
bashがインタラクティブに実行されるように指示するこのフラグを参照してください。
www-data
このコマンドは、(たとえば)env
コマンドが実行されているユーザーに対して対話型bashシェルを実行します。
ユーザーがwww-data
持っていてもログインできませんシェルをデフォルトのシェルとして使用します。