Globale Umgebungsvariable für alle festlegen

17

Wenn ich eine Variable in setze /etc/environment, scheint dies nur für Administratoren zu gelten, die sich in befinden sudo su.

Wie kann ich erreichen, dass die Variablen auf alle angewendet werden? Besonders wenn sie im Terminal sind? Treffen die Einstellungen in /etc/enviromentnicht auf die Bash zu?

Mick.D
quelle

Antworten:

13

Das /etc/environmentUpdate funktioniert nur in der nächsten Sitzung, es wird nicht automatisch neu geladen.

Das heißt, Sie können es nicht für Sitzungen ändern, die bereits für andere Benutzer gestartet wurden.

Wenn Sie das, was sich in der befindet, "neu laden" möchten, /etc/environmentbenötigen Sie den folgenden Befehl:

source /etc/environment

Aber auch hier funktioniert es nur für Ihre aktuelle Sitzung. Andere Benutzer sind erst betroffen, wenn sie eine neue Sitzung starten oder den obigen Befehl in ihrer eigenen Sitzung ausführen.

Panthro
quelle
4

TL; DR

Diese Konfigurationsdateien, egal ob global ( /etc/environment, /etc/profile) oder benutzerspezifisch ( ~/.profile, ~/.bashrc), werden erst bei der nächsten Anmeldung / Sitzung verarbeitet.

Die globalen Dateien gelten für alle Benutzer (nicht nur für root). Sie müssen jedoch Ihre Anmeldesitzung neu starten, um die Änderungen in der Umgebung zu sehen. Dies kann geschehen, indem Sie anrufen, suwie Sie es beobachtet haben ... oder indem Sie sich abmelden / anmelden oder einen Neustart durchführen. Sie könnten suzu einem Nicht-Root-Benutzer und Sie würden sehen, dass sie auch die Umgebungsänderungen haben.

Der Grund, warum Sie neu starten oder sich erneut anmelden müssen, damit die globale Umgebung erkannt wird, ist, dass die Umgebung von übergeordneten Prozessen geerbt wird und der Stammprozess für alles andere, was Sie ausführen, Ihre Anmeldeshell ist die Umgebung ... dann auch nicht die Prozesse innerhalb der Login-Shell gestartet. Natürlich können Sie die Umgebung für einzelne Prozesse beim Starten festlegen / aktualisieren, aber Sie müssen die Umgebung für die Anmeldeshell festlegen und alle Unterprozesse neu starten, damit sie die Änderung sehen.

Globale Umwelt

Wie jemand anderes erwähnt, benötigen Sie einen Neustart oder Abmelden / login für die Änderungen /etc/profile, /etc/profile.d/*.shund /etc/environmentabgeholt werden.

Dies liegt daran, dass diese Dateien zwar eine globale Umgebung angeben, jedoch nur einmal bei der Anmeldung ausgeführt werden und vorhandene Anmeldungen / Sitzungen Änderungen an diesen Dateien nicht widerspiegeln. Ein Neustart "setzt" die Anmeldung aller zurück und zwingt sie, die neue Umgebung zu übernehmen.

In Ihrer eigenen Anmeldesitzung können Sie source /etc/profiledie Änderungen ohne Neustart oder Abmelden / Anmelden übernehmen. Dies wirkt sich jedoch nur auf Ihre eigene Sitzung und auf neue Prozesse aus, die in Ihrer Sitzung ausgeführt werden.

Beachten Sie auch, dass es keine Variableninterpolation gibt /etc/environment(es ist kein Skript), so dass Sie so etwas nicht machen PATH="$PATH:/my/custom/path"können.

Beachten Sie auch, dass /etc/profileund /etc/profile.d/*.shnur für Anmeldesitzungen ausgeführt werden und daher die dort konfigurierte Umgebung für nicht angemeldete Systemkonten nicht verfügbar ist (dh, wenn Sie versuchen, eine Umgebungsvariable für einen Dämonprozess festzulegen, der außerhalb Ihrer Anmeldeshell ausgeführt wird).

Beachten Sie, dass dies bashrcnicht zum Festlegen der Umgebung für die gesamte Anmeldeshell nützlich ist, sondern für Bash-Shells und Unterprozesse. Für echte "globale" oder "globale Benutzer" möchten Sie wahrscheinlich Ihre Umgebungskonfiguration in /etc/profileoder /etc/profile.d/my-custom-env.shoder einfügen ~/.profile. Andere Shells (z. B. zsh) haben ebenfalls ihre eigenen Konfigurationsdateien, sodass nicht bash-spezifische Umgebungskonfigurationen in einem bashrc Probleme oder Verwirrung verursachen, wenn Sie die Shells wechseln (oder andere Benutzer im System andere Shells verwenden).

Es ist ein häufiges Problem, ein neues Programm zu installieren und eine Umgebung anzugeben, damit es ordnungsgemäß ausgeführt wird. Globale Umgebung ist eine Antwort, erfordert jedoch häufig einen Neustart, der für Server und die automatische Bereitstellung / Konfiguration von Anwendungsfällen nicht ideal ist. Sie sollten sich fragen, ob dies wirklich eine Variable ist, die alle Benutzer und Programme auf dem System benötigen, oder ob dies wirklich nur etwas ist, das Sie einem bestimmten Benutzer oder Programm zur Verfügung stellen müssen.

Für einen bestimmten Benutzer

Sehen Sie sich an, wie Sie die Umgebung in profile oder bashrc in das Home-Verzeichnis des Benutzers aufnehmen (z. B. ~/.profile ~/.bashrc), je nachdem, ob Sie dies für interaktive Shells, Login-Shells, Nur-Bash-Shells usw. wünschen.

Beachten Sie, dass dies auch einen Neustart oder eine Abmeldung / Anmeldung erfordert, damit die Umgebungsänderungen für alle Prozesse in der Anmeldesitzung des Benutzers verfügbar sind. Der Benutzer kann source ~/.profile... aber dies geschieht innerhalb eines Terminals und aktualisiert nur die Umgebung innerhalb dieser Terminalsitzung und der untergeordneten Prozesse ... nicht unbedingt für die gesamte Anmeldeumgebung des Benutzers.

Für ein bestimmtes Programm gibt es einige Optionen.

Eine besteht darin, nur die Umgebung bereitzustellen, wenn der Befehl ausgeführt wird:

VAR_NAME="VAR VALUE" VAR2_NAME="VAR2_VALUE" /path/to/program --opt1 --op2

Wenn Sie systemd verwenden, können Sie die Umgebung auch in der Geräte- / Servicedatei unter [Service]mit angebenEnvironment=VAR_NAME="VAR VALUE" VAR2_NAME="VAR2_VALUE

Diese Option fühlt sich möglicherweise schwierig an, da Sie die Umgebung jedes Mal angeben müssen, wenn Sie ein Programm ausführen, aber wenn die Umgebung wirklich nur von diesem Programm benötigt wird, ist dies der beste Weg, und Sie sollten sich daran gewöhnen und nicht alles sichern in eine bashrc oder profile Datei.

Wenn Sie zum Einrichten der Umgebung und zum Ausführen des Programms nicht systemd oder init verwenden, können Sie die Programmausführung natürlich auch einfach mit einem Bash-Skript abschließen, in dem Sie den vollständigen Befehl einschließlich des Einrichtens der Umgebung speichern.

Verweise:

Hier gibt es auch eine sehr ausführliche Antwort, die Sie lesen sollten: /ubuntu//a/247769/824160

mattpr
quelle
3

Erstellen Sie ein benutzerdefiniertes Shell-Skript unter

/etc/profile.d/

Fügen Sie Ihre globalen Umgebungsvariablen in Ihr erstelltes Skript ein, starten Sie den Computer neu und er ist für alle verfügbar.

Schalamus
quelle
Ich glaube, dies ist ein zuverlässigerer Ansatz als das Bearbeiten der Datei / etc / environment, da diese Datei möglicherweise geändert wird, wenn Pakete aktualisiert werden.
Phreed
2

Das Hinzufügen einer Variablen zu /etc/environmenthat für mich funktioniert.

Allerdings musste ich nach /etc/environmentdem Wechsel neu starten, damit die Änderung wirksam wurde. Es reichte nicht aus, das Terminalfenster zu schließen und wieder zu öffnen.

kris
quelle
3
Sie können es jederzeit source /etc/environmentnachladen.
Panthro
Das Aus- und Wiedereinloggen sollte ausreichen.
Karuhanga