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_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_home
:
https://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