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_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 中,它仍然显示用户的家。
发生这种情况是因为 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)