Qual è il posto migliore per configurare le variabili di ambiente di sistema su Linux?


26

Voglio solo impostare una variabile d'ambiente a livello di sistema, JAVA_HOMEper tutti gli utenti, incluso l' utente root .

Requisiti:

  • accessibile agli utenti normali
  • accessibile alla radice
  • sempre caricato, non solo per bash (gnome-terminal non avvia una bash di default)
  • lavorare su Ubuntu, Debian e facoltativamente Red Hat
  • ottimo se l'addizione può essere facilmente copiata

Per le shell interattive, controlla questo chiedendo a Ubuntu di uscire.
cambio rapido

Risposte:


26

Dato che nessuno ha aggiunto una risposta completa qui è quello che attualmente considero il migliore, almeno per Ubuntu, ma sono aperto ad adattare la risposta per altre piattaforme * nix.

# **create**: /etc/profile.d/java.sh
export JAVA_HOME=/usr/lib/jvm/default-java

Altre opzioni che sono state già prese in considerazione ma escluse:

  • /etc/environment funziona ma è più difficile da mantenere poiché altri strumenti o persone possono modificarlo.
  • /etc/profile - come sopra

11

Su Debian / Ubuntu sarebbe / etc / environment

Non conosco l'equivalente di Red Hat.


1
Credo che / etc / environment sia deprecato
Pat James,

@PatJames hai maggiori informazioni a riguardo? Ho provato / etc / environment is non viene caricato per root anche dopo aver riavviato la macchina.
sorin,

@SorinSbarnea alcune informazioni sono qui: wiki.debian.org/Locale che indica / etc / environment non viene più utilizzato nelle versioni più recenti
Pat James,

1
Quella pagina dice solo che non dovresti ma inserire le variabili relative alla locale /etc/environment. Vedi anche serverfault.com/a/584072/26218
Flow

11

Non capisco perché hai escluso / etc / profile. Questa è la posizione corretta.


9

Alcuni hanno risposto dicendo che /etc/environmentè deprivato e / o non più usato in Debian, e questo è (come nella versione 7) falso.

Il file viene effettivamente letto da PAM, in particolare pam_env(8)tramite un envfileflag predefinito . La manpage indica anche questo valore predefinito nella sezione FILES.

I wiki citati (specialmente quello locale) affermano semplicemente che le variabili d'ambiente basate su locale ora sono pensate per essere presenti /etc/profile. La loro affermazione "(nelle versioni precedenti di Debian, anche / etc / environment)" è vaga ed è nel contesto delle versioni locali.

Un rapido sguardo veloce /etc/pam.dmostra:

root@box:/etc/pam.d# grep pam_env.so *
atd:auth        required        pam_env.so
cron:session       required   pam_env.so
cron:session       required   pam_env.so envfile=/etc/default/locale
login:session       required   pam_env.so readenv=1
login:session       required   pam_env.so readenv=1 envfile=/etc/default/locale
sshd:auth       required     pam_env.so # [1]
sshd:auth       required     pam_env.so envfile=/etc/default/locale
su:session       required   pam_env.so readenv=1
su:session       required   pam_env.so readenv=1 envfile=/etc/default/locale

Queste linee di configurazione sono additive e, poiché manca la prima envfile, per impostazione predefinita /etc/environment.

Tutto questo, ovviamente, si basa su qualunque binario che stai usando ( crond, shell di login, ecc.) Sia compilato contro PAM.

Infine, ciò implica che altri sistemi che utilizzano PAM (ad es. RedHat) si comportino allo stesso modo, come si può vedere nella rispettiva manpage.


2

Una nota a margine: dai un'occhiata all'ambiente dei moduli . Lo uso ogni volta che devo offrire un ambiente UNIX complesso, con versione, autoestensibile e conciso a dozzine o centinaia di utenti. Viene utilizzato principalmente in ambienti HPC multiutente su larga scala. Il solo utilizzo per una particolare variabile è sicuramente un'ingegnerizzazione eccessiva, ma fa un lavoro fantastico quando hai bisogno di più di alcuni pacchetti software e del loro ambiente.


1

/etc/profiledovrebbe funzionare. Ho testato proprio ora per essere sicuro, messo export SOMETEST=1234a /etc/profilee dopo il ri-registrazione echo $SOMETESTmi ha dato 1234come previsto. Anche dagnome-terminal



0

In questo caso non è possibile utilizzare file ~ specifici. così....

/etc/profilesarebbe il posto giusto per questo in questo caso. Tuttavia, gli utenti attualmente connessi devono ottenere una nuova sessione di accesso, ma questo non dovrebbe essere un grosso problema.

@ wk01: /etc/profilenon viene caricato da una shell non login per impostazione predefinita. la tua .bashrc è probabilmente caricarla ...

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.