Ubuntu 和 Debian 如何为具有 sudo 权限的用户管理 $HOME?

cec*_*emi 39 bash ubuntu debian sudo home

我有一个myhome.sh只包含一行的 bash 脚本:

echo $HOME
Run Code Online (Sandbox Code Playgroud)

脚本的所有者是一个用户:

$ ls -l myhome.sh
-rw-rw-r-- 1 user user <date> <time> myhome.sh
Run Code Online (Sandbox Code Playgroud)

Ubuntu 16.04 和 17.10 中,我得到:

$ echo $HOME
/home/user

$ sudo echo $HOME
/home/user

$ bash myhome.sh
/home/user

$ sudo bash myhome.sh
/home/user
Run Code Online (Sandbox Code Playgroud)

Debian Buster/Testing我得到:

$ echo $HOME
/home/user

$ sudo echo $HOME
/home/user

$ bash myhome.sh
/home/user

# WHY ?
$ sudo bash myhome.sh
/root
Run Code Online (Sandbox Code Playgroud)

我不明白为什么在 Debian 的脚本中,如果它是用 sudo 执行的,我总是$HOME=/root在 Ubuntu 中得到$HOME=/home/user. 有谁知道 Ubuntu 开发人员改变了什么?

fil*_*den 68

Debian 和 Ubuntu 都提供了一个/etc/sudoers包含的文件Defaults env_reset,用于重置环境变量。

但是, 的行为从不触摸env_reset更改为将其重置为目标用户的家。$HOME

在 19.04 之前的版本中,Ubuntu 已经修补了他们的版本sudo以保持以前的行为(不改变$HOME):https : //bugs.launchpad.net/ubuntu/+source/sudo/+bug/760140

这在 19.10 中被撤消,从那时起,Ubuntu 会做上游sudo和所有其他 Linux 发行版所做的事情,并更改$HOME为目标用户的内容。有关所有详细信息,请参阅 askubuntu.com 上的此问答:自 19.10 以来,sudo 如何以不同方式处理 $HOME?. 早期版本没有进行逆转,因此 18.04 LTS 仍然具有 Ubuntu 特定的行为。


以下是此答案的旧文本,适用于 Ubuntu 版本高达 19.04,包括 18.04 LTS。

在Ubuntu中,以$ HOME环境变量重置为目标用户,一个人或者设置Defaults always_set_homeDefaults set_home(在这种情况下,只有sudo -s将回家更新)在他们的/etc/sudoers

Ubuntu 跟踪器上的这个错误对于不在 sudo 中设置 $HOME 有更多的理由:https : //bugs.launchpad.net/ubuntu/+source/sudo/+bug/1373495

见评论#4:

如果 HOME 被删除,那么例如 vim、bash 等,将使用 /root/.vimrc、/root/.bashrc 等而不是用户的 ~/.vimrc、~/.bashrc 等。虽然这是一个坏主意要通过 sudo 运行 X 客户端,它们也可能会在错误的位置查找配置文件,并且如果 X11 客户端针对错误的 .Xauthority 文件,它们甚至可能无法连接到 X11 服务器。

这是 Ubuntu 开发人员有意识的决定。

此答案包含有关 sudoers 选项的更多详细信息,例如always_set_homehttps : //unix.stackexchange.com/a/91572/281844


你的问题还有第二个问题,sudo echo $HOME即使在 Debian 中,它仍然显示用户的家。

发生这种情况是因为 shell$HOME 运行sudo命令之前正在扩展。

所以这:

$ sudo echo $HOME
Run Code Online (Sandbox Code Playgroud)

首先由外壳扩展为:

$ sudo echo /home/user
Run Code Online (Sandbox Code Playgroud)

然后 sudoecho /home/user以 root 身份执行...

这也应该证明差异:

$ sudo bash -c 'echo $HOME'
/root
Run Code Online (Sandbox Code Playgroud)

或者获取一个完整的 root shell 并在那里查看环境变量:

$ sudo -s
# echo $HOME
/root
Run Code Online (Sandbox Code Playgroud)

  • filbranden 在 [vi.se] 上似乎仍然很活跃,但是是的,我本来可以编辑自己的,但当时我在玩手机。谢谢@ilkkachu! (2认同)