当以 root 身份使用“echo $HOME”命令运行时,sudo、runuser、su 无法按预期工作

当以 root 身份使用“echo $HOME”命令运行时,sudo、runuser、su 无法按预期工作

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

相关内容