Jak Ubuntu i Debian zarządzają $ HOME dla użytkowników z uprawnieniami sudo?

39

Mam skrypt bash myhome.shzawierający tylko jedną linię:

echo $HOME

Właścicielem skryptu jest użytkownik:

$ ls -l myhome.sh
-rw-rw-r-- 1 user user <date> <time> myhome.sh

W Ubuntu 16.04 i 17.10 otrzymuję:

$ echo $HOME
/home/user

$ sudo echo $HOME
/home/user

$ bash myhome.sh
/home/user

$ sudo bash myhome.sh
/home/user

W Debian Buster / Testing otrzymuję:

$ echo $HOME
/home/user

$ sudo echo $HOME
/home/user

$ bash myhome.sh
/home/user

# WHY ?
$ sudo bash myhome.sh
/root

Nie rozumiem, dlaczego wewnątrz skryptu w Debianie, jeśli jest wykonywany za pomocą sudo, zawsze dostaję się $HOME=/rootw Ubuntu $HOME=/home/user. Czy ktoś wie, co zmienili programiści Ubuntu?

Ceccoemi
źródło

Odpowiedzi:

68

Zarówno Debian, jak i Ubuntu dostarczają /etc/sudoersplik, który zawiera Defaults env_reset, który resetuje zmienne środowiskowe.

Jednak zachowanie env_resetzmieniono z nie dotykania $ HOME na zresetowanie go do domu docelowego użytkownika.

Ubuntu postanowił załatać swoją wersję, sudoaby zachować poprzednie zachowanie: https://bugs.launchpad.net/ubuntu/+source/sudo/+bug/760140

W Ubuntu, aby zresetować zmienną środowiskową $ HOME do użytkownika docelowego, należy ustawić albo Defaults always_set_homealbo Defaults set_home(w takim przypadku sudo -szaktualizowana zostanie tylko HOME) /etc/sudoers.

Ten błąd w narzędziu do śledzenia Ubuntu ma trochę uzasadnienia, że ​​nie ustawiono $ HOME w sudo: https://bugs.launchpad.net/ubuntu/+source/sudo/+bug/1373495

Zobacz komentarz nr 4:

Jeśli program HOME zostanie usunięty, np. Vim, bash itp. Użyje /root/.vimrc, /root/.bashrc itp. Zamiast ~ / .vimrc, ~ / .bashrc użytkownika. Chociaż jest to zły pomysł aby uruchomić klientów X za pośrednictwem sudo, oni również prawdopodobnie szukaliby niewłaściwych lokalizacji dla plików konfiguracyjnych, i istnieje szansa, że ​​klienci X11 mogą nawet nie być w stanie połączyć się z serwerem X11, jeśli są one skierowane na niewłaściwy plik .Xauthority.

Jest to świadoma decyzja deweloperów Ubuntu.

Ta odpowiedź zawiera więcej szczegółów na temat opcji sudoers, takich jak always_set_home: https://unix.stackexchange.com/a/91572/281844


W twoim pytaniu jest drugi problem, sudo echo $HOMEktóry wciąż wyświetla dom użytkownika nawet w Debianie.

Dzieje się tak, ponieważ powłoka rozwija się $HOME przed uruchomieniem sudopolecenia.

Więc to:

$ sudo echo $HOME

Najpierw jest rozszerzany przez powłokę do:

$ sudo echo /home/user

A następnie sudo wykonuje się echo /home/userjako root ...

To również powinno wykazać różnicę:

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

Lub zdobądź pełną powłokę główną i zobacz tam zmienną środowiskową:

$ sudo -s
# echo $HOME
/root
filbranden
źródło