当前位置: 首页>>技术教程>>正文


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

, , , ,

问题描述

我有一个仅包含一行的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_homeDefaults 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_homehttps://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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/11572.html,未经允许,请勿转载。