Perché le variabili PATH sono diverse quando si esegue tramite sudo e su?


40

Sulla mia macchina virtuale fedora, quando sono in esecuzione con il mio account utente ho /usr/local/binnel mio percorso:

[justin@justin-fedora12 ~]$ env | grep PATH
 PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/justin/bin

E allo stesso modo quando si esegue su:

[justin@justin-fedora12 ~]$ su -
Password: 
[root@justin-fedora12 justin]# env | grep PATH
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/justin/bin

Tuttavia, quando si esegue tramite sudo, questa directory non si trova nel percorso:

[root@justin-fedora12 justin]# exit
[justin@justin-fedora12 ~]$ sudo bash
[root@justin-fedora12 ~]# env | grep PATH
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/sbin:/bin:/usr/sbin:/usr/bin

Perché il percorso dovrebbe essere diverso quando si esegue tramite sudo?



Risposte:


37

Dai un'occhiata /etc/sudoers. Il file predefinito in Fedora (così come in RHEL, e anche Ubuntu e simili) include questa riga:

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

Ciò garantisce che il percorso sia pulito quando si eseguono file binari su sudo. Questo aiuta a proteggere da alcune delle preoccupazioni rilevate in questa domanda . È anche conveniente se non hai /sbine /usr/sbinnel tuo percorso.


Ah, lo vedo nel mio file. Quindi, non quello che voglio, ma se aggiungessi /usr/local/bina questa direttiva , la vedrei nel mio percorso quando corro via sudo, giusto?
Justin Ethier,

L'ho appena provato e ora vedo /usr/local/bin. Grazie mille per aver spiegato questo!
Justin Ethier,

Che ne dici di aggiungere il percorso dei tuoi utenti per script e binari, quindi non devi scrivere il percorso assoluto quando devi sudoad esempio uno script nel tuo ~/bin(o qualunque percorso tu usi)? Ho appena apportato la modifica: funziona, pensavi solo che potesse esserci un rovescio della medaglia?
Emanuel Berg,

@mattdm Sì, anche Ubuntu, quando mi sono imbattuto in quel problema in Ubuntu Vivid mentre giocavo con la VM. Lo stesso per Debian .
Kenorb,

9

Il comando su -eseguirà il profilo degli utenti root e assumerà l'ambiente dell'utente incluso il percorso ecc sudo.

Se vuoi sudocomportarti come su -allora, usa l'opzione sudo -i [commandche eseguirà il profilo dell'utente

Se ti piacerebbe su -comportarti come sudonon usare il trattino, basta usaresu [command]


2

Puoi controllare perché (è diverso) eseguendo sudo sudo -V.

Ad esempio, su Linux, eseguire:

$ sudo sudo -V | grep PATH
Value to override user's $PATH with: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Nota: su MacOS / BSD, basta eseguire: sudo sudo -V.

L'elenco sopra è limitato a causa del plug-in della politica di sicurezza predefinito in alcune distribuzioni Linux.


Questo è ulteriormente spiegato in man sudoers:

Se l' secure_pathopzione è impostata, il suo valore verrà utilizzato per la PATHvariabile di ambiente.

secure_path- Percorso utilizzato per ogni comando eseguito da sudo. Se non ti fidi che le persone che eseguono sudo dispongano di una PATHvariabile d'ambiente sana , potresti voler usare questo.

Un altro uso è se si desidera che il "percorso radice" sia separato dal "percorso utente". Gli utenti nel gruppo specificato exempt_groupdall'opzione non sono interessati da secure_path. Questa opzione non è impostata per impostazione predefinita.

In tal caso, puoi cambiarlo eseguendo sudo visudoe modificando il file di configurazione e modificando il tuo secure_path(aggiungendo un percorso aggiuntivo separato da :) o aggiungendo il tuo utente exempt_group( in modo da non essere influenzato dalle secure_pathopzioni).

O per passare PATHtemporaneamente l'utente , è possibile eseguire:

sudo env PATH="$PATH" my_command

e puoi verificarlo tramite:

sudo env PATH="$PATH" env | grep ^PATH

Vedi anche: Come sudoconservare $PATH?


Un altro motivo per cui l'ambiente potrebbe essere diverso sudoè perché potresti avere l' env_resetopzione abilitata nel tuo sudoersfile. Questo fa sì che i comandi vengano eseguiti con un nuovo ambiente minimo.

Quindi puoi usare l' env_keepopzione (non raccomandato per motivi di sicurezza ) per preservare le variabili d'ambiente del tuo utente:

Defaults        env_reset
Defaults        env_keep += "PATH PYTHONPATH"

1

Nella maggior parte dei Linux, i programmi vengono installati tramite la gestione dei pacchetti e si ottengono aggiornamenti in modo regolare. Se installi qualcosa che elude la gestione dei pacchetti, verrà installato in / usr / local / bin (ad esempio, o ... / sbin o / opt) e non riceverà aggiornamenti regolari.

Immagino quindi che i programmi non siano considerati così sicuri e non portino in radice il PERCORSO di default.


+1 - Bene, mi chiedevo perché non fosse sul percorso, e questo ha senso. Per quello che vale, stavo costruendo node.js da zero per giocarci su, quindi ha senso il motivo per cui sarebbe stato messo lì e perché sudoescluderebbe questa directory per impostazione predefinita.
Justin Ethier,

@Justin Ethier: fuori tema, ma vedi bugzilla.redhat.com/show_bug.cgi?id=634911
mattdm

1

Ho appena provato questo da solo e non ho visto il comportamento che stavi vedendo - il mio percorso è rimasto lo stesso, quindi forse la tua configurazione sudo è diversa. Se controlli man sudoersvedrai che c'è un'opzione chiamata secure_pathche reimposta PATH- sembra che questa opzione potrebbe essere stata abilitata.


Interessante. Questo è stato su Fedora 12, per quello che vale ...
Justin Ethier,

1

Perché quando lo usi sudo bash, bashnon funziona come una shell di login. Riprova con sudo bash -le dovresti vedere lo stesso risultato di su -.

Se questo è corretto, allora la differenza PATHsta nel file di configurazione: /etc/profile, ~/.bash_profile, ~/.bash_login, ~/.profilevengono eseguite (in questo ordine) per una shell di login, mentre ~/.bashrcviene eseguita per una shell interattiva non di login.


0

Vecchia domanda, lo so, ma sono inciampato qui proprio ora perché stavo indagando su questo esatto problema.

Per qualche ragione /usr/local/binera solo nel PERCORSO quando si diventa root via sudo su -. Durante l'utilizzo sudo -inon c'era. Ovviamente ora so che posso aggiungerlo a / etc / sudoers, ma ciò non ha ancora spiegato perché sia ​​già lì dopo su -. Da dove viene questa parte di PATH?

Dopo molti tentativi e ricerche ho trovato la risposta:

Il percorso predefinito contenente '/ usr / local / bin' è effettivamente codificato in su (1).

Quindi nessuna configurazione pam, profilo, bashrc o altro era responsabile dell'aggiunta selettiva di questo elemento. Era sempre già lì quando suprese il controllo. E poiché sudonon invoca suaffatto ma utilizza la propria configurazione, mancava doposudo -i

Ho trovato che questo è vero su RHEL6 e RHEL7. Non ho verificato alcuna altra versione o distribuzione.


Non chiedermi come ho verificato questo. Va bene, se insisti: ho modificato una copia del file subinario, ho cambiato /usr/local/binin qualcos'altro e ho invocato la copia. Il mio PERCORSO ora conteneva la stringa modificata ... I bravi bambini e gli amministratori di sistema non pigri, ovviamente, scaricano la fonte ed effettuano il check-in. ;-)
Oscar
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.