Come fare in modo che `sudo` preservi $ PATH?


123

Devo eseguire un programma installato su / opt / godi / sbin (una directory personalizzata). Se aggiungo quella directory al mio PERCORSO, aggiungendo la seguente riga al mio file .bashrc

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

quindi posso provare a eseguire il comando bene (tranne che non riesce perché ha bisogno di sudo). Tuttavia, quando provo ad usare sudo:

sudo godi_console

Ottengo il seguente errore

sudo: godi_console: command not found

Ispezionare la variabile PATH dopo aver usato sudo rivela che non include lo stesso PATH che ho come utente normale:

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

Perché il PERCORSO non è lo stesso? Sto facendo qualcosa di sbagliato? Sono su Debian Jessie e sfortunatamente non riesco ad aggirare il problema passando sudo il link assoluto a godi_console perché godi_console stesso dipende anche dalla corretta impostazione del PERCORSO.


2
Prova sudo -E godi_console. -Esignifica "preservare l'ambiente".
D_Bye,

5
@D_Bye, che non funzionerà se secure_pathe / o env_reset sono configurati come in molte sudodistribuzioni come su Debian.
Stéphane Chazelas,

@StephaneChazelas Grazie per le informazioni - non uso Debian, quindi forse avrei dovuto semplicemente tacere!
D_Bye,


Una domanda correlata, circa suno sudo, è unix.stackexchange.com/questions/460478 .
JdeBP,

Risposte:


149

Puoi sempre fare:

sudo env "PATH=$PATH" godi_console

Come misura di sicurezza su Debian, /etc/sudoersl' secure_pathopzione è impostata su un valore sicuro.

Nota che:

sudo "PATH=$PATH" godi_console

Laddove sudotratta gli argomenti principali contenenti =caratteri come assegnazioni di variabili di ambiente da soli, funzionerebbe anche godi_consolecon il tuo $PATH (al contrario di secure_path) nel suo ambiente, ma non influenzerebbe sudoil percorso di ricerca degli eseguibili, quindi non aiuterebbe sudoa trovarlo godi_console.


5
Mi piace molto questa risposta poiché evita la necessità di modificare le impostazioni a livello globale (ovvero preserva il principio del privilegio minimo)
Alois Mahdal

5
sudo "PATH=$PATH" godi_console a proposito, non ha funzionato in CentOs7. Needed the env
Hakan Baba,

1
@ StéphaneChazelas Funziona sudo "PATH=$PATH" godi_consoledavvero? sudoaccetta VAR=valueargomenti, influendo sull'ambiente del comando che esegue, ma a differenza di envo bash, sudonon sembra che ciò influisca sul modo in cui cerca il comando. Ho provato questo (recentemente) su Ubuntu 16.04. Ma ho provato ad aggiungere l' exempt_groupopzione sudoers(solo per i test - non considero questa una soluzione!) E i risultati sono stati illuminanti. I comandi del modulo hanno PATH="$PATH" sudo some-commandiniziato a funzionare, ma quelli del modulo non lo hanno sudo PATH="$PATH" some-command ancora fatto.
Eliah Kagan,

2
@ballsatballsdotballs. Poiché tale alias dovrebbe influire solo sulle shell interattive, ciò dovrebbe essere relativamente innocuo.
Stéphane Chazelas,

2
Ho appena creato un alias chiamato psudo per questi tipi di casi, in cui: alias psudo = "sudo env \" PATH = $ PATH \ "". Quindi il mio normale uso di sudo non è interessato.
mikeTronix,

46

È inoltre possibile impostare il PERCORSO predefinito su /etc/sudoers

modifica il file usando visudo

e aggiorna la linea a ciò che desideri: Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin


18

SUDO sta ripristinando le variabili env di default.

Dai un'occhiata al suo manuale e all'opzione chiamata env_reset.

Devi solo disabilitarlo in / etc / sudoers.


5
Freddo! In Ubuntu puoi visudo e commentare le linee secure_path e env_reset. Rende il sistema notevolmente meno sicuro, quindi attenzione.
RawwrBag

La disabilitazione env_resetsembra non influenzare sudoil comportamento del PERCORSO.
Zanna,

5

Questo funziona:

sudo $(which your_command)

Esempio di chiamata al mio gpsscript che elenca i processi della GPU Nvidia:

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

Spiegazione :

$ 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

3
sudo --preserve-env=PATH env [command]

questo ovverride secure_path dalla mia parte


1

Questo ha funzionato:

sudo "PATH=$PATH" [your command]

Non modificare $ PATH con il valore del tuo percorso, basta scriverlo in questo modo

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


0

Forse non è esattamente ciò che richiede OP, ma questo potrebbe aiutare:

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

Questo cambia il PERCORSO all'interno del comando sudoed.

Modifica: non sono sicuro di cosa intendessi con questo, dato che quanto sopra è praticamente una sciocchezza. Utilizzare invece quanto segue:

sudo -u the_user sh -c 'PATH=$PATH:/opt/godi/bin echo $PATH'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.