¿Cómo se configura sudo para que no cambie $HOME en Ubuntu y cómo deshabilitar este comportamiento?

¿Cómo se configura sudo para que no cambie $HOME en Ubuntu y cómo deshabilitar este comportamiento?

En Ubuntu 12.04, cuando sudo -sla variable $HOME no se cambia, por lo que si mi usuario habitual es regularuser, la situación es la siguiente:

$ cd
$ pwd
/home/regularuser
$ sudo -s
# cd
# pwd
/home/regularuser

Dejé Ubuntu hace mucho tiempo, así que no puedo estar seguro, pero creo que este es el comportamiento predeterminado. Entonces, mis preguntas son:

  1. ¿Cómo se hace esto? ¿Dónde está la configuración?
  2. ¿Cómo lo desactivo?

Editar: Gracias por las respuestas, que aclararon un poco las cosas, pero supongo que debo agregar un par de preguntas para obtener la respuesta que estoy buscando.

  1. En Debian sudo -s, cambia la variable $HOME a /root. Por lo que obtengo de las respuestas y man sudoel shell ejecutado sudo -ses el que se proporciona en /etc/passwd, ¿verdad?
  2. Sin embargo, tanto en Ubuntu como en Debian, el shell proporcionado /etc/passwdpara root es /bin/bash. Tampoco puedo encontrar en ninguno de los sistemas dónde está la diferencia en los archivos .profileo .bashrc, en lo que respecta a $HOME, por lo que el comportamiento de sudo -ses diferente. ¿Alguna ayuda con esto?

Respuesta1

Sudo tiene muchas opciones de configuración en tiempo de compilación. Puede enumerar las configuraciones en su versión con sudo -V. Una de las diferencias entre la configuración en Debian wheezy y en Ubuntu 12.04 es que la HOMEvariable de entorno se conserva en Ubuntu pero no en Debian; Ambas distribuciones borran todas las variables de entorno excepto algunas que están marcadas explícitamente como seguras de conservar. Por lo tanto , sudo -sse conserva HOMEen Ubuntu, mientras que en Debian HOMEse borra y sudoluego lo configura en el directorio de inicio del usuario de destino.

Puede anular este comportamiento en elsudoersarchivo. Ejecute visudopara editar el sudoersarchivo. Hay varias opciones relevantes:

  • env_keepDetermina qué variables de entorno se conservan. Úselo Defaults env_keep += "HOME"para conservar la HOMEvariable de entorno de la persona que llama o Defaults env_keep -= "HOME"borrarla (y reemplazarla por el directorio de inicio del usuario de destino).
  • env_resetdetermina si las variables de entorno se restablecen en absoluto. Restablecer las variables de entorno suele ser necesario para las reglas que permiten ejecutar un comando específico, pero no tiene un beneficio de seguridad directo para las reglas que permiten ejecutar comandos arbitrarios de todos modos.
  • always_set_home, si está configurado, hace HOMEque se anule incluso si se conservó debido a que env_resetestaba deshabilitado o HOMEestaba en la env_keeplista. Esta opción no tiene ningún efecto si HOMEno se conserva de todos modos.
  • set_homees como always_set_home, pero solo se aplica a sudo -s, no cuando se llama sudocon un comando explícito.

Estas opciones se pueden configurar para un usuario de origen determinado, un usuario de destino determinado o un comando determinado; consulte el sudoersmanual para obtener más detalles.

Siempre puedes optar por anular HOMEuna llamada determinada sudopasando la opción -H.

El shell nunca anulará el valor de HOME. (Se armaría HOMEsi no estuviera armado, pero sudosiempre se arma HOMEde una forma u otra).

Si ejecuta sudo -i, sudosimula un inicio de sesión inicial. Esto incluye configurar HOMEel directorio de inicio del usuario de destino e invocar unshell de inicio de sesión.

Respuesta2

Úselo sudo -H -ien lugar de sudo -spara obtener un shell raíz de inicio de sesión interactivo:

sudo -H -i
cd
pwd -P  #  /private/var/root  (on Mac OS X 10.6.8)

De man sudo:

-H      The -H (HOME) option sets the HOME environment variable to
        the homedir of the target user (root by default) as
        specified in passwd(5).  By default, sudo does not modify
        HOME (see set_home and always_set_home in sudoers(5)).

Respuesta3

Esto tiene poco que ver con el comportamiento sudoy mucho con la diferencia entre un "shell de inicio de sesión" y un "shell sin inicio de sesión". La solución rápida es

$ sudo -i

como se puede ver con:

$ sudo -s
# id
uid=0(root) gid=0(root) groups=0(root)
# echo $HOME
/home/msw
# exit
$ sudo -i
# echo $HOME
/root
# pwd
/root

Como se indica en el manual de sudo:

La opción -i (simular inicio de sesión inicial) ejecuta el shell especificado por la entrada de la base de datos de contraseñas del usuario de destino como un shell de inicio de sesión. Esto significa que el shell leerá los archivos de recursos específicos de inicio de sesión, como .profile o .login. Si se especifica un comando, se pasa al shell para su ejecución mediante la opción -c del shell. Si no se especifica ningún comando, se ejecuta un shell interactivo.

Respuesta4

Para deshacerse del comportamiento diferente sudo -sen Ubuntu y Debian respectivamente, puede usar un sudocontenedor (respuesta a la pregunta 4):

sudos() {
   local PATH="$(getconf PATH)" root_homedir
   root_homedir="$(sudo -H sh -c 'printf "%s" "$HOME"')"
   sudo sh -c 'export HOME="$0"; exec sh -i' "$root_homedir"
   return 0
}

sudo -k
sudos
{
logname
whoami
id -un
id -ur
echo "PATH: $PATH"
}
exit
echo "PATH: $PATH"

información relacionada