sudo -uは$ HOME / .profileにパスを追加しません。

sudo -uは$ HOME / .profileにパスを追加しません。

root権限を必要とするスクリプトがあります。私は実行スクリプトを使用しますsudo ./script.sh。スクリプトの一部は実際に元のユーザーとして実行する必要があるため、sudo --user=$SUDO_USERスクリプト内でそれを使用して操作を実行します。私が経験している問題は、ユーザーのためにいくつかのユーティリティがインストールされていて、そのパスが私に追加されることです~/.profile。 sudo で実行すると ~/.profile が実行されないようです。確認されましたsudo --user=$SUDO_USER echo $PATH

$HOME/.profileをインポートしてこの問題を解決できますが、これは正しい解決策ではないようです。

sudo --user=$SUDO_USER source $HOME/.profile; command_i_want_to_run

状況に関係なく使用できるように、別のファイルに$ PATHを追加する必要がありますか?

答え1

ローカルのsudoersポリシーに依存するかどうかはわかりませんが、少なくとも私のUbuntuシステムでは、sudoまたは-iオプションを使用して--loginログインシェルを指定できます。

 -i, --login
             Run the shell specified by the target user's password data‐
             base entry as a login shell.  This means that login-specific
             resource files such as .profile or .login will be read by the
             shell.

例えば

$ sudo sudo -u steeldriver sh -c 'echo $PATH'
[sudo] password for steeldriver: 
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

しかし、

$ sudo sudo -iu steeldriver sh -c 'echo $PATH'
/home/steeldriver/bin:/home/steeldriver/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

答え2

bashrc同様の設定ファイルが得られない理由は、sudoがシェルを実行しないためです。実際にプロセスを分岐して他のタスクを実行するので、必ずしもシェルに関連するわけではありません。この記事をもっと詳しく知りたい場合は、Process model検索してみてくださいman sudo

私はあなたが選ぶことができる2つの合理的なオプションを考えることができます。

  1. sudoにログインシェルを使用するように指示できます。
  2. sudoを使用してbashを実行し、bashをログインシェルとして指定できます。

どちらも少し異なる方法で同じ目標を達成します。

オプション1: sudo --user=baam -i echo '$PATH'sudoにデフォルトのシェルを起動しbaamて実行するように指示しますecho $PATH。元のコマンドの引用符を参照してください。$PATHそれ以外の場合は拡張されます。今後バッシュがそれを見た。

オプション2: sudo --user=baam bash -c -l 'echo $PATH'bashはsudoを使用して実行されます。この-lフラグはbashにログインシェルとして機能するように指示するので、このフラグをサポートする他のシェル(たとえば)を指定することもできます.profile-lzsh

関連情報