sudo、runuser、su は、コマンド「echo $HOME」を使用して root として実行した場合に期待どおりに動作しません。

sudo、runuser、su は、コマンド「echo $HOME」を使用して root として実行した場合に期待どおりに動作しません。

これらのコマンドを実行すると、次のように出力されます。/root

$ sudo -u someuser -i "echo $HOME"
/root
$ runuser -l someuser -c "echo $HOME"
/root    
$ su - someuser -c "echo $HOME"
/root

私が期待していたのは

/home/someuser

env コマンドを実行して環境を検査すると、HOME 変数が正しく報告されます。

$ su - someuser -c "env"
...  
HOME=/home/someuser
...

$ sudo -u someuser -i "env"  
...  
HOME=/home/someuser
...

$ runuser -l someuser -c "env"  
...  
HOME=/home/someuser
...  

私がやりたいのは、ユーザーのホームディレクトリ /home/someuser/scripts の下のスクリプトを
${HOME}/scripts/somescript.sh として 実行することです。

$ sudo -u someuser  ${HOME}/scripts/somescript.sh
sudo: /root/scripts/somescript.sh: command not found  

私が期待していたのは:

$ sudo -u someuser  ${HOME}/scripts/somescript.sh
...
script output.
...

答え1

関連:

sudo -u someuser -i "echo $HOME"

私には全く機能しません。次のように書かれています:

-bash: echo $HOME: command not found

要点:コマンドを実行すると

sudo -u someuser -i echo $HOME

sudo が実行される前に、変数は$HOMEシェルによって展開されます。

これを解決するには、次のようなコマンドを使用します。

sudo -u someuser -i bash -c 'echo $HOME'

このコマンドでは、echo $HOMEUID を切り替えた後に、そのまま bash に送信されます。

結果は予想通りです:

/home/someuser

答え2

そうすると

 su - someuser -c "echo $HOME"

現在シェルは$HOMEを展開します初め、結果はコマンド(suこの場合は)に渡され、そこから新しいユーザーとして実行されているシェル プロセスに渡されます。

変数を一重引用符で保護してみてください

 su - someuser -c 'echo $HOME'

関連情報