$ whoami
admin
$ sudo -S -u otheruser whoami
otheruser
$ sudo -S -u otheruser /bin/bash -l -c 'echo $HOME'
/home/admin
¿Por qué no $HOME
se configura como /home/otheruser
aunque se invoque bash como un shell de inicio de sesión?
Específicamente, /home/otheruser/.bashrc
no se obtiene. Además, /home/otheruser/.profile
no se obtiene. - ( /home/otheruser/.bash_profile
no existe)
bash
sudo
environment-variables
usuario80551
fuente
fuente
Respuestas:
Para invocar un shell de inicio de sesión
sudo
simplemente use-i
. Cuando no se especifica el comando, recibirá un indicador de shell de inicio de sesión; de lo contrario, obtendrá el resultado de su comando.Ejemplo (shell de inicio de sesión):
Ejemplo (con un usuario especificado):
Ejemplo (con un comando):
Ejemplo (usuario de impresión
$HOME
):Nota: El carácter de barra diagonal inversa asegura que el signo de dólar llegue al shell del usuario objetivo y no se interprete en el shell del usuario llamante.
Acabo de comprobar el último ejemplo con strace que te dice exactamente lo que está sucediendo. El siguiente resultado muestra que se llama al shell con
--login
y con el comando especificado, al igual que en su llamada explícita a bash, pero además sudo puede hacer su propio trabajo como configurar el$HOME
.Noté que estás usando
-S
y no creo que sea una buena técnica en general. Si desea ejecutar comandos como un usuario diferente sin realizar la autenticación desde el teclado, puede utilizar SSH en su lugar. Funcionalocalhost
tanto como para otros hosts y proporciona autenticación de clave pública que funciona sin ninguna entrada interactiva.Nota: No necesita ninguna opción especial con SSH ya que el servidor SSH siempre crea un shell de inicio de sesión para que el cliente SSH acceda a él.
fuente
sudo -i -u user echo \$HOME
no funciona para mi Salida:$HOME
. strace da el mismo resultado que el tuyo. ¿Cual es el problema?Le estás dando demasiado crédito a Bash. Todo "shell de inicio de sesión" significa para Bash qué archivos se obtienen al inicio y apagado. La
$HOME
variable no figura en ella.Los documentos de Bash explican un poco más qué significa el shell de inicio de sesión: https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html#Bash-Startup-Files
De hecho, Bash no hace nada para configurar
$HOME
.$HOME
se establece mediante lo que invoca el shell (inicio de sesión, ssh, etc.), y el shell lo hereda. Lo que inició su shell como administrador configurado$HOME
y luego ejecutadobash
,sudo
por diseño, no altera el entorno a menos que se lo pida o configure para hacerlo, de modobash
que otro usuario lo haya heredado de su shell.Si desea
sudo
manejar más del entorno de la manera que espera, mire el-i
interruptor para sudo. Tratar:La página de manual de sudo lo describe con más detalle, aunque no muy bien, creo: http://linux.die.net/man/8/sudo
fuente
/bin/bash -l -c 'echo $HOME'
línea de comando usted mismo cuando lo usa-i
.sudo
sintaxis arrojó un error en mi máquina. (su
usa la-c
opción, pero no creo que losudo
haga). Tuve mejor suerte con:HomeDir=$( sudo -u "$1" -H -s echo "\$HOME" )
-S
(no lo necesitaba, así que lo dejé fuera), pero-c
no funciona aquí, en su-s
lugar lo necesitas .