
En Ubuntu 12.04, cuando sudo -s
la 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:
- ¿Cómo se hace esto? ¿Dónde está la configuración?
- ¿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.
- En Debian
sudo -s
, cambia la variable $HOME a/root
. Por lo que obtengo de las respuestas yman sudo
el shell ejecutadosudo -s
es el que se proporciona en/etc/passwd
, ¿verdad? - Sin embargo, tanto en Ubuntu como en Debian, el shell proporcionado
/etc/passwd
para root es/bin/bash
. Tampoco puedo encontrar en ninguno de los sistemas dónde está la diferencia en los archivos.profile
o.bashrc
, en lo que respecta a $HOME, por lo que el comportamiento desudo -s
es 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 HOME
variable 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 -s
se conserva HOME
en Ubuntu, mientras que en Debian HOME
se borra y sudo
luego lo configura en el directorio de inicio del usuario de destino.
Puede anular este comportamiento en elsudoers
archivo. Ejecute visudo
para editar el sudoers
archivo. Hay varias opciones relevantes:
env_keep
Determina qué variables de entorno se conservan. ÚseloDefaults env_keep += "HOME"
para conservar laHOME
variable de entorno de la persona que llama oDefaults env_keep -= "HOME"
borrarla (y reemplazarla por el directorio de inicio del usuario de destino).env_reset
determina 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, haceHOME
que se anule incluso si se conservó debido a queenv_reset
estaba deshabilitado oHOME
estaba en laenv_keep
lista. Esta opción no tiene ningún efecto siHOME
no se conserva de todos modos.set_home
es comoalways_set_home
, pero solo se aplica asudo -s
, no cuando se llamasudo
con 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 sudoers
manual para obtener más detalles.
Siempre puedes optar por anular HOME
una llamada determinada sudo
pasando la opción -H
.
El shell nunca anulará el valor de HOME
. (Se armaría HOME
si no estuviera armado, pero sudo
siempre se arma HOME
de una forma u otra).
Si ejecuta sudo -i
, sudo
simula un inicio de sesión inicial. Esto incluye configurar HOME
el directorio de inicio del usuario de destino e invocar unshell de inicio de sesión.
Respuesta2
Úselo sudo -H -i
en lugar de sudo -s
para 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 sudo
y 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 -s
en Ubuntu y Debian respectivamente, puede usar un sudo
contenedor (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"