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


39

У мене є скрипт 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 / Тестування я отримую:

$ 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?

Відповіді:


68

І Debian, і Ubuntu доставляють /etc/sudoersфайл, який містить Defaults env_reset, який скидає змінні середовища.

Однак поведінку програми env_resetбуло змінено: не торкатися $ HOME до скидання її до дому цільового користувача.

Ubuntu вирішив виправити свою версію, sudoщоб зберегти попередню поведінку: https://bugs.launchpad.net/ubuntu/+source/sudo/+bug/760140

Для відновлення змінної середовища $ HOME на цільового користувача в Ubuntu потрібно встановити Defaults always_set_homeабо Defaults set_home( або в такому випадку sudo -sоновити HOME) у своїх /etc/sudoers.

Ця помилка в трекері Ubuntu має ще одне обгрунтування щодо встановлення $ HOME в судо: 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.