Как Ubuntu и Debian управляют $ HOME для пользователей с привилегиями sudo?

38

У меня есть скрипт 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?

ceccoemi
источник

Ответы:

67

И Debian, и Ubuntu поставляют /etc/sudoersфайл, который содержит Defaults env_reset, который сбрасывает переменные окружения.

Тем не менее, поведение env_resetбыло изменено с не касаясь $ HOME, чтобы сбросить его на дом целевого пользователя.

Ubuntu решила исправить их версию, sudoчтобы сохранить прежнее поведение: https://bugs.launchpad.net/ubuntu/+source/sudo/+bug/760140

В Ubuntu, чтобы сбросить переменную среды $ HOME для целевого пользователя, нужно установить либо их, Defaults always_set_homeлибо Defaults set_home(в этом случае только sudo -sHOME обновится) /etc/sudoers.

Эта ошибка в трекере Ubuntu имеет еще несколько причин, по которым не нужно устанавливать $ HOME в sudo: https://bugs.launchpad.net/ubuntu/+source/sudo/+bug/1373495

Смотрите комментарий № 4:

Если HOME удален, то, например, vim, bash и т. Д. Будет использовать /root/.vimrc, /root/.bashrc и т. Д., А не ~ / .vimrc, ~ / .bashrc и т. Д. Хотя это плохая идея чтобы запускать X-клиенты через sudo, они также, вероятно, будут искать неправильные места для файлов конфигурации, и есть вероятность, что клиенты X11 могут даже не иметь возможности подключиться к серверу X11, если они нацелены на неправильный файл .Xauthority.

Это сознательное решение разработчиков Ubuntu.

Этот ответ содержит более подробную информацию о параметрах sudoers, таких как always_set_home: https://unix.stackexchange.com/a/91572/281844


В вашем вопросе есть вторая проблема, которая по- sudo echo $HOMEпрежнему отображает домашнюю страницу пользователя даже в Debian.

Это происходит потому, что оболочка расширяется $HOME перед запуском sudoкоманды.

Итак, это:

$ sudo echo $HOME

Сначала расширяется оболочкой в:

$ sudo echo /home/user

И тогда sudo выполняется echo /home/userкак root ...

Это также должно продемонстрировать разницу:

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

Или получите полноценную корневую оболочку и посмотрите там переменную окружения:

$ sudo -s
# echo $HOME
/root
filbranden
источник