web-dev-qa-db-ja.com

sudo、runuser、suは、「echo $ HOME」のコマンドを使用して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。
as $ {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.
...
2
nelaaro

接線関係:

Sudo -u someuser -i "echo $HOME"

私にはまったく機能しません。それは言う:

-bash: echo $HOME: command not found

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

Sudo -u someuser -i echo $HOME

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

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

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

このコマンドでは、echo $HOME UIDを切り替えた後、文字通りbashに送信されます。

結果は期待どおりです。

/home/someuser
1
Dennis

あなたがするとき

 su - someuser -c "echo $HOME"

currentシェルは$ HOME firstを展開し、結果はコマンド(この場合はsu)に渡され、次に次のように実行されているシェルプロセスに渡されます。新しいユーザー。

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

 su - someuser -c 'echo $HOME'
3
RedGrittyBrick