如果使用sudo,为什么$ HOME不更改?


15

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

nbest @ geo:〜$ sudo -H -u tanum echo $ HOME
/ home / nbest
nbest @ geo:〜$ sudo -u tanum echo $ HOME
/ home / nbest
nbest @ geo:〜$ sudo -i -u tanum echo $ HOME
/ home / nbest
nbest @ geo:〜$ sudo -H -i -u tanum echo $ HOME
/ home / nbest

这可以让我说:

sudo -u tanum ls ~

并获取目标用户的主目录列表。并非如此。这是由env_resetin中的默认值引起的sudoers吗?

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

如果不是,-H的预期作用是什么?

请让我挺直。

Answers:


16

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

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

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

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


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

nbest@geo:~$ sudo -H -u tanum sh -c 'echo $HOME'

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


另一种替代方法是使用~username,无需使用sudo或即可将其扩展到该用户的家中su。尝试:

nbest@geo:~$ echo ~tanum

1
当然。多么尴尬! sudo do what I mean
尼尔·贝斯特

1
这对我不起作用。例如,sudo -H -u buildbot bash -c "echo $HOME"给我/home/ubuntu,这是某些Ubuntu映像上的默认用户。
塞林

@Cerin使用单引号防止扩展:sh -c 'echo $HOME'
Andrea Corbellini

3

请试试:

sudo -H -u tanum bash -c 'echo $HOME'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.