Comment faire `sudo` preserve $ PATH?

123

Je dois exécuter un programme installé sur / opt / godi / sbin (un répertoire personnalisé). Si j'ajoute ce répertoire à PATH, en ajoutant la ligne suivante à mon fichier .bashrc

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

alors je peux essayer d’exécuter la commande très bien (sauf qu’elle échoue car elle nécessite sudo). Cependant, lorsque j'essaie d'utiliser sudo:

sudo godi_console

Je reçois l'erreur suivante

sudo: godi_console: command not found

L'inspection de la variable PATH après l'utilisation de sudo révèle qu'elle ne comprend pas le même PATH que l'utilisateur normal:

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

Pourquoi le PATH n'est-il pas le même? Est-ce que je fais quelque chose de mal? Je suis sur Debian Jessie et, malheureusement, je ne peux pas contourner le problème en passant sudo le lien absolu à godi_console, car godi_console lui-même dépend également de la définition correcte de PATH.

hugomg
la source
2
Essayez sudo -E godi_console. -Esignifie "préserver l'environnement".
D_Bye
5
@D_Bye, cela ne fonctionnera pas si secure_pathet / ou env_reset sont configurés comme c'est le cas dans de nombreux sudodéploiements comme sur Debian.
Stéphane Chazelas
@StephaneChazelas Merci pour l'info. Je n'utilise pas Debian, alors j'aurais peut-être dû rester silencieux!
D_Bye
Une question connexe, à propos de sunot sudo, est unix.stackexchange.com/questions/460478 .
JdeBP

Réponses:

149

Vous pouvez toujours faire:

sudo env "PATH=$PATH" godi_console

En tant que mesure de sécurité sur Debian, /etc/sudoersl' secure_pathoption est définie sur une valeur sûre.

Notez que:

sudo "PATH=$PATH" godi_console

sudotraite les principaux arguments contenant des =caractères comme des assignations de variable d’environnement, fonctionnerait également godi_consoleavec votre $PATH (par opposition à secure_path) dans son environnement, mais n’affecterait pas sudole chemin de recherche de l’exécutable, donc n’aiderait pas sudoà le trouver godi_console.

Stéphane Chazelas
la source
5
J'aime mieux cette réponse car elle évite de devoir modifier globalement les paramètres (c'est-à-dire qu'elle préserve le principe du moindre privilège)
Alois Mahdal
5
sudo "PATH=$PATH" godi_console n'a pas fonctionné dans CentOs7 en passant. J'avais besoin de l'en
Hakan Baba
1
@ StéphaneChazelas Est-ce sudo "PATH=$PATH" godi_consoleque ça marche vraiment? sudoaccepte les VAR=valuearguments, affectant l'environnement de la commande il fonctionne, mais contrairement à envou bash, sudone semble pas laisser cela affecter la façon dont il regarde la commande. Je l'ai seulement testé (récemment) sur Ubuntu 16.04. Mais j'ai essayé d'ajouter l' exempt_groupoption à sudoers(juste pour tester - je ne considère pas cela comme une solution!) Et les résultats ont été éclairants. Les commandes du formulaire ont PATH="$PATH" sudo some-commandcommencé à fonctionner, mais celles du formulaire ne l’ont sudo PATH="$PATH" some-command toujours pas été.
Eliah Kagan
2
@ballsatballsdotballs. Comme ce pseudonyme ne devrait affecter que vos shells interactifs, il devrait être relativement inoffensif.
Stéphane Chazelas
2
Je viens de créer un alias appelé psudo pour ces types de cas, où: alias psudo = "sudo env \" PATH = $ PATH \ "". Ensuite, mon utilisation sudo normale n'est pas affectée.
mikeTronix
46

Vous pouvez également définir le PATH par défaut à /etc/sudoers

éditer le fichier en utilisant visudo

et mettez à jour la ligne à votre guise: Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin

michaelbn
la source
18

SUDO est en train de réinitialiser les variables env par défaut.

Consultez son manuel et son option appelée env_reset.

Vous devez simplement le désactiver dans / etc / sudoers.

KWubbufetowicz
la source
5
Cool! Dans Ubuntu, vous pouvez visualiser et commenter les lignes secure_path et env_reset. Rend le système considérablement moins sécurisé, alors méfiez-vous.
RawwrBag
La désactivation env_resetne semble pas affecter sudole comportement de w / r / t PATH.
Zanna
5

Cela marche :

sudo $(which your_command)

Exemple d'appel de mon gpsscript qui répertorie les processus de Nvidia GPU:

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

Explication:

$ 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
la source
3
sudo --preserve-env=PATH env [command]

cette ovrure secure_path de mon côté

untore
la source
1

Cela a fonctionné:

sudo "PATH=$PATH" [your command]

Ne changez pas $ PATH avec votre valeur de chemin, vous l'écrivez simplement de cette façon

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

imane kichu
la source
0

Peut-être pas précisément ce que demande OP, mais cela pourrait aider:

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

Cela change le PATH dans la commande sudoed.

Edit: Je ne suis pas sûr de ce que je voulais dire par ceci, car ce qui précède est à peu près un non-sens. Utilisez les éléments suivants à la place:

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