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つの合理的なオプションを考えることができます。
- sudoにログインシェルを使用するように指示できます。
- 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
。-l
zsh