El comando sudo no genera /root/.bashrc

27

He agregado una ruta personalizada a PATH variable en mi archivo /root/.bashrc

Cuando lo hago sudo su; echo $PATH , muestra la entrada, '/ ruta / a / custom / bins'.

Pero yo si sudo sh -c 'echo $PATH' , se nota, /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Las rutas de carpeta agregadas en el archivo .bashrc no son visibles.

¿El comando sudo no tiene el mismo entorno que un usuario root?


fuente

Respuestas:

32

.bashrces un archivo de configuración de bash, solo cuando se ejecuta de forma interactiva. Solo se carga cuando inicia bash, no cuando ejecuta algún otro programa como sh(ni siquiera si se invoca bash a través del nombre sh). Y solo se carga cuando bash es interactivo, no cuando ejecuta un script o un comando con-c .

sudo sh -c 'echo $PATH'o sudo bash -c 'echo $PATH'no invoca un shell interactivo, entonces.bashrc lo que no está involucrado.

sudo su; echo $PATHejecuta una instancia interactiva del shell de root. Si eso es bash, entonces ~root/.bashrcse carga. Este fragmento se ejecuta echo $PATHuna vez que este shell interactivo finaliza, por lo que lo que suceda en el shell interactivo no tiene influencia sobre lo que imprime el fragmento al final. Pero si escribe echo $PATHen el indicador del shell interactivo iniciado por sudo su, verá el valor establecido por ~root/.bashrc.

Dado que .bashrcse invoca en cada shell interactivo, no por shells de inicio de sesión (ni siquiera por shells de inicio de sesión interactivo, que es un defecto de diseño en bash), es el lugar incorrecto para definir variables de entorno. Úselo .bashrcpara configuraciones de bash interactivas, tales como combinaciones de teclas, alias y configuraciones de finalización. Establezca variables de entorno en los archivos que se cargan al iniciar sesión: ~/.pam_environmento~/.profile .

Así que establece PATH en .profilelugar de .bashrc, y, o bien ejecutar una shell de entrada con sudo -i 'echo $PATH', o fuente explícitamente .profilecon sudo sh -c '. ~/.profile; echo $PATH'.

Gilles 'SO- deja de ser malvado'
fuente
1
ha abordado muchos puntos relevantes sobre los depósitos ... gracias ....
1
¿Cómo lo agrego .profile? ¿Quieres decir /root/.profileo /home/user/.profile? Traté de agregar export PATH=$PATH:/mydira ambos. No funcionó Lo intenté sin exporteso tampoco funcionó.
falsePockets
@falsePockets ¿No funcionó para qué? Debe hacer una nueva pregunta y explicar exactamente lo que está haciendo.
Gilles 'SO- deja de ser malvado'
Lo que no funcionó es exactamente lo mismo que OP está tratando de hacer. Estoy tratando de agregar un directorio a la RUTA de mi superusuario. No debería hacer una nueva pregunta, ya que esa pregunta sería un duplicado de esta pregunta.
falsePockets
@falsePockets Pero evidentemente no está haciendo lo mismo para llegar a la cuenta de superusuario. Y como no dijiste lo que estás haciendo, no puedo ayudarte más que repetir lo que ya está en mi respuesta.
Gilles 'SO- deja de ser malvado'
14

Mira el -Ey-i opciones .

-E: Indica a la política de seguridad que el usuario desea preservar sus variables de entorno existentes. La política de seguridad puede devolver un error si el usuario no tiene permiso para preservar el entorno.

-i: Ejecute el shell especificado por la entrada de la base de datos de contraseñas del usuario objetivo 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 a través de la opción -c del shell. Si no se especifica ningún comando, se ejecuta un shell interactivo. sudo intenta cambiar al directorio de inicio de ese usuario antes de ejecutar el shell. El comando se ejecuta con un entorno similar al que recibiría un usuario al iniciar sesión. La sección Entorno del comando en el manual de sudoers (5) documenta cómo la opción -i afecta el entorno en el que se ejecuta un comando cuando la política de sudoers es en uso.

Vinz
fuente
3

Podría hacerlo sudo bash, lo que sí lee los basharchivos de inicio como se documenta en la bashpágina del manual / documentación. Sin embargo, tenga en cuenta que es posible que no establezca la HOMEvariable de entorno correctamente. Esto se puede solucionar en el basharchivo de inicio de todo el sistema (en /etc, la ubicación exacta depende de la distribución): pruebe si $uides 0.

Ned64
fuente