Cách đặt biến môi trường toàn hệ thống trên OS X Mavericks


36

Chúng tôi thường sử dụng /etc/environmentđể đặt các biến môi trường trên toàn hệ thống trên Mountain Lion. Tuy nhiên, có vẻ như tập tin này không còn được đọc.

Lý tưởng nhất là giải pháp nên áp dụng cho tất cả người dùng và chúng tôi cần nó để hoạt động với các phiên giao diện điều khiển ssh. Vì vậy, chúng tôi cần điều này để làm việc

ssh user@mavericks-machine 'echo $MY_ENV_VAR'

Cho đến nay chúng tôi đã thử:

  • /etc/launchd.conf

    Hoạt động cho tất cả người dùng, nhưng chỉ áp dụng cho các ứng dụng 'cửa sổ', tức là hoạt động trong Terminal, nhưng không hoạt động trong phiên ssh.

  • ~/.profile, ~/.bash_profileVv

    Chỉ áp dụng cho đạn pháo

Bất kỳ đề xuất?


Tệp ( /etc/environment) không được đọc vì nó không phải là bất kỳ tiêu chuẩn hệ thống chéo nào - nó chỉ là một phần của cơ sở Linux PAM. Mac OS X không phải là Linux và không sử dụng PAM, cũng như các hệ điều hành khác theo hiểu biết của tôi. Bạn chỉ thoát khỏi nó bởi vì bạn đã ở trên Linux, rõ ràng. Và có, nó vẫn đọc - Linux ;-)
Amn

Câu trả lời:


18

Các tập tin chính xác, trước Mavericks, là ~/.MacOSX/environment.plist. Điều này không còn được hỗ trợ.

Ở Darwin và do đó trong Mac OS X, vị trí thích hợp để đặt những thứ này là /etc/launchd.confđể áp dụng cho tất cả các quy trình; nếu liên quan đến shell người dùng một cách cụ thể, thay vào đó, hãy sử dụng các tệp shell thích hợp, tùy thuộc vào shell được đề cập. Xem trang launchd.conflaunchctlngười đàn ông để biết thêm.

Mà nói...

Nếu mục tiêu của bạn là cụ thể để xem những mục này được áp dụng cho các phiên ssh thì bạn cần lưu ý rằng ssh, vì lý do bảo mật, không áp dụng các biến môi trường theo cách này. Trong thực tế, một phiên ssh thường nhận được một tập hợp các biến môi trường hạn chế hơn nhiều từ HĐH vì nó không phải là lớp vỏ "đăng nhập" hay "tương tác", nó được phân loại là lớp vỏ "không tương tác". (Xem man bashđể biết thêm về các loại vỏ.) Cách ssh xử lý các biến môi trường được trình bày rõ trong các tài liệu ssh / sshd và các trang man.

Đối với ssh - đó là shell riêng, gần giống với bash - các biến môi trường cho phiên được lưu trữ ~/.ssh/environmentdưới dạng tương đương với mỗi người dùng để đặt các giá trị này cho bash hoặc csh, v.v. trong các tệp khởi chạy có liên quan của họ. Đây có lẽ là nơi bạn muốn đặt các biến ENV cho các phiên ssh của người dùng của mình, mặc dù bạn không nêu chi tiết lý do tại sao bạn muốn gán ENV trên toàn cầu trong bài đăng gốc của mình, điều này sẽ hữu ích trong việc cung cấp giải pháp. Tôi khuyên bạn nên đặt chúng rõ ràng trên cơ sở người dùng trên mỗi người dùng để duy trì bảo mật phù hợp dựa trên từng tài khoản tương ứng theo thông lệ tốt nhất về đặc quyền / thuộc tính hạn chế tối thiểu.

Nếu vì lý do nào đó bạn muốn bỏ qua ý nghĩa bảo mật của anh ta về điều này, thì hãy đặt PermitUserEnvironmenttrong cấu hình ssh của bạn. Lưu ý rằng điều này bị vô hiệu hóa nếu UseLoginđược kích hoạt. QUAN TRỌNG: Nhận ra rằng điều này có nghĩa là tài khoản người dùng được đặt /bin/falselàm vỏ của họ - phương pháp điển hình để vô hiệu hóa tài khoản người dùng - giờ đây có thể có khả năng khắc phục hạn chế này và hiện có thể hoạt động, điều này rất nguy hiểm. Nhiều tài khoản được thiết lập để sử dụng /bin/falselàm vỏ của chúng như một kỳ vọng bảo mật.

Điểm mấu chốt là bạn không nên làm điều này trên toàn cầu và mong muốn ssh tuyên truyền ENV vì lý do bảo mật. Câu hỏi của bạn là, một cách hiệu quả, cố tình hỏi làm thế nào để đánh bại một số cơ chế tồn tại vì lý do bảo mật.


Câu trả lời rất chi tiết (+10) Tôi cũng thích kết luận này :) Chào mừng bạn!
Ruskes

Tôi sẽ đề nghị rằng với sự cảnh báo an ninh, thực sự có thể có lý do hợp lệ để làm điều này. Tất cả phụ thuộc vào mô hình mối đe dọa của bạn. Nếu bạn đang thiết lập một nhóm các máy tự động thử nghiệm, có thể có ý nghĩa để làm điều này.
uchuugaka

2
Theo stackoverflow.com/a/26311753/1081043 , /etc/launchd.confkhông còn hoạt động kể từ OSX 10.10 Yosemite.
wvducky

10

Nếu bạn đang sử dụng bash, thì việc đặt các biến môi trường /etc/profilesẽ áp dụng cho tất cả người dùng.

Từ bashhướng dẫn trên OS X Mavericks , với sự nhấn mạnh của tôi (điều này không thay đổi so với các phiên bản trước):

Khi bash được gọi dưới dạng shell đăng nhập tương tác hoặc dưới dạng shell không tương tác với tùy chọn --login, trước tiên , nó sẽ đọc và thực thi các lệnh từ tệp / etc / profile, nếu tệp đó tồn tại. Sau khi đọc tệp đó, nó sẽ tìm ~ / .bash_profile, ~ / .bash_login và ~ / .profile, theo thứ tự đó, đọc và thực thi các lệnh từ lệnh đầu tiên tồn tại và có thể đọc được.
...
Nếu bash được gọi với tên sh, nó sẽ cố gắng bắt chước hành vi khởi động của các phiên bản lịch sử của sh càng gần càng tốt, đồng thời tuân thủ tiêu chuẩn POSIX. Khi được gọi dưới dạng vỏ đăng nhập hoạt động tương tác tương tác hoặc vỏ không tương tác với tùy chọn --login, trước tiên , nó sẽ cố gắng đọc và thực thi các lệnh từ / etc / profile và ~ / .profile, theo thứ tự đó.


5

Những gì bạn (và bất cứ ai khác tìm thấy câu hỏi này) gần như chắc chắn đang tìm kiếm là đường dẫn sau:

/private/etc/paths

Bạn luôn có thể đặt các chỉnh sửa của mình vào /private/etc/paths.dnếu bạn muốn tránh thay đổi tài liệu cấu hình "đường dẫn" mặc định của hệ thống chính, nhưng sau đó chúng sẽ được thêm vào cuối $PATHbiến của bạn , vì vậy nếu bạn muốn thêm thư mục ở phía trước $PATH(để ghi đè các tiện ích hệ thống mặc định, chẳng hạn), bạn sẽ chỉ phải chỉnh sửa /private/etc/pathstệp chính và thêm chúng vào đầu danh sách. Ví dụ, tôi làm điều này cho một thư mục trong đó tôi lưu trữ một số tập lệnh do tôi tự tạo, cùng với một vài tiện ích chính, chẳng hạn nhưmozjpeg, mà tôi muốn hệ thống luôn sử dụng thay vì mặc định đi kèm (theo cách đó, tất cả các tệp jpeg được lưu bởi hầu hết mọi chương trình đều được tự động nén nhiều hơn tới 10% so với tiện ích cjpeg hệ thống thông thường sẽ nén chúng - Tôi ' Tôi đã đọc rằng lý do nó không mặc định trên hầu hết các hệ thống là vì nó chậm hơn nhiều, nhưng khi bạn nói điều gì đó như 0,14 giây trái ngược với 0,02 giây, thì "chậm hơn bởi hệ số 7" không thực sự có ý nghĩa nhiều tất cả mọi thứ ... giả sử đây không phải là một máy chủ, tất nhiên). Tôi biết nhiều người có thể sẽ cảnh báo về "nguy cơ" tiềm ẩn của việc chỉnh sửa điều này sâu trong hệ thống, nhưng tôi nói rằng nếu bạn đang tìm kiếm một câu trả lời như thế này, bạn có thể biết đủ để đối phó với bất kỳ việc đặt tên tiện ích nào xung đột có thể phát sinh trong tương lai,/private/etc/pathsthực sự truyền bá chúng cho tất cả người dùng / đăng nhập / trường hợp có thể - tất cả các chương trình, trình bao, v.v. sẽ sử dụng các đường dẫn trong tệp đó để xây dựng cơ sở của $PATHbiến.

Thành thật mà nói, tôi khá ngạc nhiên không có ai khác ở đây đề cập đến điều này. Tất cả những điều gây rối với launchd và phiền nhiễu về việc sử dụng cụ thể của SSH ... đây là giải pháp mà bất cứ ai đang tìm kiếm vấn đề cơ bản này thực sự đang tìm kiếm - giải pháp sạch, dễ hiểu, luôn hoạt động.

Nhân tiện, trong trường hợp bạn đang tự hỏi, trên OS X /etcchỉ đơn giản là một liên kết tượng trưng /private/etc, vì vậy bạn có thể dễ dàng thực hiện sudo nano /etc/pathsvà đến cùng một địa điểm chính xác. Đường dẫn trên chỉ là đường dẫn thực tế hoàn chỉnh của tệp.


2
Trừ khi tôi thiếu một cái gì đó, điều đó sẽ chỉ đặt một biến môi trường toàn hệ thống - $PATH. OP dường như đang tìm kiếm một giải pháp chung - thiết lập bất kỳ var nào, toàn hệ thống $EDITOR, v.v.
John N

Ngay cả với sudolệnh, trong macOS Sierra, tôi vẫn bị từ chối cấp phép nếu tôi cố gắng tạo, sử dụng echomột tệp mới để /private/etc/paths.dchứa phần bổ sung vào đường dẫn. Nhưng nó hoạt động để đầu tiên tạo tập tin, sau đó sử dụng sudo mvđể di chuyển tập tin đến /private/etc/paths.d.
murray

Điều này đã giúp. Các thư mục khác đã được chuẩn bị cho PATH của tôi mặc dù đã đặt $ PATH trong ~/.zshrc... thủ phạm thực sự /private/etc/pathsvà tôi đã phải cập nhật tệp này. Cảm ơn.
sự không có

1

Tôi gặp vấn đề tương tự, cụ thể ~/.bashrclà không có nguồn gốc khi tôi kết nối với máy qua SSH. Tôi thấy rằng việc thay đổi cài đặt cấu hình cho SSHd đã thực hiện thủ thuật này. Có lẽ vấn đề của bạn cũng nằm ở trình nền SSH?

Sửa đổi tệp cấu hình của dịch vụ SSH như sau:

# /etc/sshd_config
PermitUserEnvironment yes

Sau đó khởi động lại dịch vụ Đăng nhập từ xa trong Tùy chọn hệ thống> Chia sẻ.

Từ sshd_configtrang hướng dẫn:

 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.

(Trong trường hợp có ích, tôi đã viết ra cách tôi đã thử nghiệm điều này trên wiki cá nhân của tôi )


1

Nếu những người khác tìm kiếm cách đặt biến môi trường cho các quy trình bắt đầu từ phiên đăng nhập đồ họa thông thường, bạn có thể sử dụng /etc/launchd.conf. Ví dụ, /usr/local/binđể thêm vào đường dẫn mặc định, hãy chạy

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

và khởi động lại để áp dụng các thay đổi. Một cách khác để áp dụng các thay đổi là chạy launchctl</etc/launchd.conf;sudo launchctl</etc/launchd.confvà khởi chạy lại các quy trình.


/etc/launchd.conf không còn được sử dụng trong launchd nữa.
uchuugaka

2
/etc/launchd.confkhông còn được hỗ trợ kể từ OSX 10.10 Yosemite
wvducky

0

Hmm ... Kể từ Mac OS X 10.10.5 và có lẽ sớm hơn, man -s5 launchd.confnói với chúng tôi: " launchd.conf is no longer respected by the system." Tôi có quá nhiều thứ đang diễn ra ngay bây giờ để đặt một biến giả trong tệp và khởi động lại để xem nó có thực sự hoạt động hay không sau đó tất cả, nhưng tài liệu nói rằng nó không nên hoạt động.

Tôi khá chắc chắn rằng nó sẽ không. Làm man launchctlvà bạn sẽ thấy: " The /etc/launchd.conf file is no longer consulted for subcommands to run during early boot time; this functionality was removed for security considerations."

Những gì bạn có thể làm là đưa tất cả các biến môi trường mà bạn muốn trở thành toàn cầu vào một số tệp, có thể được gọi là environmentphù hợp với Linux hoặc (trong trường hợp Apple quyết định làm điều gì đó sau này - bạn không bao giờ biết) environment.conf, như tôi đã làm, sau đó lấy nguồn này qua /etc/profile:

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

hoặc, nếu bạn thích định dạng nhỏ gọn:

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

Nếu bạn sử dụng một số shell khác ngoài bash nó sử dụng cú pháp cài đặt biến tương tự như bash (như zsh, tôi nghĩ vậy), bạn cũng cần phải lấy nguồn tệp này từ tệp RC toàn hệ thống của shell đó (ví dụ /etc/zshrc). Nếu bạn sử dụng shell sử dụng một cú pháp khác, ví dụ: tcsh, bạn sẽ cần duy trì một tệp tương tự cho shell đó và lấy nó từ tệp RC trên toàn hệ thống của shell (ví dụ: /etc/csh.cshrccho tcsh) hoặc tốt hơn là tạo tập lệnh tự động tạo nó, vì vậy bạn chỉ phải chỉnh sửa một tệp để thêm / thay đổi biến. Đây không phải là nơi cho một hướng dẫn như vậy; Một vài giây trên Google đã bật lên cách chuyển đổi [t] csh xuất biến thành cú pháp bash, tại https://stackoverflow.com/questions/2710790/how-to-source-a-csh-script-in-bash-to -set-the-môi trường, vì vậy có lẽ có một cái gì đó có sẵn để đi theo hướng khác.

Đó là kinh nghiệm của tôi rằng Mac OS X đang tiến xa hơn và xa hơn khỏi hành vi tệp RC dự đoán. Kể từ ít nhất 10.8, nó dường như không còn tải nữa /etc/rc.common, /etc/rc.confhoặc /etc/rc.<anything>, (ít nhất là 10.9), nó sẽ tải /etc/bash.bashrccho các vỏ không tương tác (mà chắc chắn nó sẽ làm, giống như nó tải ~/.bashrccho chúng, kể từ ngày 10.10) . Sau đó, một lần nữa tôi có Fink, MacPorts và Homebrew tất cả các công cụ cài đặt, vì vậy có thể một trong số chúng đang can thiệp vào hành vi dotfile mặc định. YMMV.


Câu hỏi dành cho OS X trước đó sẽ có một ví dụ khác như apple.stackexchange.com/questions/215932/iêu cho sau này
user151019

Bài đăng của tôi đề cập đến cả Mavericks (10.9) một phần và 10.10 một phần. Nếu quan điểm của bạn là 10.10 là một chủ đề verboten hoàn toàn trong một chủ đề khoảng 10.9, thì tôi không chắc tại sao bạn lại hướng tôi đến một chủ đề 10.11, trong đó 10.10 cũng sẽ lạc đề (nếu chủ đề trong câu hỏi không hợp lệ và dù sao cũng đóng cửa). LOL.
S. McCandlish
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.