En mi VM Fedora, cuando ejecuto mi cuenta de usuario, tengo /usr/local/binen 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?

sudopreservar $ 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
/sbiny/usr/sbinen su propio camino.fuente
/usr/local/binesta directiva , la vería en mi camino cuando la ejecutesudo, ¿verdad?/usr/local/bin. ¡Muchas gracias por explicar esto!sudopor 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.,sudono lo hace.Si desea
sudocomportarse asísu -, use la opciónsudo -i [commandque 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 visudoy 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_pathopciones).O para pasar el usuario
PATHtemporal, puede ejecutar:y puedes verificar eso de la siguiente manera:
Ver también: ¿Cómo hacer
sudopreservar$PATH?Otra razón por la cual el entorno podría ser diferente
sudoes porque podría tener laenv_resetopción habilitada en susudoersarchivo. Esto hace que los comandos se ejecuten con un nuevo entorno mínimo.Por lo tanto, puede usar la
env_keepopció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
sudoqué 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_pathque se restablecePATH; parece que esta opción podría haberse habilitado.fuente
Porque cuando lo usas
sudo bash,bashno actúa como un shell de inicio de sesión. Intente nuevamente consudo bash -ly debería ver el mismo resultado quesu -.Si esto es correcto, entonces la diferencia de
PATHmentiras en los archivos de configuración:/etc/profile,~/.bash_profile,~/.bash_login,~/.profilese ejecuta (en ese orden) para un shell de entrada, mientras que~/.bashrcse 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/binsolo estaba en la RUTA cuando se convirtió en root víasudo su -. Cuando lo usabasudo -ino 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
suhizo cargo. Y comosudono invocasuen absoluto pero usa su propia configuración, faltaba despuéssudo -iEncontré que esto es cierto en RHEL6 y RHEL7. No revisé ninguna otra versión o distribución.
fuente
subinario, la cambié/usr/local/binpor 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í. ;-)