Festlegen systemweiter Umgebungsvariablen unter OS X Mavericks

36

Früher haben wir /etc/environmentsystemweite Umgebungsvariablen für Mountain Lion festgelegt. Es scheint jedoch, dass diese Datei nicht mehr gelesen wird.

Idealerweise sollte die Lösung für alle Benutzer gelten, und wir benötigen sie, um mit SSH-Konsolensitzungen arbeiten zu können. Wir brauchen das also, um zu arbeiten

ssh user@mavericks-machine 'echo $MY_ENV_VAR'

Bisher haben wir versucht:

  • /etc/launchd.conf

    Funktioniert für alle Benutzer, gilt jedoch nur für 'windowed'-Anwendungen, dh im Terminal, jedoch nicht in einer ssh-Sitzung.

  • ~/.profile, ~/.bash_profileUsw.

    Gilt nur für Muscheln

Irgendwelche Vorschläge?

Joerick
quelle
Die Datei ( /etc/environment) wird nicht gelesen, da es sich nicht um einen systemübergreifenden Standard handelt - sie ist nur Teil der Linux PAM-Funktion. Mac OS X ist kein Linux und verwendet nach meinem Wissen weder PAM noch andere Betriebssysteme. Sie sind damit nur durchgekommen, weil Sie anscheinend unter Linux waren. Und ja, es ist immer noch lesen - von Linux ;-)
amn

Antworten:

18

Die richtige Datei vor Mavericks war ~/.MacOSX/environment.plist. Dies wird nicht mehr unterstützt.

In Darwin und daher in Mac OS X müssen diese Einstellungen /etc/launchd.confauf alle Prozesse angewendet werden. Wenn Sie sich speziell auf Benutzer-Shells beziehen, verwenden Sie stattdessen die entsprechenden Shell-Dateien, je nachdem, um welche Shell es sich handelt. Siehe launchd.confund launchctlman - Seiten für mehr.

Das gesagt...

Wenn Sie speziell darauf abzielen, dass diese für SSH-Sitzungen angewendet werden, müssen Sie sich darüber im Klaren sein, dass SSH aus Sicherheitsgründen keine Umgebungsvariablen auf diese Weise anwendet. Tatsächlich empfängt eine ssh-Sitzung normalerweise eine viel restriktivere Menge von Umgebungsvariablen vom Betriebssystem, da es sich nicht um eine sogenannte "Login" - oder "interaktive" Shell handelt, sondern um eine "nicht interaktive" Shell. (Weitere man bashInformationen zu Shell-Typen finden Sie unter.) Die Art und Weise, wie ssh mit Umgebungsvariablen umgeht, wird in den ssh / sshd-Dokumenten und Manpages ausführlich behandelt.

Bei ssh - das ist eine eigene Shell, ähnlich wie bei bash - werden Umgebungsvariablen für die Sitzung ~/.ssh/environmentals benutzerspezifische Entsprechung zum Festlegen dieser für bash oder csh usw. in den entsprechenden Startdateien gespeichert. Hier möchten Sie wahrscheinlich Ihre ENV-Variablen für Ihre Benutzer-SSH-Sitzungen festlegen, obwohl Sie nicht genau angeben, warum Sie ENVs in Ihrem ursprünglichen Beitrag global zuweisen möchten, was bei der Bereitstellung einer Lösung hilfreich gewesen wäre. Ich würde vorschlagen, dass Sie sie explizit für jeden Benutzer einzeln festlegen, um die ordnungsgemäße Sicherheit basierend auf den jeweiligen Konten gemäß der Best Practice für die geringsten Einschränkungen bei Berechtigungen und Attributen zu gewährleisten.

Wenn Sie aus irgendeinem Grund die Auswirkungen auf die Sicherheit ignorieren möchten, stellen Sie dies PermitUserEnvironmentin Ihren ssh-Konfigurationen ein. Beachten Sie, dass dies deaktiviert ist, wenn UseLoginaktiviert ist. WICHTIG: Beachten Sie, dass dies bedeutet, dass Benutzerkonten, die /bin/falseals Shell festgelegt sind - die typische Methode zum Deaktivieren eines Benutzerkontos - diese Einschränkung möglicherweise umgehen und jetzt aktiv werden können, was gefährlich ist. Viele Konten werden /bin/falseals Sicherheitserwartung als Shell verwendet.

Unterm Strich sollten Sie dies nicht global tun und erwarten, dass ssh aus Sicherheitsgründen ENV verbreitet. Ihre Frage ist effektiv, absichtlich zu fragen, wie mehrere Mechanismen, die aus Sicherheitsgründen existieren, besiegt werden können.

ColonelMode
quelle
sehr ausführliche Antwort (+10) Ich mag den Abschluss auch :) Willkommen!
Ruskes
Ich würde vorschlagen, dass es mit der Sicherheitsvorkehrung in der Tat triftige Gründe dafür gibt. Es hängt alles von Ihrem Bedrohungsmodell ab. Wenn Sie eine Gruppe von Testautomatisierungsmaschinen einrichten, ist dies möglicherweise sinnvoll.
Uchuugaka
2
Nach stackoverflow.com/a/26311753/1081043 , /etc/launchd.conffunktioniert nicht mehr , wie von OSX 10.10 Yosemite.
wisbucky
10

Wenn Sie verwenden bash, gilt das Festlegen der Umgebungsvariablen in /etc/profilefür alle Benutzer.

Aus dem bashHandbuch zu OS X Mavericks mit meinem Schwerpunkt (dies hat sich gegenüber früheren Versionen nicht geändert):

Wenn bash als interaktive Anmeldeshell oder als nicht interaktive Shell mit der Option --login aufgerufen wird, werden zuerst Befehle aus der Datei / etc / profile gelesen und ausgeführt, sofern diese Datei vorhanden ist. Nach dem Lesen dieser Datei sucht sie in dieser Reihenfolge nach ~ / .bash_profile, ~ / .bash_login und ~ / .profile und liest und führt Befehle von der ersten Datei aus, die vorhanden und lesbar ist.
...
Wenn bash mit dem Namen sh aufgerufen wird, wird versucht, das Startverhalten historischer Versionen von sh so genau wie möglich nachzuahmen, wobei auch der POSIX-Standard eingehalten wird. Beim Aufrufen als interaktive interaktive aktive Anmeldeshell oder als nicht interaktive Shell mit der Option --login wird zuerst versucht, Befehle aus / etc / profile zu lesen und auszuführen und ~ / .profile in dieser Reihenfolge.

MK
quelle
5

Was Sie (und alle anderen, die diese Frage finden) mit ziemlicher Sicherheit suchen, ist der folgende Pfad:

/private/etc/paths

Sie können Ihre Änderungen jederzeit in das /private/etc/paths.dKonfigurationsdokument "Pfade" des Hauptsystems $PATHeinfügen, wenn Sie Änderungen vermeiden möchten. Diese werden jedoch an das Ende Ihrer Variablen angehängt. Wenn Sie also Verzeichnisse vor $PATH(nach) hinzufügen möchten, müssen Sie Folgendes beachten: Wenn Sie beispielsweise Standard-Systemdienstprogramme überschreiben, müssen Sie nur die Hauptdatei /private/etc/pathsselbst bearbeiten und diese am Anfang der Liste hinzufügen. Zum Beispiel mache ich das für einen Ordner, in dem ich eine Handvoll selbst erstellter Skripte zusammen mit ein paar Schlüsseldienstprogrammen wiemozjpegIch möchte, dass das System immer die Standardeinstellungen verwendet (auf diese Weise werden alle JPEG-Dateien, die von so gut wie jedem Programm gespeichert wurden, automatisch um bis zu 10% mehr komprimiert, als das reguläre cjpeg-Dienstprogramm des Systems sie komprimieren würde). Wir haben gelesen, dass dies auf den meisten Systemen nicht der Fall ist, weil es viel langsamer ist. Wenn Sie jedoch von 0,14 Sekunden im Gegensatz zu 0,02 Sekunden sprechen, bedeutet das "um den Faktor 7 langsamer" nicht wirklich viel von irgendetwas ... vorausgesetzt, dies ist natürlich kein Server). Ich weiß, dass viele Leute wahrscheinlich vor der potenziellen "Gefahr" warnen werden, Änderungen so tief im System vorzunehmen, aber ich würde sagen, dass Sie, wenn Sie nach einer Antwort wie dieser suchen, wahrscheinlich genug wissen, um sich mit der Benennung von Dienstprogrammen zu befassen Konflikte, die möglicherweise in der Zukunft entstehen,/private/etc/pathsGibt sie wirklich an alle möglichen Benutzer / Anmeldungen / Instanzen weiter - alle Programme, Shells usw. verwenden die Pfade in dieser Datei, um die Basis ihrer $PATHVariablen zu erstellen .

Um ehrlich zu sein, bin ich ziemlich überrascht, dass hier noch niemand darauf eingegangen ist. All das Herumspielen mit Launchd und Ablenkungen zu SSH-spezifischen Anwendungen ... nach dieser Lösung sucht jeder, der nach diesem Grundproblem sucht, wirklich - nach der sauberen Lösung, die direkt an die Quelle geht und immer funktioniert.

Übrigens, für den Fall, dass Sie sich fragen, ist OS X /etceinfach ein Symlink zu /private/etc, so dass Sie es genauso einfach tun sudo nano /etc/pathsund genau an den gleichen Ort gelangen können. Der obige Pfad ist nur der vollständige tatsächliche Pfad der Datei.

Jordan Smith
quelle
2
Es sei denn, ich vermisse etwas, das nur eine systemweite Umgebungsvariable festlegt - $PATH. Das OP scheint nach einer generischen Lösung zu suchen - z. B. Einstellung einer beliebigen Umgebungsvariablen für das gesamte System $EDITORusw.
John N
Selbst mit dem sudoBefehl in macOS Sierra wird mir die Berechtigung verweigert, wenn ich versuche, echoeine neue Datei zu erstellen, /private/etc/paths.ddie einen Zusatz zum Pfad enthält. Es funktioniert jedoch, wenn Sie zuerst die Datei erstellen und dann sudo mvmit verschieben /private/etc/paths.d.
murray
Das hat geholfen. Andere Verzeichnisse wurden meinem PATH vorangestellt, obwohl in meinem ~/.zshrc... $ PATH gesetzt war. Das war in der Tat der Täter /private/etc/pathsund ich musste diese Datei aktualisieren. Vielen Dank.
Nichtsein
1

Ich hatte ein ähnliches Problem, insbesondere ~/.bashrcwurde es nicht beschafft, als ich mich über SSH mit meinem Computer verband. Ich fand, dass das Ändern einer Konfigurationseinstellung für SSHd den Trick tat. Vielleicht liegt dein Problem auch beim SSH-Daemon?

Ändern Sie die Konfigurationsdatei des SSH-Dienstes wie folgt:

# /etc/sshd_config
PermitUserEnvironment yes

Starten Sie dann den Remote-Anmeldedienst in den Systemeinstellungen> Freigabe neu.

Aus der sshd_configManpage:

 PermitUserEnvironment
         Specifies whether ~/.ssh/environment and environment= options in
         ~/.ssh/authorized_keys are processed by sshd(8).  The default is
         ``no''.  Enabling environment processing may enable users to
         bypass access restrictions in some configurations using mecha-
         nisms such as LD_PRELOAD.

(Falls es hilft, habe ich aufgeschrieben, wie ich das in meinem persönlichen Wiki getestet habe )

RobM
quelle
1

Wenn andere Benutzer nach dem Festlegen von Umgebungsvariablen für Prozesse suchen, die über eine normale grafische Anmeldesitzung gestartet wurden, können Sie diese verwenden /etc/launchd.conf. Wenn Sie beispielsweise /usr/local/binden Standardpfad hinzufügen möchten, führen Sie Folgendes aus

echo setenv PATH /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin|sudo tee -a /etc/launchd.conf

und starten Sie neu, um die Änderungen zu übernehmen. Eine andere Möglichkeit, die Änderungen anzuwenden, besteht darin, launchctl</etc/launchd.conf;sudo launchctl</etc/launchd.confProzesse auszuführen und neu zu starten.

Lri
quelle
/etc/launchd.conf wird in launchd überhaupt nicht mehr verwendet.
Uchuugaka
2
/etc/launchd.confwird nicht mehr unterstützt seit OSX 10.10 Yosemite
wisbucky
0

Hmm ... Ab Mac OS X 10.10.5 und wahrscheinlich früher heißt es man -s5 launchd.conf: " launchd.conf is no longer respected by the system." Ich habe momentan zu viel zu tun , um eine Dummy-Variable in die Datei aufzunehmen und neu zu starten, um zu sehen, ob sie wirklich funktioniert oder nicht alles, aber die Dokumentation sagt, es sollte nicht funktionieren.

Ich bin mir ziemlich sicher, dass es nicht so sein wird. Tun man launchctlSie und Sie werden sehen: " The /etc/launchd.conf file is no longer consulted for subcommands to run during early boot time; this functionality was removed for security considerations."

Alles, was Sie tun können , ist, alle Umgebungsvariablen, die Sie globalisieren möchten, in eine Datei zu schreiben, die möglicherweise environmentim Einklang mit Linux aufgerufen wird , oder (falls Apple sich später dazu entschließt, etwas damit zu tun - Sie wissen es nie) environment.conf, wie ich es getan habe. dann quelle dies über /etc/profile:

if [ -f /etc/environment.conf ]; then
   source /etc/environment.conf
fi

oder, wenn Sie das kompakte Format bevorzugen:

if [ -f /etc/environment.conf ]; then . /etc/environment.conf; fi

Wenn Sie eine andere Shell als bash verwenden und dieselbe Syntax mit variablen Einstellungen wie bash verwenden (wie zsh, glaube ich), müssen Sie diese Datei auch aus der systemweiten rc-Datei dieser Shell beziehen (z /etc/zshrc. B. ). Wenn Sie eine Shell verwenden, die eine andere Syntax verwendet, z. B. tcsh, müssen Sie entweder eine ähnliche Datei für diese Shell verwalten und sie aus der systemweiten rc-Datei der Shell (z. B. /etc/csh.cshrcfür tcsh) beziehen oder besser noch ein Skript erstellen Dadurch wird es automatisch generiert, sodass Sie nur eine Datei bearbeiten müssen, um Variablen hinzuzufügen / zu ändern. Dies ist nicht der richtige Ort für ein solches Tutorial. Einige Sekunden später zeigte Google unter https://stackoverflow.com/questions/2710790/how-to-source-a-csh-script-in-bash-to , wie man [t] csh-Variablenexporte in Bash-Syntax konvertiert -set-the-UmweltEs ist also wahrscheinlich etwas verfügbar, um in die andere Richtung zu gehen.

Ich habe die Erfahrung gemacht, dass Mac OS X immer weiter vom vorhersehbaren Verhalten von RC-Dateien abweicht. Ab mindestens 10.8 scheint es nicht mehr geladen zu werden /etc/rc.common, /etc/rc.confoder /etc/rc.<anything>(seit mindestens 10.9) wird es nicht mehr /etc/bash.bashrcfür interaktive, nicht angemeldete Shells geladen (was es auf jeden Fall tun sollte, genau wie es ab ~/.bashrc10.10 noch für sie geladen wird). . Andererseits habe ich Fink, MacPorts und Homebrew alle Sachen installiert, also stört vielleicht eine von ihnen das Standardverhalten von Dotfiles. YMMV.

S. McCandlish
quelle
Frage ist, für frühere OS X wird es andere geben, zB apple.stackexchange.com/questions/215932/… für spätere
user151019
Mein Beitrag befasste sich sowohl mit Mavericks (10.9) als auch mit 10.10. Wenn Sie der Meinung sind, dass 10.10 ein verbotenes Thema in einem Thread über 10.9 ist, bin ich mir nicht sicher, warum Sie mich auf einen 10.11-Thread verwiesen haben, bei dem 10.10 ebenfalls nicht zum Thema gehört (wenn der betreffende Thread nicht ungültig und nicht ungültig wäre) trotzdem geschlossen). LOL.
S. McCandlish