web-dev-qa-db-fra.com

Comment faire pour que `Sudo` préserve $ PATH?

J'ai besoin d'exécuter un programme installé sur/opt/godi/sbin (un répertoire personnalisé). Si j'ajoute ce répertoire à mon CHEMIN, 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 a besoin de Sudo). Cependant, lorsque j'essaie d'utiliser Sudo:

Sudo godi_console

J'obtiens l'erreur suivante

Sudo: godi_console: command not found

L'inspection de la variable PATH après avoir utilisé Sudo révèle que cela n'inclut pas le même PATH que j'ai en tant qu'utilisateur normal:

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

Pourquoi le CHEMIN 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 vers godi_console car godi_console lui-même dépend également du PATH qui est correctement défini.

132
hugomg

Vous pouvez toujours faire:

Sudo env "PATH=$PATH" godi_console

Par mesure de sécurité sur Debian, /etc/sudoers a la secure_path option définie sur une valeur sûre.

Notez que:

Sudo "PATH=$PATH" godi_console

Sudo traite les principaux arguments contenant = caractères en tant qu'assignations de variables d'environnement, fonctionneraient également lors de l'exécution de godi_console avec votre$PATH (par opposition à secure_path) dans son environnement, mais n'affecterait pas le chemin de recherche de Sudo pour l'exécutable, donc n'aiderait pas Sudo à trouver que godi_console.

159
Stéphane Chazelas

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

éditez le fichier en utilisant visudo

et mettez à jour la ligne comme vous le souhaitez: Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin

48
michaelbn

Sudo fait réinitialiser les variables env par défaut.

Consultez son manuel et son option appelée env_reset.

Il vous suffit de le désactiver dans/etc/sudoers.

19
KWubbufetowicz

Cela marche :

Sudo $(which your_command)

Exemple d'appel de mon script gps qui répertorie les processus du GPU Nvidia:

$ 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
6
SebMa
Sudo --preserve-env=PATH env [command]

cela remplace Secure_path de ma part

3
untore

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....

1
imane kichu

Peut-être pas exactement 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 inside la commande sudoed.

Edit: je ne suis pas sûr de ce que je voulais dire par là, car ce qui précède est à peu près un non-sens. Utilisez plutôt ce qui suit:

Sudo -u the_user sh -c 'PATH=$PATH:/opt/godi/bin echo $PATH'
0
phil294