Ubuntu 和 Debian 如何為具有 sudo 權限的使用者管理 $HOME?
我有一個
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:
如果 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
首先由shell擴展為:
$ sudo echo /home/user
然後 sudo
echo /home/user
以 root 身份執行…這也應該證明差異:
$ sudo bash -c 'echo $HOME' /root
或者獲取一個完整的 root shell 並在那裡查看環境變數:
$ sudo -s # echo $HOME /root