当我运行这些命令时,它会输出如下所示的内容。/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
$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'