如果我使用 sudo,为什么 $HOME 不会改变?

Nei*_*est 16 command-line sudo

我希望 -H 选项为我提供目标用户的环境。

nbest@geo:~$ sudo -H -u tanum echo $HOME
/家/nbest
nbest@geo:~$ sudo -u tanum echo $HOME
/家/nbest
nbest@geo:~$ sudo -i -u tanum echo $HOME
/家/nbest
nbest@geo:~$ sudo -H -i -u tanum echo $HOME
/家/nbest

这将允许我说:

sudo -u tanum ls ~
Run Code Online (Sandbox Code Playgroud)

并获取目标用户的主目录列表。不是这样。这是由env_reset默认值引起的sudoers吗?

如果是这样,-H 有什么影响吗?覆盖此行为的最安全方法是什么?

如果不是 -H 的预期效果是什么?

请让我直截了当。

And*_*ini 20

$HOME~通过得到扩展您的外壳,它们不会被解释echo

换句话说,echo$HOME视为论据。它实际上看到了/home/nbest。因此,以下命令正好相同(你的情况):

nbest@geo:~$ sudo -H -u tanum echo $HOME
nbest@geo:~$ sudo -H -u tanum echo /home/nbest
Run Code Online (Sandbox Code Playgroud)

无论你尝试什么 ( -H, -i, ...) 你永远不会获得想要的行为。因为$HOME被您的 shell 替换,并且您的 shell 以您的用户身份运行。sudo不会以任何方式影响您的外壳。


要解决这个“问题”(这实际上是一个功能),您可以启动一个新的子 shell:

nbest@geo:~$ sudo -H -u tanum sh -c 'echo $HOME'
Run Code Online (Sandbox Code Playgroud)

(请注意,我使用单引号来避免扩展。)这样,新 shellsh将以用户tanum运行并打印他的主目录。


另一种选择是使用~username,它可以扩展到该用户的家中,而无需使用sudosu。尝试:

nbest@geo:~$ echo ~tanum
Run Code Online (Sandbox Code Playgroud)