Lorsque j'utilise une commande avec sudo, les variables d'environnement ne sont pas là. Par exemple, après avoir défini HTTP_PROXY, la commande wget
fonctionne correctement sans sudo
. Cependant, si je tape, sudo wget
il dit qu'il ne peut pas contourner le paramètre proxy.
linux
environment-variables
sudo
Ahmed Aswani
la source
la source
Réponses:
Vous devez d'abord
export HTTP_PROXY
. Deuxièmement, vous devez lireman sudo
attentivement et faire attention au-E
drapeau. Cela marche:Voici la citation de la page de manuel:
la source
LC_*
variable. Il suffit donc de faireexport LOL_FOO=$LC_FOO
et d'utiliser à laLOL_FOO
place.PATH
dans le.bashrc
fichier - par exemple,export PATH=myPath:$PATH
. Si je tapesudo -E bash -c 'echo $PATH'
, alorsPATH
ne contient probablement pas myPath carsudo
a déjà désactivé la valeur locale dePATH
avant d'appelerbash
. Au contraire, je trouve la réponse ci - dessous stackoverflow.com/a/33183620/5459638 efficace, qui estsudo PATH=$PATH command
L'astuce consiste à ajouter des variables d'environnement au
sudoers
fichier via lasudo visudo
commande et à ajouter ces lignes:extrait du wiki ArchLinux .
Pour Ubuntu 14, vous devez spécifier sur des lignes distinctes car il renvoie les erreurs pour les lignes multi-variables:
la source
sudo -E
est le moyen infaillible pour adhoc obtenir le même effet pour une unique, maisetc/sudoers
directement. Utilisez plutôt lavisudo
commande qui vérifie la syntaxe de vos modifications avant d'écraser lesudoers
fichier. De cette façon, vous ne vous verrouillez pas si vous faites une erreur lors de l'édition.Pour les variables individuelles que vous souhaitez rendre disponibles sur une base unique, vous pouvez les intégrer à la commande.
la source
package
sous certains myPath ajoutéPATH
dans le.bashrc
fichier (avecexport
clausule). Trouve ensuitesudo PATH=$PATH which package
la bonne réponse, contrairement àsudo which package
. Cependant,sudo PATH=$PATH package
ne va pas plus loin quesudo package
(fichier non trouvé). En revanche, lancer une plaine àpackage
partir d'un shell invoqué avecsudo bash
conserve le chemin étendu et donne despackage
droits sudo (deux pigeons avec une pierre). La réponse dépend donc vraiment des commandes que vousVous pouvez également combiner les deux
env_keep
déclarations de la réponse d'Ahmed Aswani en une seule déclaration comme celle-ci:Defaults env_keep += "http_proxy https_proxy"
Vous devriez également envisager de spécifier
env_keep
une seule commande comme celle-ci:Defaults!/bin/[your_command] env_keep += "http_proxy https_proxy"
la source
Une fonction wrapper simple (ou en ligne pour boucle)
J'ai trouvé une solution unique car:
sudo -E "$@"
fuyait des variables qui causaient des problèmes pour ma commandesudo VAR1="$VAR1" ... VAR42="$VAR42" "$@"
était longue et moche dans mon casdemo.sh
Résultat
Comment?
Ceci est rendu possible par une fonctionnalité de la commande bash
printf
. Le%q
produit une chaîne entre guillemets. Contrairement à l'expansion des paramètres dans bash 4.4 , cela fonctionne dans les versions bash <4.0la source
Si vous avez besoin de conserver les variables d'environnement dans un script, vous pouvez placer votre commande dans un document ici comme celui-ci. Surtout si vous avez beaucoup de variables pour que les choses soient bien rangées de cette façon.
la source