
¿Qué le sucede al medio ambiente cuando ejecuta "su -c"?
La razón por la que pregunto es este comportamiento misterioso:
bash$ which firefox
/usr/local/bin/firefox
bash$ su - user -c "echo $PATH"
bin:/usr/bin:/sbin:/usr/sbin:/opt/java/bin:/usr/local/bin:...
bash$ su - user -c "firefox ..."
-bash: firefox: command not found
¿Algunas ideas?
Respuesta1
Lo que está viendo es el hecho de que $PATH
se expande en el shell del primer usuario durante el procesamiento de argumentos, antes de que su(1)
se ejecute el comando, por lo que parece que siempre lo hace. Si usa comillas duras ( 'echo $PATH'
), debería ver algo diferente, o simplemente hacer \$
.
Esto preservará la $PATH
sintaxis hasta que su(1)
se ejecute el comando. Aunque normalmente no interfiere con el entorno, sí inicia un nuevo shell, por lo que deberías comprobar si PATH=
hay líneas en los distintos scripts de inicio del shell.
Tienes su(1)
una -c
opción, por lo que parecería que estás en Linux. En una Mac o BSD, obtendría un inicio de sesión simplificado PATH
en lugar del inicio de sesión PATH
, pero aún tendría el mismo mensaje "¿cuándo expandí la RUTA?" asunto.
Respuesta2
Cuando se utiliza su -
o su -l
, emula una sesión de inicio de sesión, lo que implica restablecer el entorno a un estado limpio.
En Arch Linux, su -
utiliza la cadena codificada /usr/ucb:/bin:/usr/bin:/etc
como nuevo archivo $PATH
. En otros sistemas, puede leer ENV_SUPATH
desde /etc/login.defs
, o depender de PAM para configurar el entorno.
su ... "echo $PATH"
miente, porque la $PATH
parte se expande por su shell actual, mucho antes de que su
se lance. Utilice su ... 'echo $PATH'
en su lugar (tenga en cuenta las comillas simples) o su - -c env
(imprime el entorno completo).