質問: 自分の環境を持つ別のユーザーとしての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は存在しません)
回答: 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では特別なオプションは必要ありません。