我有一个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/Testing中,我得到:
$ 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 开发人员改变了什么?
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 的行为。以下是此答案的旧文本,适用于 19.04 之前的 Ubuntu 版本,包括 18.04 LTS。
Defaults always_set_home
在 Ubuntu 中,为了将 $HOME 环境变量重置为目标用户,必须Defaults set_home
在sudo -s
其/etc/sudoers
.Ubuntu tracker 上的这个 bug 有更多理由说明不在 sudo 中设置 $HOME: https ://bugs.launchpad.net/ubuntu/+source/sudo/+bug/1373495
见评论#4:
这是 Ubuntu 开发人员有意识的决定。
这个答案有更多关于 sudoers 选项的详细信息,例如
always_set_home
: https ://unix.stackexchange.com/a/91572/281844您的问题中还有第二个问题,
sudo echo $HOME
即使在 Debian 中,它仍然显示用户的家。发生这种情况是因为 shell在运行命令
$HOME
之前正在扩展。sudo
所以这:
首先由shell扩展为:
然后 sudo
echo /home/user
以 root 身份执行...这也应该证明差异:
或者获取一个完整的 root shell 并在那里查看环境变量: