2011-12-26 18 views
295

Cuando uso cualquier comando con sudo, las variables de entorno no están allí. Por ejemplo, después de configurar HTTP_PROXY, el comando wget funciona bien sin sudo. Sin embargo, si escribo sudo wget, dice que no puede omitir la configuración del proxy.Cómo mantener variables de entorno cuando se usa SUDO

+0

http://superuser.com/questions/232231/how-do-i-make-sudo-preserve-my-environment-variables –

+1

relacionadas: [¿Por qué son las variables camino diferente cuando se ejecuta a través de sudo y su ?] (http://unix.stackexchange.com/q/8646/21471) en Unix SE – kenorb

Respuesta

242

El truco es añadir variables de entorno para sudoers archivo a través de sudo visudo comando y añadir estas líneas:

Defaults env_keep += "ftp_proxy http_proxy https_proxy no_proxy" 

tomado de ArchLinux wiki.

Para Ubuntu 14, es necesario que especifique en líneas separadas, ya que devuelve los errores de líneas múltiples variables:

Defaults env_keep += "http_proxy" 
Defaults env_keep += "https_proxy" 
Defaults env_keep += "HTTP_PROXY" 
Defaults env_keep += "HTTPS_PROXY" 
+10

Podría decirse que es la mejor opción para evitar fugas de información y agujeros de seguridad. 'sudo -E' es la forma segura de conseguir el mismo efecto para una sola vez, aunque – sehe

+0

Me encontré con el problema de un proceso que es el que llama sudo (jhbuild) y no puedo decir que pase la bandera -E para sudo, entonces esta es mi solución. – jgomo3

+42

Observe que debe * nunca * editar directamente los 'etc/sudoers'. En su lugar, use el comando 'visudo', que comprueba sintaxis sus ediciones antes de sobrescribir el archivo' sudoers'. De esta forma, no te bloqueas si cometes un error al editar. – Henning

322

Primero necesita export HTTP_PROXY. En segundo lugar, debe leer man sudo cuidadosamente y prestar atención a la bandera -E. Esto funciona:

$ export HTTP_PROXY=foof 
$ sudo -E bash -c 'echo $HTTP_PROXY' 

Esta es la cita de la página man:

-E, --preserve-env 
      Indicates to the security policy that the user wishes to reserve their 
      existing environment variables. The security policy may eturn an error 
      if the user does not have permission to preserve the environment. 
+0

genial el único problema que es modificar algunos archivos de configuración, por ejemplo, pacman para el arco para hacer que -E se pase –

+4

Para permitir -E (preservar el entorno) para wget, debe especificar la etiqueta SETENV en la regla de sudo que permite la ejecución de wget - Ejemplo: ALL = (root) NOPASSWD: SETENV:

+30

Este "E" doesn No funciona si la variable es PATH o PYTHONPATH. – apporc

18

También se pueden combinar los dos env_keep declaraciones en respuesta de Ahmed Aswani en una sola declaración como esto:

Defaults env_keep += "http_proxy https_proxy"

también debe considerar la especificación de env_keep por sólo un único comando como este:

Defaults!/bin/[your_command] env_keep += "http_proxy https_proxy"

34

Para las variables individuales que desee poner a su disposición en una base única, puede hacer que forme parte del comando.

sudo http_proxy=$http_proxy wget "http://stackoverflow.com" 
+0

He probado esta respuesta para un 'paquete' debajo de algún myPath agregado a' PATH' en el archivo '.bashrc' (con' export' clausule). Luego 'sudo PATH = $ PATH which package' encuentra la respuesta correcta, a diferencia de' sudo which package'. Sin embargo, 'sudo PATH = $ PATH package' no va más allá de' sudo package' (archivo no encontrado). Por otro lado, el lanzamiento de un 'paquete' simple desde un intérprete de comandos invocado con' sudo bash' conserva la ruta extendida y otorga derechos de sudo 'paquete' (dos palomas de un tiro). Entonces, la respuesta realmente depende de qué comandos inicie – XavierStuvw

+1

La resolución de RUTA para sudo es otra cuestión: si alguien encuentra esta publicación en busca de ese asunto, sugiero ver http://unix.stackexchange.com/questions/83191/how-to -make-sudo-preserve-path – jpj

Cuestiones relacionadas