Kiedyś używaliśmy do /etc/environment
ustawiania ogólnosystemowych zmiennych środowiskowych w Mountain Lion. Wygląda jednak na to, że ten plik nie jest już czytany.
Idealnie rozwiązanie powinno mieć zastosowanie do wszystkich użytkowników i potrzebujemy go do pracy z sesjami konsoli ssh. Potrzebujemy więc tego do pracy
ssh user@mavericks-machine 'echo $MY_ENV_VAR'
Do tej pory próbowaliśmy:
/etc/launchd.conf
Działa dla wszystkich użytkowników, ale dotyczy tylko aplikacji „okienkowych”, tzn. Działa w terminalu, ale nie w sesji ssh.
~/.profile
,~/.bash_profile
Itd.Dotyczy tylko pocisków
Jakieś sugestie?
terminal
bash
environment-variables
joerick
źródło
źródło
/etc/environment
) nie jest odczytywany, ponieważ nie jest standardem wielosystemowym - jest tylko częścią systemu Linux PAM. Mac OS X nie jest Linuksem i nie używa PAM ani innych systemów operacyjnych, o ile mi wiadomo. Udało ci się to tylko dlatego, że najwyraźniej byłeś na Linuksie. I tak, nadal jest czytany - przez Linuksa ;-)Odpowiedzi:
Prawidłowy plik, przed Mavericks, był
~/.MacOSX/environment.plist
. To nie jest już obsługiwane.W Darwin, a zatem w Mac OS X, właściwym miejscem do ich ustawienia jest
/etc/launchd.conf
zastosowanie do wszystkich procesów; jeśli dotyczy konkretnie powłok użytkownika, zamiast tego użyj odpowiednich plików powłoki, w zależności od powłoki. Zobacz stronylaunchd.conf
ilaunchctl
man, aby uzyskać więcej.To mówi...
Jeśli Twoim celem jest, aby były one stosowane do sesji ssh, musisz mieć świadomość, że ssh, ze względów bezpieczeństwa, nie stosuje zmiennych środowiskowych w ten sposób. W rzeczywistości sesja ssh zwykle otrzymuje znacznie bardziej restrykcyjny zestaw zmiennych środowiskowych z systemu operacyjnego, ponieważ nie jest to tak zwana powłoka „login” lub „interaktywna”, jest klasyfikowana jako „nieinteraktywna” powłoka. (Zobacz
man bash
więcej na temat typów powłok.) Sposób, w jaki ssh obsługuje zmienne środowiskowe, jest dobrze opisany w dokumentach i podręcznikach ssh / sshd.W przypadku ssh - która jest jego własną powłoką, podobnie jak bash - zmienne środowiskowe dla sesji są przechowywane w
~/.ssh/environment
ekwiwalencie użytkownika dla ustawienia ich dla bash lub csh itp. W odpowiednich plikach uruchamiania. Prawdopodobnie w tym miejscu chcesz ustawić zmienne ENV dla sesji użytkownika ssh, choć nie podajesz szczegółowo, dlaczego chcesz przypisywać ENV globalnie do oryginalnego postu, co byłoby pomocne w zapewnieniu rozwiązania. Sugeruję, aby ustawić je jawnie dla poszczególnych użytkowników w celu utrzymania odpowiedniego bezpieczeństwa w oparciu o każde konto zgodnie z najlepszą praktyką w zakresie najmniej restrykcyjnych uprawnień / atrybutów.Jeśli z jakiegoś powodu chcesz zignorować wpływ tego na bezpieczeństwo, ustaw
PermitUserEnvironment
w konfiguracjach ssh. Pamiętaj, że jest to wyłączone, jeśliUseLogin
jest włączone. WAŻNE: Zdaj sobie sprawę, że oznacza to, że konta użytkowników ustawione/bin/false
jako używane jako ich powłoka - typowa metoda wyłączania konta użytkownika - mogą teraz potencjalnie obejść to ograniczenie i mogą stać się aktywne, co jest niebezpieczne. Wiele kont jest używanych/bin/false
jako powłoka jako oczekiwanie bezpieczeństwa.Najważniejsze jest to, że nie powinieneś robić tego globalnie i oczekiwać, że ssh rozpowszechni ENV ze względów bezpieczeństwa. Twoje pytanie polega na celowym pytaniu, jak pokonać kilka mechanizmów, które istnieją ze względów bezpieczeństwa.
źródło
/etc/launchd.conf
nie działa już jak z OSX 10.10 Yosemite.Jeśli używasz
bash
, to ustawienie zmiennych środowiskowych/etc/profile
będzie miało zastosowanie do wszystkich użytkowników.Z
bash
podręcznika na temat OS X Mavericks , z moim naciskiem (nie zmieniło się to w stosunku do poprzednich wersji):źródło
To, czego Ty (i ktokolwiek znajdzie to pytanie) prawie na pewno szuka, jest następująca ścieżka:
Zawsze możesz wprowadzić swoje zmiany do,
/private/etc/paths.d
jeśli chcesz uniknąć zmiany głównego dokumentu konfiguracji domyślnych ścieżek, ale wtedy zostaną one dodane na końcu$PATH
zmiennej, więc jeśli chcesz dodać katalogi z przodu$PATH
(do zastąpić domyślne narzędzia systemowe, na przykład), wystarczy edytować główny/private/etc/paths
plik i dodać je na początku listy. Na przykład robię to dla folderu, w którym przechowuję garść skryptów, które sam stworzyłem, wraz z kilkoma kluczowymi narzędziami, takimi jakmozjpeg
, że chcę, aby system zawsze używał zamiast domyślnych ustawień (w ten sposób wszystkie pliki jpeg zapisane przez prawie dowolny program są automatycznie kompresowane nawet o 10% więcej niż zwykłe systemowe narzędzie cjpeg je skompresuje - ja ' przeczytałem, że powodem, dla którego nie jest domyślny w większości systemów, jest to, że jest on znacznie wolniejszy, ale kiedy mówisz o czymś takim, jak 0,14 sekundy zamiast 0,02 sekundy, „wolniej o współczynnik 7” tak naprawdę nie znaczy wiele czegokolwiek ... zakładając, że to nie jest serwer, oczywiście). Wiem, że wiele osób prawdopodobnie ostrzega przed potencjalnym „niebezpieczeństwem” dokonania głębokich edycji w systemie, ale powiedziałbym, że jeśli szukasz takiej odpowiedzi, prawdopodobnie wiesz wystarczająco dużo, aby poradzić sobie z każdą nazwą narzędzia konflikty, które mogą potencjalnie powstać w przyszłości,/private/etc/paths
naprawdę propaguje je do wszystkich użytkowników / loginów / instancji - wszystkie programy, powłoki itp. użyją ścieżek w tym pliku, aby zbudować bazę swojej$PATH
zmiennej.Szczerze mówiąc, jestem zaskoczony, że nikt tu jeszcze o tym nie wspominał. Całe to zamieszanie związane z uruchomieniem i rozproszeniem uwagi na temat zastosowań specyficznych dla SSH ... jest to rozwiązanie, którego naprawdę szuka każdy, kto szuka tego podstawowego problemu - czyste, proste do źródła, zawsze działające rozwiązanie.
Nawiasem mówiąc, w przypadku, gdy zastanawiasz się, w OS X
/etc
jest po prostu dowiązanie symboliczne/private/etc
, dzięki czemu możesz równie łatwo zrobićsudo nano /etc/paths
to samo i dostać się w to samo miejsce. Powyższa ścieżka jest tylko pełną rzeczywistą ścieżką do pliku.źródło
$PATH
. Wydaje się, że OP szuka ogólnego rozwiązania - ustawiając dowolną env var, obejmującą cały system, np.$EDITOR
Itp.sudo
wydaniu polecenia w systemie macOS Sierra otrzymuję odmowęecho
dostępu, jeśli spróbuję utworzyć, używając nowego pliku/private/etc/paths.d
zawierającego dodatek do ścieżki. Ale najpierw trzeba utworzyć plik, a następnie użyć gosudo mv
do przeniesienia pliku/private/etc/paths.d
.~/.zshrc
... winowajcę rzeczywiście było/private/etc/paths
i musiałem zaktualizować ten plik. Dzięki.Miałem podobny problem, zwłaszcza że nie otrzymywałem
~/.bashrc
źródła, gdy podłączałem się do mojego komputera przez SSH. Odkryłem, że zmiana ustawienia konfiguracji dla SSHd załatwiła sprawę. Być może twój problem dotyczy również demona SSH?Zmodyfikuj plik konfiguracyjny usługi SSH w następujący sposób:
Następnie uruchom ponownie usługę logowania zdalnego w Preferencjach systemowych> Udostępnianie.
Z strony
sshd_config
podręcznika:(Jeśli to pomoże, napisałem, jak to przetestowałem na mojej osobistej wiki )
źródło
Jeśli inni szukają sposobu ustawiania zmiennych środowiskowych dla procesów rozpoczynanych od normalnej graficznej sesji logowania, możesz użyć
/etc/launchd.conf
. Aby na przykład dodać/usr/local/bin
do domyślnej ścieżki, uruchomi uruchom ponownie, aby zastosować zmiany. Innym sposobem na zastosowanie zmian jest uruchomienie
launchctl</etc/launchd.conf;sudo launchctl</etc/launchd.conf
i ponowne uruchomienie procesów.źródło
/etc/launchd.conf
nie jest już obsługiwany od OSX 10.10 YosemiteHmm ... Począwszy od Mac OS X 10.10.5 i prawdopodobnie wcześniej,
man -s5 launchd.conf
mówi nam: „launchd.conf is no longer respected by the system.
Mam teraz zbyt wiele rzeczy, aby umieścić zmienną fikcyjną w pliku i zrestartować, aby zobaczyć, czy to naprawdę działa, czy nie po wszystko, ale dokumentacja mówi, że to nie powinno działać.Jestem pewien, że tak nie będzie. Zrób,
man launchctl
a zobaczysz: „The /etc/launchd.conf file is no longer consulted for subcommands to run during early boot time; this functionality was removed for security considerations.
”To, co możesz zrobić, to umieścić wszystkie zmienne środowiskowe, które mają być globalne, w jakimś pliku, być może wywoływanym
environment
zgodnie z Linuksem lub (w przypadku, gdy Apple zdecyduje się coś z tym zrobić później - nigdy nie wiesz)environment.conf
, tak jak ja, następnie zdobądź to poprzez/etc/profile
:lub, jeśli wolisz format kompaktowy:
Jeśli używasz innej powłoki niż bash i używa tej samej składni ustawiania zmiennych co bash (podobnie jak Zsh, myślę), musisz również pobrać ten plik z ogólnosystemowego pliku rc tej powłoki (np
/etc/zshrc
.). Jeśli używasz powłoki, która używa innej składni, np. Tcsh, musisz albo zachować podobny plik dla tej powłoki i pobrać go z ogólnosystemowego pliku rc powłoki (np./etc/csh.cshrc
Dla tcsh), albo lepiej utworzyć skrypt który automatycznie go generuje, więc musisz edytować tylko jeden plik, aby dodać / zmienić zmienne. To nie jest miejsce na taki samouczek; kilka sekund w Google dowiedział się, jak przekonwertować [t] eksport zmiennych csh do składni bash, na https://stackoverflow.com/questions/2710790/how-to-source-a-csh-script-in-bash-to -Zestaw środowisko, więc prawdopodobnie jest coś, co można pójść w innym kierunku.Z mojego doświadczenia wynika, że Mac OS X odchodzi coraz bardziej od przewidywalnego zachowania pliku rc. Począwszy od co najmniej 10.8, nie wydaje się już ładować
/etc/rc.common
,/etc/rc.conf
ani/etc/rc.<anything>
też (ponieważ co najmniej 10.9) nie będzie ładował/etc/bash.bashrc
interaktywnych powłok nieloginowych (co z pewnością powinno działać, tak jak ładuje się~/.bashrc
dla nich, jednak od 10.10) . Z drugiej strony Fink, MacPorts i Homebrew instalują wszystkie rzeczy, więc może jeden z nich zakłóca domyślne zachowanie pliku kropkowego. YMMV.źródło