Cuando uso cualquier comando con sudo, las variables de entorno no están allí. Por ejemplo, después de configurar HTTP_PROXY, el comando wgetfunciona 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 sudoatentamente y prestar atención a la-Ebandera. Esto funciona:Aquí está la cita de la página del manual:
fuente
LC_*variable. Así que solo hazloexport LOL_FOO=$LC_FOOy úsaloLOL_FOOen su lugar.PATHen el.bashrcarchivo - por ejemplo,export PATH=myPath:$PATH. Si escribosudo -E bash -c 'echo $PATH', entoncesPATHno contiene myPath probablemente porquesudoya ha deshabilitado el valor local dePATHantes de llamarbash. Más bien, encontré la respuesta a continuación stackoverflow.com/a/33183620/5459638 efectiva, es decirsudo PATH=$PATH commandEl truco consiste en agregar variables de entorno al
sudoersarchivo mediante unsudo visudocomando 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 -ESin embargo, esta es la forma segura de ad-hoc obtener el mismo efecto para una única vezetc/sudoersdirectamente. En su lugar, utilice elvisudocomando, que sintaxis verifica sus ediciones antes de sobrescribir elsudoersarchivo. 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
packagepoco de myPath agregadoPATHen el.bashrcarchivo (conexportclausule). Luegosudo PATH=$PATH which packageencuentra la respuesta correcta, a diferenciasudo which package. Sin embargo,sudo PATH=$PATH packageno va más allá desudo package(archivo no encontrado). Por otro lado, lanzar una llanurapackagedesde un caparazón invocado consudo bashpreserva el camino extendido y otorgapackagederechos 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_keepdeclaraciones 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_keepsolo 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%qproduce 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