¿Cómo hacer que `sudo` preserve $ PATH?

123

Necesito ejecutar un programa instalado en / opt / godi / sbin (un directorio personalizado). Si agrego ese directorio a mi RUTA, agregando la siguiente línea a mi archivo .bashrc

export PATH=$PATH:/opt/godi/bin:/opt/godi/sbin

entonces puedo intentar ejecutar el comando bien (excepto que falla porque necesita sudo). Sin embargo, cuando trato de usar sudo:

sudo godi_console

Obtuve el siguiente error

sudo: godi_console: command not found

La inspección de la variable PATH después de usar sudo revela que no incluye la misma PATH que tengo como usuario normal:

$ sudo sh
# echo $PATH                 
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

¿Por qué la RUTA no es la misma? ¿Estoy haciendo algo mal? Estoy en Debian Jessie y desafortunadamente no puedo evitar el problema pasando sudo el enlace absoluto a godi_console porque godi_console en sí también depende de que la RUTA esté configurada correctamente.

hugomg
fuente
2
Tratar sudo -E godi_console. -Esignifica "preservar el medio ambiente".
D_Bye
55
@D_Bye, eso no funcionará si secure_pathy / o env_reset están configurados como es el caso en muchas sudoimplementaciones como en Debian.
Stéphane Chazelas
@StephaneChazelas Gracias por la información: no uso Debian, ¡así que tal vez debería haberme quedado callado!
D_Bye
stackoverflow.com/questions/257616/sudo-changes-path-why
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
Una pregunta relacionada, sobre suno sudo, es unix.stackexchange.com/questions/460478 .
JdeBP

Respuestas:

149

Siempre puedes hacer:

sudo env "PATH=$PATH" godi_console

Como medida de seguridad en Debian, /etc/sudoerstiene la secure_pathopción establecida en un valor seguro.

Tenga en cuenta que:

sudo "PATH=$PATH" godi_console

Donde sudotrata los argumentos principales que contienen =caracteres como asignaciones de variables de entorno por sí mismo, también funcionaría al ejecutarse godi_consolecon su $PATH (a diferencia del secure_path) en su entorno, pero no afectaría sudola ruta de búsqueda del ejecutable, por lo que no ayudaría sudoa encontrarlo godi_console.

Stéphane Chazelas
fuente
55
Esta respuesta me gusta más, ya que evita la necesidad de cambiar la configuración a nivel mundial (es decir, conserva el principio del menor privilegio)
Alois Mahdal
55
sudo "PATH=$PATH" godi_console Por cierto, no funcionó en CentOs7. Necesitaba el ambiente
Hakan Baba
1
@ StéphaneChazelas ¿ sudo "PATH=$PATH" godi_consoleRealmente alguna vez funcionó? sudoacepta VAR=valueargumentos, que afectan el entorno del comando que ejecuta, pero a diferencia de envo bash, sudono parece permitir que esto afecte la forma en que se ve el comando. Solo probé esto (recientemente) en Ubuntu 16.04. Pero intenté agregar la exempt_groupopción sudoers(solo para probar, ¡no lo considero una solución!) Y los resultados fueron esclarecedores. Los comandos del formulario PATH="$PATH" sudo some-commandcomenzaron a funcionar, pero los del formulario sudo PATH="$PATH" some-command todavía no.
Eliah Kagan el
2
@ballsatballsdotballs. Como ese alias solo debería afectar a sus shells interactivos, debería ser relativamente inofensivo.
Stéphane Chazelas
2
Acabo de crear un alias llamado psudo para este tipo de casos, donde: alias psudo = "sudo env \" PATH = $ PATH \ "". Entonces mi uso normal de sudo no se ve afectado.
mikeTronix
46

También puede establecer la RUTA predeterminada en /etc/sudoers

edite el archivo usando visudo

y actualiza la línea a lo que quieras: Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin

michaelbn
fuente
18

SUDO está reiniciando las variables env por defecto.

Consulte su manual y la opción llamada env_reset.

Solo necesita deshabilitarlo en / etc / sudoers.

KWubbufetowicz
fuente
55
¡Bueno! En Ubuntu puedes visudo y comentar las líneas secure_path y env_reset. Hace que el sistema sea considerablemente menos seguro, así que ten cuidado.
RawwrBag
La desactivación env_resetparece no afectar sudoel comportamiento de w / r / t PATH.
Zanna
5

Esto funciona :

sudo $(which your_command)

Ejemplo llamando a mi gpsscript que enumera los procesos de Nvidia GPU:

$ sudo gps
sudo: gps: command not found
$ sudo $(which gps)
  PID TTY          TIME CMD
 9922 tty7     02:42:47 Xorg

Explicacion:

$ set -x;sudo $(which gps);set +x
++ which gps
+ sudo /home/xyztuv/myScripts/shl/gps
  PID TTY          TIME CMD
 9922 tty7     02:42:39 Xorg
+ set +x
SebMa
fuente
3
sudo --preserve-env=PATH env [command]

esto sobrevuela secure_path de mi lado

deshacer
fuente
1

Esto funcionó:

sudo "PATH=$PATH" [your command]

No cambie $ PATH con su valor de ruta, simplemente escríbalo de esta manera

ejemplo: $ sudo env "PATH=$PATH" ant -f webAppConfig.xml regenWebAppConf....

imane kichu
fuente
0

Tal vez no sea precisamente lo que OP pide, pero esto podría ayudar:

sudo -u the_user PATH=$PATH:/opt/godi/bin sh -c 'echo $PATH'

Esto cambia la RUTA dentro del comando sudoed.

Editar: No estoy seguro de lo que quise decir con esto, ya que lo anterior no tiene sentido. Use lo siguiente en su lugar:

sudo -u the_user sh -c 'PATH=$PATH:/opt/godi/bin echo $PATH'
phil294
fuente