En mi VM Fedora, cuando ejecuto mi cuenta de usuario, tengo /usr/local/bin
en mi ruta:
[justin@justin-fedora12 ~]$ env | grep PATH
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/justin/bin
Y del mismo modo cuando se ejecuta su
:
[justin@justin-fedora12 ~]$ su -
Password:
[root@justin-fedora12 justin]# env | grep PATH
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/justin/bin
Sin embargo, cuando se ejecuta vía sudo
, este directorio no está en la ruta:
[root@justin-fedora12 justin]# exit
[justin@justin-fedora12 ~]$ sudo bash
[root@justin-fedora12 ~]# env | grep PATH
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/sbin:/bin:/usr/sbin:/usr/bin
¿Por qué la ruta sería diferente cuando se ejecuta vía sudo
?
sudo
preservar $ PATH?Respuestas:
Echa un vistazo a
/etc/sudoers
. El archivo predeterminado en Fedora (así como en RHEL, y también Ubuntu y similares) incluye esta línea:Lo que garantiza que su ruta esté limpia cuando ejecute binarios en sudo. Esto ayuda a proteger contra algunas de las preocupaciones señaladas en esta pregunta . También es conveniente si no tiene
/sbin
y/usr/sbin
en su propio camino.fuente
/usr/local/bin
esta directiva , la vería en mi camino cuando la ejecutesudo
, ¿verdad?/usr/local/bin
. ¡Muchas gracias por explicar esto!sudo
por ejemplo, un script en su~/bin
(o cualquier ruta que use)? Acabo de hacer el cambio, ¿funciona, solo pensé que podría haber un lado negativo?El comando
su -
ejecutará el perfil de los usuarios raíz y tomará el entorno de ese usuario, incluida la ruta, etc.,sudo
no lo hace.Si desea
sudo
comportarse asísu -
, use la opciónsudo -i [command
que ejecutará el perfil del usuarioSi desea
su -
comportarse asísudo
, no use el guión, solo usesu [command]
fuente
Puede verificar por qué (es diferente) ejecutando
sudo sudo -V
.Por ejemplo, en Linux ejecuta:
Nota: en MacOS / BSD, basta con ejecutar:
sudo sudo -V
.La lista anterior está restringida debido al complemento de política de seguridad predeterminado en algunas distribuciones de Linux.
Esto se explica más detalladamente en
man sudoers
:Si ese es el caso, puede cambiar eso ejecutando
sudo visudo
y editando el archivo de configuración y modificando susecure_path
(agregando una ruta adicional separada por:
) o agregue su usuarioexempt_group
(para que no se vea afectado por lassecure_path
opciones).O para pasar el usuario
PATH
temporal, puede ejecutar:y puedes verificar eso de la siguiente manera:
Ver también: ¿Cómo hacer
sudo
preservar$PATH
?Otra razón por la cual el entorno podría ser diferente
sudo
es porque podría tener laenv_reset
opción habilitada en susudoers
archivo. Esto hace que los comandos se ejecuten con un nuevo entorno mínimo.Por lo tanto, puede usar la
env_keep
opción (no recomendada por razones de seguridad ) para preservar las variables de entorno de su usuario:fuente
En la mayoría de los Linux, instalas programas a través de la administración de paquetes y obtienes actualizaciones de manera regular. Si instala algo que elude la administración del paquete, se instalará en / usr / local / bin (por ejemplo, o ... / sbin, / / opt) y no recibirá actualizaciones periódicas.
Por lo tanto, supongo que los programas no se consideran tan seguros y no se ponen en la RUTA raíz de forma predeterminada.
fuente
sudo
qué excluiría este directorio de forma predeterminada.Acabo de probar esto por mí mismo y no vi el comportamiento que estabas viendo: mi camino siguió siendo el mismo, por lo que tal vez la configuración de sudo es diferente. Si marca
man sudoers
, verá que hay una opción llamadasecure_path
que se restablecePATH
; parece que esta opción podría haberse habilitado.fuente
Porque cuando lo usas
sudo bash
,bash
no actúa como un shell de inicio de sesión. Intente nuevamente consudo bash -l
y debería ver el mismo resultado quesu -
.Si esto es correcto, entonces la diferencia de
PATH
mentiras en los archivos de configuración:/etc/profile
,~/.bash_profile
,~/.bash_login
,~/.profile
se ejecuta (en ese orden) para un shell de entrada, mientras que~/.bashrc
se ejecuta para un shell interactivo no inicio de sesión.fuente
Antigua pregunta, lo sé, pero me topé aquí justo ahora porque estaba investigando este problema exacto.
Por alguna razón
/usr/local/bin
solo estaba en la RUTA cuando se convirtió en root víasudo su -
. Cuando lo usabasudo -i
no estaba allí. Por supuesto, ahora sé que puedo agregarlo a / etc / sudoers, pero eso aún no explica por qué ya está allí despuéssu -
. ¿De dónde vino esta parte de PATH?Después de buscar y buscar mucho, encontré la respuesta:
La ruta predeterminada que contiene '/ usr / local / bin' en realidad está codificada en su (1).
Por lo tanto, ninguna configuración de pam, perfil, bashrc ni nada fue responsable de agregar selectivamente este elemento. Siempre estaba allí cuando se
su
hizo cargo. Y comosudo
no invocasu
en absoluto pero usa su propia configuración, faltaba despuéssudo -i
Encontré que esto es cierto en RHEL6 y RHEL7. No revisé ninguna otra versión o distribución.
fuente
su
binario, la cambié/usr/local/bin
por otra e invoqué la copia. Mi RUTA ahora contenía la cadena modificada ... Buenos niños y administradores de sistemas no perezosos, por supuesto, solo descarguen la fuente y verifiquen allí. ;-)