OS X Mavericks'te sistem çapında ortam değişkenleri nasıl ayarlanır


36

/etc/environmentMountain Lion'da sistem çapında çevre değişkenleri ayarlamak için kullanırdık . Ancak, bu dosya artık okunmuyor gibi görünüyor.

İdeal olarak çözüm tüm kullanıcılara uygulanmalı ve ssh konsolu oturumlarıyla çalışabilmeliyiz. Yani çalışmak için buna ihtiyacımız var.

ssh user@mavericks-machine 'echo $MY_ENV_VAR'

Şimdiye kadar denedik:

  • /etc/launchd.conf

    Tüm kullanıcılar için çalışır, ancak yalnızca 'pencereli' uygulamalar için geçerlidir, yani Terminal'de çalışır, ancak ssh oturumunda değil.

  • ~/.profile, ~/.bash_profileVb

    Sadece deniz kabukları için geçerlidir

Baska öneri?


/etc/environmentHerhangi bir çapraz sistem standardı olmadığı için ( ) dosyası okunmuyor - bu sadece Linux PAM tesisinin bir parçası. Mac OS X Linux değildir ve PAM kullanmaz, bildiğim kadarıyla diğer işletim sistemlerini de kullanmaz. Görünüşe göre sadece ondan uzak durduğun için ondan kaçtın. Ve evet, hala okunur - ;-) Linux tarafından
amn

Yanıtlar:


18

Mavericks'ten önce doğru dosya ~/.MacOSX/environment.plist. Bu artık desteklenmiyor.

Darwin'de ve dolayısıyla Mac OS X'te, bunları ayarlamak için uygun yer /etc/launchd.conftüm süreçlere uygulanacak; Özellikle kullanıcı kabukları ile ilgili ise, ilgili kabuğa bağlı olarak uygun kabuk dosyalarını kullanın. Daha fazlası için launchd.confve launchctlman sayfalarına bakınız .

Bahsedilen...

Amacınız, özellikle ssh oturumları için bu başvuruları görmek ise, o zaman güvenlik nedenleriyle, ssh'nin ortam değişkenlerini bu şekilde uygulamadığını bilmeniz gerekir. Aslında, bir ssh oturumu normal olarak işletim sisteminden "giriş" veya "etkileşimli" kabuk olarak bilinen bir şey olmadığı için işletim sisteminden çok daha kısıtlayıcı bir ortam değişkenleri kümesi alır, "etkileşimli olmayan" kabuk olarak sınıflandırılır. ( man bashKabuk türleri hakkında daha fazla bilgi için bkz .) Ssh'nin ortam değişkenlerini işleme şekli ssh / sshd docs ve man sayfalarında iyi bir şekilde ele alınmıştır.

Kendi kabuğuna sahip olan ssh için, bash'e benzer - oturum için ortam değişkenleri ~/.ssh/environment, ilgili başlatma dosyalarında bash veya csh, vb. Ayarlarının kullanıcı başına eşdeğeri olarak depolanır . Bu muhtemelen, kullanıcı ssh oturumlarınız için ENV değişkenlerinizi ayarlamak istediğiniz yerdir, ancak orijinal yazınızda neden ENV'leri genel olarak atamak istediğinizi ayrıntılarına eklemediniz, bu da bir çözüm sağlamada yardımcı olabilir. En az kısıtlayıcı imtiyaz / öznitelik en iyi uygulamasının ardından her bir hesaba göre uygun güvenliği sağlamak için onları kullanıcı bazında açıkça ayarlamanızı öneririm.

Herhangi bir nedenden dolayı bunun güvenlik etkilerini göz ardı etmek istiyorsanız PermitUserEnvironment, ssh yapılandırmalarınızı ayarlayın. UseLoginEtkinse , devre dışı olduğunu unutmayın. ÖNEMLİ: Bunun, kullanıcı hesaplarının /bin/falsekabuk olarak kullanmaya ayarlandığı anlamına gelir - bir kullanıcı hesabını devre dışı bırakmanın tipik yöntemi - şimdi bu kısıtlamanın üstesinden gelebilir ve şimdi tehlikeli olabilir, bu da aktif olabilir. Pek çok hesap, /bin/falsegüvenlik beklentisi olarak kabukları olarak kullanılacak şekilde ayarlanmıştır .

Sonuç olarak, bunu küresel olarak yapmamalı ve ssh'nin ENV'yi güvenlik nedenleriyle yaymasını beklememelisin. Sorunuz, etkili bir şekilde, bilerek güvenlik nedeniyle var olan çeşitli mekanizmaları nasıl yeneceğinizi sormaktır.


çok ayrıntılı cevap (+10) Sonucu da beğendim :) Hoşgeldiniz!
Ruskes

Güvenlik ihtarı ile bunu yapmak için gerçekten geçerli nedenlerin olabileceğini öneriyorum. Hepsi senin tehdit modeline bağlı. Bir grup test otomasyon makinesi kuruyorsanız, bunun yapılması mantıklı olabilir.
uchuugaka

2
Stackoverflow.com/a/26311753/1081043'e göre , /etc/launchd.confartık OSX 10.10 Yosemite'den itibaren çalışmaz.
wisbucky

10

Kullanıyorsanız bash, ortam değişkenlerini içinde ayarlamak /etc/profiletüm kullanıcılar için geçerli olacaktır.

Gönderen bashOS X Mavericks kılavuzuna benim durularak, (bu, daha önceki sürümlerden değişmedi):

Bash etkileşimli bir giriş kabuğu olarak veya --login seçeneğiyle etkileşimli olmayan bir kabuk olarak çağrıldığında, önce bu dosya varsa / etc / profile dosyasındaki komutları okur ve yürütür. Bu dosyayı okuduktan sonra, bu sırayla ~ / .bash_profile, ~ / .bash_login ve ~ / .profile ifadelerini arar ve var olan ve okunabilen ilk komuttan komutları okur ve yürütür.
...
Eğer sh adıyla bash çağrılırsa, sh'ın tarihsel sürümlerinin başlangıç ​​davranışını mümkün olduğunca yakından taklit etmeye çalışır ve POSIX standardına da uyar. Bir etkileşimli etkileşimli aktif giriş kabuğu veya --login seçeneğiyle etkileşimli olmayan bir kabuk olarak çağrıldığında, önce / etc / profile komutlarını okumaya ve yürütmeye çalışır ve ~ / .profile, bu sırayla.


5

Neyin (ve bu soruyu başkasının bulduğu) neredeyse kesinlikle aradığınız şey:

/private/etc/paths

/private/etc/paths.dAna sistem varsayılan "yolları" yapılandırma belgesini değiştirmekten kaçınmak istiyorsanız , düzenlemelerinizi her zaman içine koyabilirsiniz , ancak daha sonra $PATHdeğişkenlerin sonuna eklenirler $PATH; varsayılan sistem yardımcı programlarını geçersiz kılma, örneğin), yalnızca ana /private/etc/pathsdosyanın kendisini düzenlemeniz ve bunları listenin en üstüne eklemeniz gerekir. Mesela, bunu kendim için yaptığım bir kaç senaryoyu sakladığım bir klasör için yapıyorum.mozjpeg, sistemin her zaman kullandığı varsayılan değerler yerine kullanılmasını istediğimden eminim (bu şekilde, hemen hemen herhangi bir program tarafından kaydedilen tüm jpeg dosyaları, normal sistem cjpeg yardımcı programının sıkıştıracağından% 10'a kadar otomatik olarak sıkıştırılır - I ' Çoğu sistemde varsayılan olmama nedeninin bunun çok daha yavaş olmasından kaynaklandığını, ancak 0.02 saniyenin aksine 0.14 saniye gibi bir şeyden bahsettiğinizde, "7 faktörüyle daha yavaş" demek gerçekten de çok önemli değil. Elbette, bunun bir sunucu olmadığını varsayarsak. Birçok insanın muhtemelen sistemde bu düzenlemeleri derinlemesine yapmanın olası "tehlikesi" hakkında uyardığını biliyorum, ancak şunu söyleyeceğim, eğer böyle bir cevap arıyorsanız, muhtemelen herhangi bir yardımcı adlandırma ile başa çıkmak için yeterince bilginiz olduğunu söyleyebilirim. Gelecekte potansiyel olarak ortaya çıkabilecek çatışmalar,/private/etc/pathsgerçekten onları mümkün olan tüm kullanıcılara / girişlere / örneklere yayar - tüm programlar, mermiler vb $PATH. değişkenlerin temelini oluşturmak için bu dosyadaki yolları kullanır .

Dürüst olmak gerekirse, burada henüz kimseden bahsetmediğinden şaşırdım. SSH'ye özgü kullanımlar hakkında lanse ve dikkat dağıtıcılıklarla uğraşan tek şey ... bu, bu temel konuyu arayan herkesin gerçekten aradığı çözüm - temiz, kaynak kodlu, daima çalışan çözüm.

Bu arada, merak ediyorsanız, OS X'te /etcbasitçe bir bağlantı var /private/etc, bu yüzden kolayca sudo nano /etc/pathsaynı şeyi yapabilmeniz için. Yukarıdaki yol, dosyanın tam yoludur.


2
Bir şeyi kaçırmazsam, bu sistem genelinde yalnızca bir tane ortam değişkeni ayarlayacaktır $PATH. OP, genel bir çözüm arıyor gibi görünüyor - herhangi bir env var, sistem genelinde, örneğin $EDITOR, vb. Ayarlama
John N

sudoKomutla bile , macOS Sierra'da, oluşturmaya çalıştığımda , yola bir ek içeren echoyeni bir dosya kullanarak izin verilmez /private/etc/paths.d. Ancak önce dosyayı oluşturmak için çalışır, sonra sudo mvdosyayı taşımak için kullanılır /private/etc/paths.d.
murray

Bu yardımcı oldu. Diğer dizinler de $ PATH ayarlamama rağmen PATH'uma hazırlanıyordu ~/.zshrc... suçlu gerçekten /private/etc/pathsve bu dosyayı güncellemem gerekiyordu. Teşekkürler.
Haziran’da

1

Benzer bir problem yaşadım, özellikle ~/.bashrcde makineme SSH ile bağlandığımda kaynaklanmadı. SSHd için bir yapılandırma ayarını değiştirmenin hile yaptığını öğrendim. Belki de sizin probleminiz SSH daemonunda da olabilir?

SSH hizmetinin yapılandırma dosyasını aşağıdaki şekilde değiştirin:

# /etc/sshd_config
PermitUserEnvironment yes

Ardından, Sistem Tercihleri> Paylaşma bölümünde Uzaktan Giriş hizmetini yeniden başlatın.

Gönderen sshd_configman:

 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.

(Yardımcı olması durumunda kişisel wikide bunu nasıl test ettiğimi yazdım )


1

Diğerleri normal bir grafik oturum açma oturumundan başlatılan işlemler için ortam değişkenlerinin nasıl ayarlanacağını araştırırsa, kullanabilirsiniz /etc/launchd.conf. Örneğin /usr/local/bin, varsayılan yola eklemek için

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

ve değişiklikleri uygulamak için yeniden başlatın. Değişiklikleri uygulamanın başka bir yolu da launchctl</etc/launchd.conf;sudo launchctl</etc/launchd.confişlemleri çalıştırmak ve yeniden başlatmaktır.


/etc/launchd.conf artık fırlatmada kullanılmıyor.
uchuugaka

2
/etc/launchd.confartık OSX
10.10'dan

0

Hmm ... Mac OS X 10.10.5'ten itibaren ve muhtemelen daha önceki sürümlerde, man -s5 launchd.confbize şunu söylüyor: " launchd.conf is no longer respected by the system." Şu anda dosyaya kukla bir değişken koymak için çok fazla işim var ve gerçekten çalışıp çalışmadığını görmek için yeniden başladım. hepsi, ancak belgeler çalışması gerektiğini söylüyor.

Olmayacağından eminim. Yapın man launchctlve göreceksiniz: " The /etc/launchd.conf file is no longer consulted for subcommands to run during early boot time; this functionality was removed for security considerations."

Ne yapabilirsiniz yapmak belki denilen bazı dosya içine global-imsi olmak isteyen tüm ortam değişkenleri konur environmentLinux ile tutmak, ya da (durumunda Elma daha sonra bir şeyler yapmaya karar - hiç belli olmaz) environment.confbenim yaptığım gibi, daha sonra bu kaynak yoluyla /etc/profile:

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

veya, kompakt formatı tercih ediyorsanız:

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

Bash dışında başka bir kabuk kullanıyorsanız ve bash ile aynı değişken ayar sözdizimini kullanıyorsa (zsh, sanırım), bu dosyayı da bu kabuğun sistem çapındaki rc dosyasından (örn. /etc/zshrc) Kaynaklamanız gerekir . Örneğin, tcsh gibi farklı bir sözdizimi kullanan bir kabuk kullanıyorsanız, o kabuk için benzer bir dosya tutmanız ve onu kabuğun sistem genelinde rc dosyasından (örneğin /etc/csh.cshrc, tcsh için) kaynak olarak kullanmanız veya daha iyi bir komut dosyası oluşturmanız gerekir. bu onu otomatik olarak oluşturur, bu nedenle değişken eklemek / değiştirmek için yalnızca bir dosyayı düzenlemeniz gerekir. Burası böyle bir eğitim için uygun değil; Google’da birkaç saniye içinde [t] csh değişken ihracatının bash sözdizimine nasıl dönüştüğü, https://stackoverflow.com/questions/2710790/how-to-source-a-csh-script-in-bash-to -Set-çevreYani, muhtemelen diğer yöne gitmek için uygun bir şeyler var.

Benim deneyimim, Mac OS X'in öngörülebilir rc dosyası davranışlarından daha ileri ve daha uzağa doğru gittiği oldu. En azından 10.8'den itibaren, artık yüklenmiyor gibi görünmüyor /etc/rc.common, /etc/rc.confya /etc/rc.<anything>da (en azından /etc/bash.bashrc10.9'dan beri) etkileşimli nonlogin kabuklar için de yükleyecek (kesinlikle yapması gereken, tıpkı ~/.bashrconlar için yüklediği gibi , yine de, 10.10'dan itibaren) . O zaman yine Fink, MacPorts ve Homebrew tüm kurulum malzemelerini kullandım, belki bunlardan biri varsayılan dotfile davranışını engelliyordur. YMMV.


Soru örneğin diğer olacaktır önceki OS X içindir apple.stackexchange.com/questions/215932/... sonrası için
user151019

Gönderim, kısmen Mavericks'e (10.9), kısmen de 10.10'a yöneldi. Amacınız, 10.10'un tamamen 10.9'luk bir iş parçacığında verboten bir konu olması durumunda, beni neden 10.10 iş parçacığına yönlendirdiğinizden emin değilim, burada 10.10 da konu dışı olacaktır (söz konusu iş parçacığı geçersiz değilse ve yine de kapalı). LOL.
S. McCandlish
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.