Bash

Ubuntu 和 Debian 如何為具有 sudo 權限的使用者管理 $HOME?

  • March 30, 2021

我有一個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_homesudo -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_homehttps ://unix.stackexchange.com/a/91572/281844


您的問題中還有第二個問題,sudo echo $HOME即使在 Debian 中仍然顯示使用者的家。

發生這種情況是因為 shell在執行命令$HOME 之前正在擴展。sudo

所以這:

$ sudo echo $HOME

首先由shell擴展為:

$ sudo echo /home/user

然後 sudoecho /home/user以 root 身份執行…

這也應該證明差異:

$ sudo bash -c 'echo $HOME'
/root

或者獲取一個完整的 root shell 並在那裡查看環境變數:

$ sudo -s
# echo $HOME
/root

引用自:https://unix.stackexchange.com/questions/438564