Làm cách nào để đặt biến môi trường cho mọi người trong hệ thống linux của tôi?


132

Tôi có thể có một số cài đặt phổ biến cho tất cả người dùng của mình không?


2
Có phải là XUẤT KHẨU? nối đó và nó là toàn cầu?
TIMEX

Tôi nghĩ rằng nó chỉ được nối vào phiên hiện tại, khi bạn mở phiên mới trong thiết bị đầu cuối, nó sẽ biến mất
Haryono Sariputra

Câu trả lời:


103

Cũng như /etc/profilenhững gì người khác đã đề cập, một số hệ thống Linux hiện sử dụng một thư mục /etc/profile.d/; bất kỳ .shtập tin trong đó sẽ có nguồn gốc bởi /etc/profile. Nó gọn gàng hơn một chút để giữ các công cụ môi trường tùy chỉnh của bạn trong các tệp này hơn là chỉ chỉnh sửa /etc/profile.


4
Điều gì nếu một số người dùng sử dụng shell khác, như zsh?
Matthieu Napoli

70
đây không phải là toàn cầu ... nó bị giới hạn trong vỏ .. quá tệ, đó là câu trả lời được chấp nhận nhiều nhất
mmm

1
zsh sẽ lấy các tệp .sh trong /etc/profile.d/, bạn có thể xem nó từ / etc / zshrc @Matthieu Napoli
Bily

4
Các tập lệnh không được sử dụng cho người dùng ROOT.
Val


38

người đàn ông 8 pam_env

người đàn ông 5 pam_env.conf

Nếu tất cả các dịch vụ đăng nhập sử dụng PAM và tất cả các dịch vụ đăng nhập đều có session required pam_env.sotrong các /etc/pam.d/*tệp cấu hình tương ứng , thì tất cả các phiên đăng nhập sẽ có một số biến môi trường được đặt theo quy định trongpam_env tệp cấu hình.

Trên hầu hết các bản phân phối Linux hiện đại, tất cả đều ở đó theo mặc định - chỉ cần thêm các biến môi trường toàn cầu mong muốn của bạn vào /etc/security/pam_env.conf .

Điều này hoạt động bất kể shell của người dùng và cũng hoạt động cho thông tin đăng nhập đồ họa (nếu xdm / kdm / gdm / lối vào / Lỗi được thiết lập như thế này).


1
+1 bạn cũng cần khởi động lại sau khi thêm một biến trong pam_env.conf gây ra ngay lập tức khi đang bay $ echo $

9
Bạn không cần phải khởi động lại, bạn cần đăng nhập lại. (Không khởi động lại máy chủ quan trọng đối với tôi)
Lyndon White

Điều này dường như không áp dụng cho bản phân phối của tôi, Mint 17.2. Tệp được cài đặt sẵn hoàn toàn được nhận xét và nếu tôi thêm một cái gì đó như echo foo>/home/me/barvà khởi động lại (và đăng nhập lại), tệp đó sẽ không được tạo. (Có lẽ có một cách thanh lịch hơn để kiểm tra điều này, nhưng tôi muốn chắc chắn trước khi bình luận ở đây.)
Michael Scheper

16

Thật đáng ngạc nhiên, Unix và Linux thực sự không có nơi để đặt các biến môi trường toàn cầu. Điều tốt nhất bạn có thể làm là sắp xếp cho bất kỳ shell cụ thể nào để có một khởi tạo cụ thể theo trang web.

Nếu bạn đặt nó vào /etc/profile, điều đó sẽ giải quyết mọi thứ cho hầu hết người dùng shell tương thích posix. Điều này có lẽ là "đủ tốt" cho các mục đích không quan trọng.

Nhưng bất cứ ai có vỏ cshhoặc tcshvỏ sẽ không nhìn thấy nó và tôi không tin cshcó tệp khởi tạo toàn cầu.


8
/etc/environmentthực sự có vẻ như đặt các biến môi trường cho tôi, ngay cả với tư cách là người dùng root. Tôi biết đó /etc/environmentlà trên amazon linux và ubfox. Tôi đã không kiểm tra xem có hoạt động với csh, tcsh hoặc zsh không.
Jordan Stewart

nó không đặc trưng cho lớp vỏ bạn đang sử dụng, nó thực sự mang tính toàn cầu
Xerus

9

Một số trích đoạn thú vị từ trang bash:

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 --logintùy chọn, đầu 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ó tìm kiếm ~/.bash_profile, ~/.bash_login~/.profile, theo thứ tự đó, đọc và thực thi các lệnh từ cái đầu tiên tồn tại và có thể đọc được. Các --noprofiletùy chọn có thể được sử dụng khi vỏ được bắt đầu để ức chế hành vi này.
...
Khi một vỏ tương tác không phải là vỏ đăng nhập được khởi động, bash đọc và thực thi các lệnh từ /etc/bash.bashrc~/.bashrc, nếu các tệp này tồn tại. Điều này có thể bị ức chế bằng cách sử dụng --norctùy chọn. Các--rcfiletùy chọn tệp sẽ buộc bash đọc và thực thi các lệnh từ tệp thay vì /etc/bash.bashrc~/.bashrc.

Vì vậy, hãy xem /etc/profilehoặc /etc/bash.bashrc, các tệp này là nơi thích hợp cho các cài đặt toàn cầu. Đặt một cái gì đó như thế này vào chúng để thiết lập một biến môi trường:

export MY_VAR=xxx

Lưu ý rằng trên các hệ thống Unix cổ điển, cả vỏ Bourne và vỏ Korn cũng đọc / etc / profile - đây có thể là vị trí được sử dụng rộng rãi nhất cho cài đặt môi trường hệ thống. Một số phiên bản của trình bao C tìm trong /etc/csh.cshrc và /etc/csh.login cũng như vị trí của mỗi người dùng; những người khác không sử dụng bất kỳ tập tin thiết lập môi trường hệ thống.
Jonathan Leffler

Thật tuyệt vời, đúng như những gì tôi đang tìm kiếm cho đến khi thiết lập env cho người dùng shell không đăng nhập.
David Mann

Xin lỗi, tôi dường như đã vô tình hạ cấp điều này khi trong một thời gian các mũi tên không nhìn thấy được ... bạn có phiền khi chỉnh sửa nó không (ví dụ như "typEment" trong dòng thứ hai đến dòng cuối cùng) để tôi có thể loại bỏ downvote?
Benjamin W.

4

Sử dụng PAM là thực thi.

# modify the display PAM
$ cat /etc/security/pam_env.conf 
# BEFORE: $ export DISPLAY=:0.0 && python /var/tmp/myproject/click.py &
# AFTER : $ python $abc/click.py &
DISPLAY  DEFAULT=${REMOTEHOST}:0.0 OVERRIDE=${DISPLAY}
abc   DEFAULT=/var/tmp/myproject

2

Mỗi tiến trình chạy trong nhân Linux đều nhận được môi trường riêng, duy nhất mà nó thừa hưởng từ cha mẹ của nó. Trong trường hợp này, cha mẹ sẽ là một vỏ chính (sinh ra một vỏ con) hoặc chương trình 'đăng nhập' (trên một hệ thống điển hình).

Vì môi trường của mỗi tiến trình được bảo vệ, không có cách nào để 'tiêm' một biến môi trường cho mọi quy trình đang chạy, vì vậy ngay cả khi bạn sửa đổi shell .rc / profile mặc định, nó sẽ không có hiệu lực cho đến khi mỗi tiến trình thoát ra và tải lại cài đặt khởi động của nó.

Xem trong / etc / để sửa đổi các biến khởi động mặc định cho bất kỳ shell cụ thể nào. Chỉ cần nhận ra rằng người dùng có thể (và thường làm) thay đổi chúng trong cài đặt cá nhân.

Unix được thiết kế để tuân theo người dùng, trong giới hạn.

NB : Bash không phải là vỏ duy nhất trên hệ thống của bạn. Hãy chú ý cẩn thận đến những gì liên kết tượng trưng / bin / sh thực sự trỏ đến. Trên nhiều hệ thống, đây thực sự có thể là dấu gạch ngang (theo mặc định, không có lời gọi đặc biệt) đúng POSIXLY. Do đó, bạn nên cẩn thận sửa đổi cả mặc định hoặc tập lệnh bắt đầu bằng / bin / sh sẽ không kế thừa mặc định toàn cầu của bạn. Tương tự, hãy cẩn thận để tránh cú pháp chỉ bash hiểu khi chỉnh sửa cả hai, aka avoiding bashisms.

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.