Wie setze ich Umgebungsvariablen für alle unter meinem Linux-System?

131

Kann ich bestimmte Einstellungen haben, die für alle meine Benutzer universell sind?

TIMEX
quelle
2
Ist es EXPORT? das anhängen und es ist global?
TIMEX
Ich denke, es ist nur an die aktuelle Sitzung angehängt, wenn Sie eine neue Sitzung im Terminal öffnen, würde es verschwinden
Haryono Sariputra

Antworten:

103

Wie auch /etc/profileandere erwähnt haben, verwenden einige Linux-Systeme jetzt ein Verzeichnis /etc/profile.d/. Alle .shDateien dort werden von bezogen /etc/profile. Es ist etwas ordentlicher, Ihre benutzerdefinierten Umgebungsdaten in diesen Dateien zu behalten, als sie nur zu bearbeiten /etc/profile.

Kieron
quelle
4
Was ist, wenn einige Benutzer eine andere Shell wie zsh verwenden?
Matthieu Napoli
70
Dies ist nicht global ... es ist auf die Shell beschränkt ... schade, es ist die am meisten akzeptierte Antwort
mmm
1
zsh wird .sh-Dateien in /etc/profile.d/ beschaffen, Sie können es von / etc / zshrc @Matthieu Napoli
Bily
4
Skripte werden für ROOT-Benutzer nicht verwendet.
Val
38

Mann 8 pam_env

Mann 5 pam_env.conf

Wenn alle Anmeldedienste PAM verwenden und alle Anmeldedienste session required pam_env.soin ihren jeweiligen /etc/pam.d/*Konfigurationsdateien enthalten sind, werden für alle Anmeldesitzungen einige Umgebungsvariablen festgelegt, die in pam_envder Konfigurationsdatei angegeben sind.

Bei den meisten modernen Linux-Distributionen ist dies standardmäßig alles vorhanden - fügen Sie einfach Ihre gewünschten globalen Umgebungsvariablen hinzu /etc/security/pam_env.conf.

Dies funktioniert unabhängig von der Shell des Benutzers und auch für grafische Anmeldungen (wenn xdm / kdm / gdm / entry /… so eingerichtet ist).

kurzlebig
quelle
1
+1 Sie müssen auch neu starten, nachdem Sie eine Variable in pam_env.conf hinzugefügt haben, da sofort $ echo $ Variablenname nicht
9
Sie müssen nicht neu starten, sondern müssen sich erneut anmelden. (Kein Neustart kritischer Server für mich)
Lyndon White
Dies scheint nicht auf meine Distribution Mint 17.2 zuzutreffen. Die vorinstallierte Datei ist vollständig echo foo>/home/me/barauskommentiert. Wenn ich so etwas hinzufüge und neu starte (und mich erneut anmelde ), wird diese Datei nicht erstellt. (Es gibt wahrscheinlich eine elegantere Möglichkeit, dies zu testen, aber ich wollte sicher sein, bevor ich hier kommentiere.)
Michael Scheper
16

Erstaunlicherweise haben Unix und Linux keinen Platz zum Festlegen globaler Umgebungsvariablen. Das Beste, was Sie tun können, ist, dafür zu sorgen, dass eine bestimmte Shell eine standortspezifische Initialisierung erhält.

Wenn Sie es /etc/profileeingeben, wird dies für die meisten posix-kompatiblen Shell-Benutzer erledigt. Dies ist wahrscheinlich "gut genug" für unkritische Zwecke.

Aber jeder mit einer cshoder einer tcshShell wird es nicht sehen, und ich glaube nicht, dass cshes eine globale Initialisierungsdatei gibt.

DigitalRoss
quelle
8
/etc/environmentscheint tatsächlich Umgebungsvariablen für mich zu setzen, selbst als Root-Benutzer. Ich weiß, dass /etc/environmentdas auf Amazon Linux und Ubuntu ist. Ich konnte nicht überprüfen, ob es für csh, tcsh oder zsh funktioniert.
Jordan Stewart
Es ist nicht spezifisch für die Shell, die Sie verwenden, es ist wirklich global
Xerus
9

Einige interessante Auszüge aus der Bash-Manpage:

Wenn bash als interaktive Anmeldeshell oder als nicht interaktive Shell mit der --loginOption aufgerufen wird , werden zuerst Befehle aus der Datei gelesen und ausgeführt /etc/profile, sofern diese Datei vorhanden ist. Nach dem Lesen dieser Datei sucht sie nach ~/.bash_profile, ~/.bash_loginund ~/.profilein dieser Reihenfolge und liest und führt Befehle von der ersten aus, die vorhanden und lesbar ist. Die --noprofileOption kann verwendet werden, wenn die Shell gestartet wird, um dieses Verhalten zu verhindern.
...
Wenn eine interaktive Shell gestartet wird, die keine Login-Shell ist, liest bash Befehle von /etc/bash.bashrcund ~/.bashrc, falls diese Dateien vorhanden sind. Dies kann durch Verwendung der --norcOption verhindert werden. Das--rcfileDie Dateioption zwingt bash, Befehle aus der Datei anstelle von /etc/bash.bashrcund zu lesen und auszuführen ~/.bashrc.

Schauen Sie sich also an /etc/profileoder /etc/bash.bashrc, diese Dateien sind die richtigen Stellen für globale Einstellungen. Fügen Sie so etwas ein, um eine Umgebungsvariable einzurichten:

export MY_VAR=xxx
Pascal Thivent
quelle
Beachten Sie, dass auf klassischen Unix-Systemen sowohl die Bourne-Shell als auch die Korn-Shell auch / etc / profile lesen - dies ist wahrscheinlich der am häufigsten verwendete Speicherort für die Einstellung der Systemumgebung. Einige Versionen der C-Shell befinden sich in /etc/csh.cshrc und /etc/csh.login sowie in den Positionen der Benutzer. Andere verwenden keine Einstellungsdatei für die Systemumgebung.
Jonathan Leffler
Genial, genau das, wonach ich gesucht habe, um die Umgebung für Nicht-Login-Shell-Benutzer festzulegen.
David Mann
Entschuldigung, ich habe dies anscheinend versehentlich herabgestimmt, als die Pfeile für eine Weile nicht sichtbar waren. Würde es Ihnen etwas ausmachen, dies zu bearbeiten (z. B. Tippfehler "Umgebung" in der vorletzten Zeile), damit ich die Abwertung entfernen kann?
Benjamin W.
4

Die Verwendung von PAM ist hervorragend.

# 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

quelle
2

Jeder Prozess, der unter dem Linux-Kernel ausgeführt wird, erhält eine eigene, einzigartige Umgebung, die er von seinem übergeordneten Prozess erbt. In diesem Fall ist das übergeordnete Element entweder eine Shell selbst (das eine Sub-Shell erzeugt) oder das Anmeldeprogramm (auf einem typischen System).

Da jede Prozessumgebung geschützt ist, gibt es keine Möglichkeit, jedem laufenden Prozess eine Umgebungsvariable zu "injizieren". Selbst wenn Sie die Standard-Shell .rc / profile ändern, wird sie erst wirksam, wenn jeder Prozess beendet und neu geladen wird seine Starteinstellungen.

Suchen Sie in / etc /, um die Standardstartvariablen für eine bestimmte Shell zu ändern. Stellen Sie einfach fest, dass Benutzer sie in ihren individuellen Einstellungen ändern können (und dies häufig tun).

Unix wurde entwickelt, um dem Benutzer in Grenzen zu gehorchen.

NB : Bash ist nicht die einzige Shell auf Ihrem System. Achten Sie genau darauf, worauf der symbolische Link / bin / sh tatsächlich verweist. Auf vielen Systemen kann dies tatsächlich ein Bindestrich sein, der (standardmäßig ohne besonderen Aufruf) POSIXLY korrekt ist. Daher sollten Sie darauf achten, beide Standardeinstellungen zu ändern, da sonst Skripte, die mit / bin / sh beginnen, Ihre globalen Standardeinstellungen nicht erben. Achten Sie auch darauf, Syntax zu vermeiden, die nur Bash versteht, wenn Sie beide bearbeiten, auch bekannt als avoiding bashisms.

Tim Post
quelle