Come impostare la variabile d'ambiente per tutti nel mio sistema Linux?


132

Posso avere determinate impostazioni universali per tutti i miei utenti?


2
È ESPORTAZIONE? aggiungerlo ed è globale?
TIMEX,

penso che sia solo un'aggiunta alla sessione corrente, quando apri una nuova sessione nel terminale sarebbe scomparsa
Haryono Sariputra,

Risposte:


104

Oltre a ciò /etc/profileche altri hanno menzionato, alcuni sistemi Linux ora usano una directory /etc/profile.d/; tutti i .shfile presenti verranno acquistati da /etc/profile. È leggermente più ordinato conservare le cose dell'ambiente personalizzato in questi file piuttosto che modificarle /etc/profile.


4
Cosa succede se alcuni utenti usano un'altra shell, come zsh?
Matthieu Napoli,

70
questo non è globale ... è limitato alla shell .. peccato che sia la risposta più accettata
mmm

1
zsh fornirà i file .sh in /etc/profile.d/, puoi vederlo da / etc / zshrc @Matthieu Napoli
Bily,

4
Gli script non vengono utilizzati per l'utente ROOT.
Val


38

man 8 pam_env

man 5 pam_env.conf

Se tutti i servizi di accesso utilizzano PAM e tutti i servizi di accesso hanno session required pam_env.sonei rispettivi /etc/pam.d/*file di configurazione, tutte le sessioni di accesso avranno alcune variabili di ambiente impostate come specificato nel pam_envfile di configurazione.

Nella maggior parte delle moderne distribuzioni Linux, questo è tutto lì per impostazione predefinita: basta aggiungere le variabili di ambiente globali desiderate /etc/security/pam_env.conf.

Funziona indipendentemente dalla shell dell'utente e funziona anche per gli accessi grafici (se xdm / kdm / gdm / entrance / ... è impostato in questo modo).


1
+1 devi anche riavviare dopo aver aggiunto una variabile in pam_env.conf perché istantaneamente al volo $ echo $ variablename non mostra

9
Non è necessario riavviare, è necessario accedere nuovamente. (Nessun riavvio dei server critici per me)
Lyndon White

Questo non sembra applicarsi alla mia distribuzione, Mint 17.2. Il file preinstallato viene completamente commentato e se aggiungo qualcosa di simile echo foo>/home/me/bare riavvio (e accedo di nuovo), quel file non viene creato. (Probabilmente c'è un modo più elegante per testarlo, ma volevo essere sicuro prima di commentare qui.)
Michael Scheper,

16

Sorprendentemente, Unix e Linux non hanno effettivamente un posto per impostare variabili d'ambiente globali. Il meglio che puoi fare è disporre che ogni shell specifica abbia un'inizializzazione specifica del sito.

Se lo metti dentro /etc/profile, questo si occuperà delle cose per la maggior parte degli utenti shell compatibili con posix. Questo è probabilmente "abbastanza buono" per scopi non critici.

Ma chiunque abbia a csho tcshshell non lo vedrà e non credo che cshabbia un file di inizializzazione globale.


8
/etc/environmentin realtà sembra impostare variabili di ambiente per me, anche come l'utente root. So che /etc/environmentè su Amazon Linux e Ubuntu. Non sono riuscito a verificare se funziona per csh, tcsh o zsh.
Jordan Stewart,

non è specifico per la shell che stai usando, è veramente globale
Xerus

9

Alcuni estratti interessanti dalla manpage di bash:

Quando bash viene invocato come shell di login interattiva o come shell non interattiva con l' --loginopzione, legge innanzitutto ed esegue i comandi dal file /etc/profile, se quel file esiste. Dopo aver letto il file, si cerca ~/.bash_profile, ~/.bash_logine ~/.profile, in questo ordine, e legge ed esegue i comandi dal primo che esiste ed è leggibile. L' --noprofileopzione può essere utilizzata all'avvio della shell per inibire questo comportamento.
...
Quando viene avviata una shell interattiva che non è una shell di accesso, bash legge ed esegue i comandi da /etc/bash.bashrce ~/.bashrc, se questi file esistono. Questo può essere inibito usando l' --norcopzione. Il--rcfileL'opzione file forzerà bash a leggere ed eseguire i comandi dal file anziché da /etc/bash.bashrce ~/.bashrc.

Dai un'occhiata a /etc/profileo /etc/bash.bashrc, questi file sono i posti giusti per le impostazioni globali. Metti qualcosa del genere in loro per impostare una variabile ambientale:

export MY_VAR=xxx

Si noti che sui sistemi Unix classici, sia la shell Bourne che la shell Korn leggono anche / etc / profile - è probabilmente la posizione maggiormente utilizzata per l'impostazione dell'ambiente di sistema. Alcune versioni della shell C guardano in /etc/csh.cshrc e /etc/csh.login così come nelle posizioni per utente; altri non usano alcun file di impostazione dell'ambiente di sistema.
Jonathan Leffler,

Fantastico, proprio quello che stavo cercando per impostare l'ENV per gli utenti della shell senza login.
David Mann,

Mi dispiace, sembra che io abbia accidentalmente declassato questo quando per un po 'le frecce non erano visibili ... ti dispiacerebbe modificare questo (errore di battitura "environmentEment" nella penultima riga, per esempio) in modo da poter rimuovere il downvote?
Benjamin W.

4

L'uso di PAM è eccellente.

# modify the display PAM
$ cat /etc/security/pam_env.conf 
# BEFORE: $ export DISPLAY=:0.0 && python /var/tmp/myproject/click.py &
# AFTER : $ python $abc/click.py &
DISPLAY  DEFAULT=${REMOTEHOST}:0.0 OVERRIDE=${DISPLAY}
abc   DEFAULT=/var/tmp/myproject

2

Ogni processo in esecuzione sotto il kernel Linux riceve il proprio ambiente unico che eredita dal suo genitore. In questo caso, il genitore sarà o una shell stessa (spawn di una sub shell) o il programma 'login' (su un sistema tipico).

Poiché l'ambiente di ciascun processo è protetto, non è possibile "iniettare" una variabile ambientale in ogni processo in esecuzione, quindi anche se si modifica la shell .rc / profilo predefinita, non entrerà in vigore fino a quando ciascun processo non viene chiuso e ricaricato le sue impostazioni di avvio.

Cerca in / etc / per modificare le variabili di avvio predefinite per ogni particolare shell. Basta rendersi conto che gli utenti possono (e spesso lo fanno) modificarli nelle loro singole impostazioni.

Unix è progettato per obbedire all'utente, entro certi limiti.

NB : Bash non è l' unica shell sul tuo sistema. Presta molta attenzione a ciò a cui punta effettivamente il link simbolico / bin / sh. Su molti sistemi, questo potrebbe effettivamente essere un trattino che è (per impostazione predefinita, senza invocazione speciale) POSIXLY corretto. Pertanto, è necessario fare attenzione a modificare entrambi i valori predefiniti, altrimenti gli script che iniziano con / bin / sh non erediteranno i valori predefiniti globali. Allo stesso modo, fai attenzione a evitare la sintassi che bash capisce solo quando modifica entrambi, ovvero avoiding bashisms.

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.