當我運行這些命令時,它輸出如圖所示。 /根
$ 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'