Il comando sudo non genera /root/.bashrc


27

Ho aggiunto un percorso personalizzato alla PATHvariabile nel mio file /root/.bashrc

Quando lo faccio sudo su; echo $PATH, mostra la voce '/ percorso / a / personalizzato / bin'.

Ma lo faccio sudo sh -c 'echo $PATH', mostra, /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

I percorsi delle cartelle aggiunti nel file .bashrc non sono visibili.

Il comando sudo non ha lo stesso ambiente di un utente root?

sudo  bashrc 

Risposte:


32

.bashrcè un file di configurazione di bash, solo quando viene eseguito in modo interattivo. Viene caricato solo quando si avvia bash, non quando si esegue qualche altro programma come sh(nemmeno se bash viene richiamato tramite il nome sh). E viene caricato solo quando bash è interattivo, non quando esegue uno script o un comando con -c.

sudo sh -c 'echo $PATH'o sudo bash -c 'echo $PATH'non invoca una shell interattiva, quindi .bashrcnon è coinvolto.

sudo su; echo $PATHesegue un'istanza interattiva della shell di root. Se questo è bash, ~root/.bashrcviene caricato. Questo frammento viene eseguito echo $PATHuna volta terminata la shell interattiva, quindi qualsiasi cosa accada nella shell interattiva non ha alcuna influenza su ciò che lo snippet stampa alla fine. Ma se si digita echo $PATHal prompt della shell interattiva avviato da sudo su, verrà visualizzato il valore impostato da ~root/.bashrc.

Poiché .bashrcviene invocato in ogni shell interattiva, non dalle shell di login (nemmeno dalle shell di login interattive, che è un difetto di progettazione in bash), è il posto sbagliato per definire le variabili di ambiente. Utilizzare .bashrcper impostazioni bash interattive come associazioni di tasti, alias e impostazioni di completamento. Impostare le variabili di ambiente nei file che vengono caricati quando si accede: ~/.pam_environmento ~/.profile.

In modo da impostare PATHin .profile, invece di .bashrc, e sia gestita una shell di login con sudo -i 'echo $PATH', o esplicitamente fonte .profilecon sudo sh -c '. ~/.profile; echo $PATH'.


1
ha affrontato molti punti rilevanti sulle shell ... grazie ....

1
Come lo aggiungo a .profile? Intendi /root/.profileo /home/user/.profile? Ho provato ad aggiungere export PATH=$PATH:/mydirad entrambi. Non ha funzionato Ci ho provato senza export, neanche quello ha funzionato.
falsePockets

@falsePockets Non ha funzionato per cosa? Dovresti porre una nuova domanda e spiegare esattamente cosa stai facendo.
Gilles 'SO- smetti di essere malvagio' il

La cosa che non ha funzionato è esattamente la stessa cosa che OP sta cercando di fare. Sto cercando di aggiungere una directory al PERCORSO del mio superutente. Non dovrei porre una nuova domanda, poiché quella domanda sarebbe un duplicato di questa domanda.
falsePockets

@falsePockets Ma evidentemente non stai facendo la stessa cosa per raggiungere l'account superutente. E poiché non hai detto quello che stai facendo, non posso aiutarti se non ripetere ciò che è già nella mia risposta.
Gilles 'SO- smetti di essere malvagio' il

14

Guarda le opzioni -Ee -i.

-E: Indica la politica di sicurezza che l'utente desidera preservare le variabili di ambiente esistenti. La politica di sicurezza può restituire un errore se l'utente non dispone dell'autorizzazione per preservare l'ambiente.

-i: Esegue la shell specificata dalla voce del database delle password dell'utente di destinazione come shell di accesso. Ciò significa che i file di risorse specifici per l'accesso come .profile o .login verranno letti dalla shell. Se viene specificato un comando, viene passato alla shell per l'esecuzione tramite l'opzione -c della shell. Se non viene specificato alcun comando, viene eseguita una shell interattiva. sudo tenta di passare alla home directory dell'utente prima di eseguire la shell. Il comando viene eseguito con un ambiente simile a quello che un utente riceverebbe al login. La sezione Ambiente di comando nel manuale sudoers (5) documenta come l'opzione -i influisce sull'ambiente in cui viene eseguito un comando quando la politica sudoers è in uso.


3

È possibile sudo bash, che legge i bashfile di avvio come documentato nella bashpagina / documentazione del manuale. Si noti, tuttavia, che potrebbe non impostare HOMEcorrettamente la variabile di ambiente. Questo può essere risolto nel bashfile di avvio dell'intero sistema (in /etc, la posizione esatta dipende dalla distro) - verifica se $uidè 0.

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.