Trong lịch sử, các tệp hồ sơ ( /etc/profile
và ~/.profile
) được gọi khi bạn đăng nhập (trên bảng điều khiển văn bản, còn gì nữa không?) Và phục vụ nhiều mục đích:
- Đặt các biến môi trường và các tham số khác (ví dụ: umask) cho phiên.
- Chạy các chương trình bổ sung khi bắt đầu phiên (ví dụ: thông báo qua email).
- Chạy chương trình cho phiên, nếu khác với shell (ví dụ: shell khác hoặc X Window).
- Đặt tham số đầu cuối (ví dụ
stty
).
- Đặt tham số shell (ví dụ: bí danh).
Tất cả những mục đích này không được xác định là riêng biệt cho đến sau này. Bởi vì các tập lệnh hồ sơ có thể thực hiện những điều chỉ có ý nghĩa trong một phiên tương tác (tương tác đầu cuối, bắt đầu các chương trình khác), khi lời gọi shell từ xa ( rsh ) được đưa ra, nên rsh đã quyết định không gọi shell từ xa làm vỏ đăng nhập, để các kịch bản hồ sơ không được thực thi. (Một số phiên bản rshd
có tùy chọn chạy shell từ xa làm vỏ đăng nhập.) Ssh đã sao chép hành vi này để thay thế cho rsh.
Nếu bạn muốn tập lệnh hồ sơ của bạn được thực thi, bạn có thể gọi chúng một cách rõ ràng.
ssh 127.0.0.1 '. /etc/profile; . ~/.profile; ydisplay'
Lưu ý lệnh .
để tải các tập lệnh hồ sơ bên trong shell: chúng là các lệnh được thực thi bên trong shell đó, không phải là một chương trình bên ngoài.
Nếu bạn muốn đặt biến môi trường trên toàn cầu cho tất cả người dùng, có một phương pháp khác trên nhiều hệ thống: thay vì xác định nó trong /etc/profile
, hãy xác định nó trong /etc/environment
. Tập tin này được đọc thông qua các pam_env
mô-đun; hầu hết các bản phân phối Linux được thiết lập để đọc nó.
Nếu vỏ đăng nhập của bạn là bash, có khả năng hơn nữa. Thông thường, bạn không nên đặt biến môi trường.bashrc
(vì chúng sẽ không được đặt trong phiên X trừ khi bạn đi qua thiết bị đầu cuối có vỏ tương tác, vì chúng sẽ không được đặt nếu bạn đăng nhập tương tác trên bảng điều khiển văn bản hoặc hơn ssh, vì họ sẽ ghi đè cài đặt tùy chỉnh nếu bạn gọi shell trong chương trình khác). Tuy nhiên, bash có một tính năng lạ mà tôi chưa bao giờ hiểu: nó đọc ~/.bashrc
trong hai trường hợp không liên quan:
- trong shell tương tác không phải là shell đăng nhập;
- trong các shell không tương tác không phải là shell đăng nhập, nếu bash nghĩ rằng nó đã được gọi bởi
rshd
hoặc sshd
.
Khi bạn chạy một lệnh trên ssh, bạn đang ở trong trường hợp thứ hai. Bạn có thể sắp xếp để có hồ sơ của bạn đọc bằng cách đọc /etc/profile
và .profile
từ .bashrc
. Bao gồm các mã sau đây trong ~/.bashrc
:
case $- in
*i*) :;; # this is an interactive shell, fine
*) # This is not an interactive shell! This must be a non-interactive remote shell session.
. /etc/profile; . ~/.profile
return;;
esac
ydisplay
công việc? khôngssh 127.0.0.1 /usr/app/cpn/bin/ydisplay
làm việc