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

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

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

echo $HOME

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

$ ls -l myhome.sh
-rw-rw-r-- 1 user user <date> <time> myhome.sh

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

Debian Buster/测试我得到:

$ echo $HOME
/home/user

$ sudo echo $HOME
/home/user

$ bash myhome.sh
/home/user

# WHY ?
$ sudo bash myhome.sh
/root

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

答案1

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_home其.Defaults set_homesudo -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 中,它仍然显示用户的主页。

发生这种情况是因为外壳正在膨胀$HOME 运行sudo命令。

所以这:

$ sudo echo $HOME

首先被 shell 扩展为:

$ sudo echo /home/user

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

这也应该证明了差异:

$ sudo bash -c 'echo $HOME'
/root

或者获取完整的 root shell 并查看其中的环境变量:

$ sudo -s
# echo $HOME
/root

相关内容