Cara mengatur variabel lingkungan sistem-lebar pada OS X Mavericks


36

Kami biasa menggunakan /etc/environmentuntuk mengatur variabel lingkungan sistem-lebar pada Mountain Lion. Namun, sepertinya file ini tidak lagi dibaca.

Idealnya solusi harus berlaku untuk semua pengguna, dan kami membutuhkannya untuk bekerja dengan sesi konsol ssh. Jadi kita perlu ini berfungsi

ssh user@mavericks-machine 'echo $MY_ENV_VAR'

Sejauh ini kami sudah mencoba:

  • /etc/launchd.conf

    Bekerja untuk semua pengguna, tetapi hanya berlaku untuk aplikasi 'berjendela', yaitu berfungsi di Terminal, tetapi tidak dalam sesi ssh.

  • ~/.profile, ~/.bash_profiledll.

    Hanya berlaku untuk kerang

Ada saran?


File ( /etc/environment) tidak dibaca karena ini bukan standar lintas sistem - ini hanya bagian dari fasilitas Linux PAM. Mac OS X bukan Linux dan tidak menggunakan PAM, juga sistem operasi saya tidak sepengetahuan saya. Anda hanya lolos begitu saja karena Anda menggunakan Linux, rupanya. Dan ya, masih dibaca - oleh Linux ;-)
amn

Jawaban:


18

File yang benar, sebelum Mavericks, adalah ~/.MacOSX/environment.plist. Ini tidak lagi didukung.

Di Darwin, dan karenanya di Mac OS X, tempat yang tepat untuk mengatur ini adalah /etc/launchd.confuntuk diterapkan pada semua proses; jika berkaitan dengan shell pengguna secara khusus, gunakan file shell yang sesuai sebagai gantinya, tergantung pada shell yang dimaksud. Lihat launchd.confdan launchctlhalaman manual untuk lebih.

Yang mengatakan ...

Jika tujuan Anda secara khusus untuk melihat ini diterapkan untuk sesi ssh maka Anda perlu menyadari bahwa ssh, karena alasan keamanan, tidak menerapkan variabel lingkungan dengan cara ini. Faktanya, sesi ssh biasanya menerima serangkaian variabel lingkungan yang jauh lebih ketat dari OS karena bukan apa yang dikenal sebagai shell "login" atau "interaktif", itu diklasifikasikan sebagai shell "non-interaktif". (Lihat man bashlebih lanjut tentang tipe shell.) Cara ssh menangani variabel lingkungan tercakup dengan baik di ssh / sshd docs dan halaman manual.

Untuk ssh - yang merupakan cangkangnya sendiri, mirip dengan bash - variabel lingkungan untuk sesi disimpan ~/.ssh/environmentsebagai setara dengan per pengguna untuk pengaturan ini untuk bash atau csh, dll dalam file peluncuran yang relevan. Ini mungkin di mana Anda ingin mengatur variabel ENV Anda untuk sesi ssh pengguna Anda, meskipun Anda tidak merinci mengapa Anda ingin menetapkan ENV secara global di pos asli Anda, yang akan sangat membantu dalam memberikan solusi. Saya sarankan Anda mengaturnya secara eksplisit berdasarkan pengguna per pengguna untuk menjaga keamanan yang tepat berdasarkan masing-masing akun masing-masing mengikuti praktik terbaik hak istimewa / atribut.

Jika karena alasan tertentu Anda ingin mengabaikan implikasi keamanan ini, maka atur PermitUserEnvironmentkonfigurasi ssh Anda. Perhatikan bahwa ini dinonaktifkan jika UseLogindiaktifkan. PENTING: Sadarilah bahwa ini berarti akun pengguna ditetapkan untuk digunakan /bin/falsesebagai shell mereka - metode khas untuk menonaktifkan akun pengguna - sekarang dapat berpotensi mengatasi pembatasan ini dan sekarang dapat menjadi aktif, yang berbahaya. Banyak akun ditetapkan untuk digunakan /bin/falsesebagai shell mereka sebagai harapan keamanan.

Intinya adalah Anda tidak boleh melakukan ini secara global dan mengharapkan ssh untuk menyebarkan ENV untuk alasan keamanan. Pertanyaan Anda adalah, secara efektif, secara sengaja menanyakan bagaimana cara mengalahkan beberapa mekanisme yang ada untuk alasan keamanan.


jawaban yang sangat terperinci (+10) Saya suka kesimpulannya juga :) Selamat datang!
Ruskes

Saya menyarankan bahwa dengan peringatan keamanan, mungkin memang ada alasan yang sah untuk melakukan ini. Itu semua tergantung pada model ancaman Anda. Jika Anda menyiapkan grup mesin otomasi uji, mungkin masuk akal untuk melakukan ini.
uchuugaka

2
Menurut stackoverflow.com/a/26311753/1081043 , /etc/launchd.conftidak lagi berfungsi pada OSX 10.10 Yosemite.
wisbucky

10

Jika Anda menggunakan bash, maka pengaturan variabel lingkungan /etc/profileakan berlaku untuk semua pengguna.

Dari bashmanual pada OS X Mavericks , dengan penekanan saya (ini tidak berubah dari versi sebelumnya):

Ketika bash dipanggil sebagai shell login interaktif, atau sebagai shell non-interaktif dengan opsi --login, ia pertama kali membaca dan mengeksekusi perintah dari file / etc / profile, jika file itu ada. Setelah membaca file itu, ia mencari ~ / .bash_profile, ~ / .bash_login, dan ~ / .profile, dalam urutan itu, dan membaca serta menjalankan perintah dari yang pertama yang ada dan dapat dibaca.
...
Jika bash dipanggil dengan nama sh, ia mencoba untuk meniru perilaku startup versi historis sh sedekat mungkin, sambil menyesuaikan dengan standar POSIX juga. Ketika dipanggil sebagai shell login aktif interaktif interaktif, atau shell non-interaktif dengan opsi --login, ia pertama kali mencoba membaca dan menjalankan perintah dari / etc / profile dan ~ /. profil, dalam urutan itu.


5

Apa yang Anda (dan orang lain menemukan pertanyaan ini) hampir pasti mencari adalah jalur berikut:

/private/etc/paths

Anda selalu dapat memasukkan suntingan ke dalam /private/etc/paths.djika Anda ingin menghindari mengubah dokumen konfigurasi "jalur" default sistem utama, tetapi kemudian akan ditambahkan ke bagian akhir $PATHvariabel Anda , jadi jika Anda ingin menambahkan direktori di bagian depan $PATH(untuk menimpa utilitas sistem default, misalnya), Anda hanya perlu mengedit /private/etc/pathsfile utama itu sendiri dan menambahkannya ke bagian atas daftar. Sebagai contoh, saya melakukan ini untuk folder di mana saya menyimpan beberapa skrip yang saya buat sendiri, bersama dengan beberapa utilitas utama, sepertimozjpeg, bahwa saya ingin sistem untuk selalu menggunakan daripada standar yang datang dengan itu (dengan cara itu semua file jpeg disimpan oleh hampir semua program secara otomatis dikompresi hingga 10% lebih dari utilitas sistem cjpeg biasa akan mengompres mereka - I ' Sudah membaca bahwa alasannya tidak default pada kebanyakan sistem adalah karena jauh lebih lambat, tetapi ketika Anda berbicara sekitar 0,14 detik dibandingkan dengan 0,02 detik, "lebih lambat oleh faktor 7" tidak terlalu berarti. apa pun ... dengan asumsi ini bukan server, tentu saja). Saya tahu banyak orang mungkin akan memperingatkan tentang "bahaya" potensial melakukan pengeditan ini secara mendalam di sistem, tetapi saya akan mengatakan bahwa jika Anda mencari jawaban seperti ini, Anda mungkin cukup tahu untuk berurusan dengan penamaan utilitas apa pun konflik yang berpotensi timbul di masa depan,/private/etc/pathsbenar-benar menyebarkannya ke semua pengguna / login / instance yang mungkin - semua program, shell, dll akan menggunakan path dalam file itu untuk membangun basis $PATHvariabel mereka .

Sejujurnya, saya cukup terkejut tidak ada orang lain di sini yang menyebutkan ini. Semua yang dipusingkan dengan launchd dan gangguan tentang penggunaan spesifik SSH ... ini adalah solusi yang dicari siapa pun untuk masalah mendasar ini - solusi bersih, langsung ke sumber, selalu berfungsi.

Ngomong-ngomong, jika Anda bertanya-tanya, pada OS X /etchanyalah sebuah symlink /private/etc, sehingga Anda bisa dengan mudah melakukannya sudo nano /etc/pathsdan sampai ke tempat yang sama persis. Path di atas hanyalah path lengkap sebenarnya dari file.


2
Kecuali saya melewatkan sesuatu, itu hanya akan menetapkan satu variabel lingkungan sistem-lebar - $PATH. OP tampaknya mencari solusi generik - pengaturan setiap env var, seluruh sistem, misalnya $EDITOR, dll
John N

Bahkan dengan sudoperintah, di macOS Sierra, saya mendapat izin ditolak jika saya mencoba membuat, menggunakan echofile baru dalam /private/etc/paths.dberisi tambahan ke path. Tapi itu berfungsi untuk pertama-tama membuat file, lalu gunakan sudo mvuntuk memindahkan file /private/etc/paths.d.
more

Ini membantu. Direktori lain semakin ditambahkan ke PATH saya meskipun menetapkan $ PATH di ~/.zshrc... pelakunya memang /private/etc/pathsdan saya harus memperbarui file ini. Terima kasih.
nonbeing

1

Saya memiliki masalah yang sama, khususnya ~/.bashrctidak bersumber ketika saya terhubung ke mesin saya melalui SSH. Saya menemukan bahwa mengubah pengaturan konfigurasi untuk SSHd berhasil. Mungkin masalah Anda juga terletak pada daemon SSH?

Ubah file konfigurasi layanan SSH sebagai berikut:

# /etc/sshd_config
PermitUserEnvironment yes

Kemudian restart layanan Remote Login di System Preferences> Sharing.

Dari halaman sshd_configmanual:

 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.

(Jika itu membantu, saya telah menulis bagaimana saya menguji ini di wiki pribadi saya )


1

Jika orang lain mencari cara mengatur variabel lingkungan untuk proses dimulai dari sesi login grafis normal, Anda dapat menggunakan /etc/launchd.conf. Misalnya, tambahkan /usr/local/binke jalur default, jalankan

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

dan mulai kembali untuk menerapkan perubahan. Cara lain untuk menerapkan perubahan adalah menjalankan launchctl</etc/launchd.conf;sudo launchctl</etc/launchd.confdan meluncurkan kembali proses.


/etc/launchd.conf tidak lagi digunakan di launchd.
uchuugaka

2
/etc/launchd.conftidak lagi didukung sejak OSX 10.10 Yosemite
wisbucky

0

Hmm ... Pada Mac OS X 10.10.5 dan mungkin sebelumnya, man -s5 launchd.confmemberitahu kami: " launchd.conf is no longer respected by the system." Saya memiliki terlalu banyak hal yang terjadi sekarang untuk meletakkan variabel dummy dalam file dan restart untuk melihat apakah itu benar-benar berfungsi atau tidak setelah semua, tetapi dokumentasi mengatakan itu seharusnya tidak berfungsi.

Saya cukup yakin itu tidak akan terjadi. Lakukan man launchctldan Anda akan melihat: " The /etc/launchd.conf file is no longer consulted for subcommands to run during early boot time; this functionality was removed for security considerations."

Apa yang dapat Anda lakukan adalah memasukkan semua variabel lingkungan yang Anda inginkan menjadi global-ish ke dalam beberapa file, mungkin disebut environmentsesuai dengan Linux, atau (jika Apple memutuskan untuk melakukan sesuatu dengan itu nanti - Anda tidak pernah tahu) environment.conf, seperti yang saya lakukan, lalu sumber ini melalui /etc/profile:

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

atau, jika Anda lebih suka format ringkas:

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

Jika Anda menggunakan beberapa shell selain bash, dan ia menggunakan sintaks pengaturan variabel yang sama dengan bash (seperti halnya zsh, saya pikir), Anda juga perlu mencari file ini dari file rc seluruh sistem shell itu (misal /etc/zshrc). Jika Anda menggunakan shell yang menggunakan sintaks yang berbeda, misalnya tcsh, Anda harus memelihara file yang sama untuk shell itu dan mengambilnya dari file rc seluruh sistem shell (mis. /etc/csh.cshrcUntuk tcsh), atau lebih baik lagi membuat skrip yang secara otomatis menghasilkannya, jadi Anda hanya perlu mengedit satu file untuk menambah / mengubah variabel. Ini bukan tempat untuk tutorial semacam itu; beberapa detik di Google muncul cara mengubah [t] variabel csh ekspor ke sintaks bash, di https://stackoverflow.com/questions/2710790/how-to-source-a-csh-script-in-bash-to -set-the-enviroment, jadi mungkin ada sesuatu yang tersedia untuk pergi ke arah lain.

Sudah pengalaman saya bahwa Mac OS X bergerak semakin jauh dari perilaku file rc yang dapat diprediksi. Setidaknya 10.8, tampaknya tidak lagi memuat /etc/rc.common, /etc/rc.confatau /etc/rc.<anything>, atau (karena setidaknya 10.9) akan memuat /etc/bash.bashrcuntuk shell nonlogin interaktif (yang tentunya harus dilakukan, sama seperti itu memuat ~/.bashrcuntuk mereka, masih, pada 10,10) . Kemudian lagi saya memiliki Fink, MacPorts, dan Homebrew menginstal semua hal, jadi mungkin salah satunya mengganggu perilaku dotfile default. YMMV.


Pertanyaan untuk OS X sebelumnya akan ada contoh lain apple.stackexchange.com/questions/215932/… untuk nanti
user151019

Pos saya membahas Mavericks (10.9) sebagian dan 10.10 sebagian. Jika poin Anda adalah 10.10 adalah topik verboten seluruhnya dalam utas sekitar 10.9, saya tidak yakin mengapa Anda mengarahkan saya ke utas 10.11, di mana 10.10 juga akan di luar topik (jika utas yang dipermasalahkan tidak valid dan tutup juga). LOL.
S. McCandlish
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.