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 él sudo
. Sin embargo, si escribo sudo wget
, dice que no puede omitir la configuración del proxy.
linux
environment-variables
sudo
Ahmed Aswani
fuente
fuente
Respuestas:
Primero debes hacerlo
export HTTP_PROXY
. En segundo lugar, debe leerman sudo
atentamente y prestar atención a la-E
bandera. Esto funciona:Aquí está la cita de la página del manual:
fuente
LC_*
variable. Así que solo hazloexport LOL_FOO=$LC_FOO
y úsaloLOL_FOO
en su lugar.PATH
en el.bashrc
archivo - por ejemplo,export PATH=myPath:$PATH
. Si escribosudo -E bash -c 'echo $PATH'
, entoncesPATH
no contiene myPath probablemente porquesudo
ya ha deshabilitado el valor local dePATH
antes de llamarbash
. Más bien, encontré la respuesta a continuación stackoverflow.com/a/33183620/5459638 efectiva, es decirsudo PATH=$PATH command
El truco consiste en agregar variables de entorno al
sudoers
archivo mediante unsudo visudo
comando y agregar estas líneas:tomado de ArchLinux wiki .
Para Ubuntu 14, debe especificar en líneas separadas, ya que devuelve los errores para líneas de múltiples variables:
fuente
sudo -E
Sin embargo, esta es la forma segura de ad-hoc obtener el mismo efecto para una única vezetc/sudoers
directamente. En su lugar, utilice elvisudo
comando, que sintaxis verifica sus ediciones antes de sobrescribir elsudoers
archivo. De esa manera, no se bloquea si comete un error al editar.Para las variables individuales que desea que estén disponibles de forma única, puede hacer que formen parte del comando.
fuente
package
poco de myPath agregadoPATH
en el.bashrc
archivo (conexport
clausule). Luegosudo PATH=$PATH which package
encuentra la respuesta correcta, a diferenciasudo which package
. Sin embargo,sudo PATH=$PATH package
no va más allá desudo package
(archivo no encontrado). Por otro lado, lanzar una llanurapackage
desde un caparazón invocado consudo bash
preserva el camino extendido y otorgapackage
derechos de sudo (dos palomas de un tiro). Por lo tanto, la respuesta realmente depende de qué comandos estáTambién puede combinar las dos
env_keep
declaraciones en la respuesta de Ahmed Aswani en una sola declaración como esta:Defaults env_keep += "http_proxy https_proxy"
También debe considerar especificar
env_keep
solo un comando como este:Defaults!/bin/[your_command] env_keep += "http_proxy https_proxy"
fuente
Una función de envoltura simple (o en línea para bucle)
Se me ocurrió una solución única porque:
sudo -E "$@"
estaba filtrando variables que estaban causando problemas para mi comandosudo VAR1="$VAR1" ... VAR42="$VAR42" "$@"
fue largo y feo en mi casodemo.sh
Resultado
¿Cómo?
Esto es posible gracias a una característica del bash incorporado
printf
. El%q
produce una cadena entre comillas. A diferencia de la expansión de parámetros en bash 4.4 , esto funciona en versiones de bash <4.0fuente
Si tiene la necesidad de mantener las variables de entorno en un script, puede colocar su comando en un documento aquí como este. Especialmente si tiene muchas variables para configurar las cosas, se ven ordenadas de esta manera.
fuente