當以 root 身分執行命令「echo $HOME」時,sudo、runuser、su 無法按我的預期工作

當以 root 身分執行命令「echo $HOME」時,sudo、runuser、su 無法按我的預期工作

當我運行這些命令時,它輸出如圖所示。 /根

$ 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

$HOME在執行 sudo 之前,shell 會擴展該變數。

為了解決這個問題,你可以使用類似的指令

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

在此命令中,echo $HOME在切換 UID 後按字面意思發送到 bash。

結果如預期:

/home/someuser

答案2

當你這樣做時

 su - someuser -c "echo $HOME"

目前的shell 擴充 $HOME第一的,然後將結果傳遞給命令(su在本例中),然後傳遞給以新使用者身分執行的 shell 進程。

嘗試用單引號保護變量

 su - someuser -c 'echo $HOME'

相關內容