¿Cómo gestionan Ubuntu y Debian $ HOME para usuarios con privilegios de sudo?

38

Tengo un script bash que myhome.shcontiene solo una línea:

echo $HOME

El propietario del script es un usuario:

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

En Ubuntu 16.04 y 17.10 obtengo:

$ echo $HOME
/home/user

$ sudo echo $HOME
/home/user

$ bash myhome.sh
/home/user

$ sudo bash myhome.sh
/home/user

En Debian Buster / Testing obtengo:

$ echo $HOME
/home/user

$ sudo echo $HOME
/home/user

$ bash myhome.sh
/home/user

# WHY ?
$ sudo bash myhome.sh
/root

No entiendo por qué dentro del script en Debian, si se ejecuta con sudo, siempre obtengo $HOME=/rootmientras estoy en Ubuntu $HOME=/home/user. ¿Alguien sabe qué han cambiado los desarrolladores de Ubuntu?

ceccoemi
fuente

Respuestas:

67

Tanto Debian como Ubuntu envían un /etc/sudoersarchivo que contiene Defaults env_reset, que restablece las variables de entorno.

Sin embargo, el comportamiento de env_resetcambió de no tocar $ HOME a restablecerlo a la página de inicio del usuario objetivo.

Ubuntu decidió parchear su versión sudopara mantener el comportamiento anterior: https://bugs.launchpad.net/ubuntu/+source/sudo/+bug/760140

En Ubuntu, para restablecer la variable de entorno $ HOME al usuario objetivo, uno tiene que configurar uno Defaults always_set_homeo Defaults set_home(en cuyo caso solo sudo -sse actualizará HOME) en su /etc/sudoers.

Este error en el rastreador de Ubuntu tiene más razones para no configurar $ HOME en sudo: https://bugs.launchpad.net/ubuntu/+source/sudo/+bug/1373495

Ver comentario # 4:

Si se elimina HOME, por ejemplo, vim, bash, etc., usará /root/.vimrc, /root/.bashrc, etc. en lugar de ~ / .vimrc, ~ / .bashrc, etc. del usuario. Aunque es una mala idea para ejecutar clientes X a través de sudo, es probable que también busquen archivos de configuración en las ubicaciones incorrectas, y existe la posibilidad de que los clientes X11 ni siquiera puedan conectarse al servidor X11 si están dirigidos al archivo .Xauthority incorrecto.

Es una decisión consciente de los desarrolladores de Ubuntu.

Esta respuesta tiene más detalles sobre las opciones de sudoers como always_set_home: https://unix.stackexchange.com/a/91572/281844


Hay un segundo problema en su pregunta, que es el sudo echo $HOMEque todavía muestra la casa del usuario incluso en Debian.

Eso sucede porque el shell se está expandiendo $HOME antes de ejecutar el sudocomando.

Así que esto:

$ sudo echo $HOME

Primero se expande por el shell en:

$ sudo echo /home/user

Y luego sudo se ejecuta echo /home/usercomo root ...

Esto también debería demostrar la diferencia:

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

O obtenga un shell raíz completo y vea la variable de entorno allí:

$ sudo -s
# echo $HOME
/root
filbranden
fuente