问题描述
我有一个仅包含一行的bash脚本myhome.sh
:
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都附带一个包含Defaults env_reset
的/etc/sudoers
文件,该文件将重置环境变量。
但是,env_reset
的行为从不触摸$ HOME更改为将其重置为目标用户的家。
Ubuntu决定修补其版本的sudo
,以保持以前的行为:https://bugs.launchpad.net/ubuntu/+source/sudo/+bug/760140
在Ubuntu中,为了将$ HOME环境变量重置为目标用户,必须在其/etc/sudoers
中设置Defaults always_set_home
或Defaults set_home
(在这种情况下,只有sudo -s
会更新HOME)。
Ubuntu跟踪器中的此错误在不设置sudo中的$ HOME时具有更多原理:https://bugs.launchpad.net/ubuntu/+source/sudo/+bug/1373495
参见评论4:
If HOME is removed, then e.g. vim, bash, etc., will use /root/.vimrc, /root/.bashrc, etc rather than the user’s ~/.vimrc, ~/.bashrc, etc. While it’s a bad idea to run X clients via sudo, they too would likely look in the wrong locations for configuration files, and there’s a chance that X11 clients may not even be able to connect to the X11 server if they are aimed at the wrong .Xauthority file.
这是Ubuntu开发人员的明智决定。
此答案具有有关sudoers选项的更多详细信息,例如always_set_home
:https://unix.stackexchange.com/a/91572/281844
您的问题中还有第二个问题,就是sudo echo $HOME
,即使在Debian中,它仍然显示用户的住所。
发生这种情况是因为 shell 程序在运行sudo
命令之前正在扩展$HOME
。
所以这:
$ sudo echo $HOME
首先由shell扩展为:
$ sudo echo /home/user
然后sudo以root身份执行echo /home/user
…
这也应显示差异:
$ sudo bash -c 'echo $HOME'
/root
或获得完整的root shell并在此处查看环境变量:
$ sudo -s
# echo $HOME
/root