~/.profile
chỉ được thực hiện bởi shell đăng nhập. Chương trình gọi shell quyết định xem shell có phải là shell đăng nhập hay không (bằng cách đặt -
ký tự đầu tiên của đối số zeroth vào lệnh gọi shell). Nó thường không được thực thi khi bạn đăng nhập để thực thi một lệnh cụ thể.
OpenSSH đặc biệt gọi vỏ đăng nhập chỉ khi bạn không chỉ định lệnh. Vì vậy, nếu bạn chỉ định một lệnh, ~/.profile
sẽ không được đọc.
OpenSSH cho phép thiết lập các biến môi trường ở phía máy chủ. Điều này phải được kích hoạt trong cấu hình máy chủ , với PermitUserEnvironment
chỉ thị. Các biến có thể được đặt trong tệp ~/.ssh/environment
. Giả sử bạn sử dụng xác thực khóa chung, bạn cũng có thể đặt biến per-key trong ~/.ssh/authorized_keys
: add environment="FOO=bar"
ở đầu dòng có liên quan.
Ssh cũng hỗ trợ gửi các biến môi trường. Trong OpenSSH, sử dụng SendEnv
chỉ thị trong ~/.ssh/config
. Tuy nhiên, biến môi trường cụ thể phải được bật bằng một lệnh AcceptEnv
trong cấu hình máy chủ, vì vậy điều này có thể không phù hợp với bạn.
Một điều mà tôi nghĩ luôn luôn hoạt động (đủ kỳ lạ) miễn là bạn đang sử dụng xác thực khóa chung là (ab) sử dụng command=
tùy chọn trong authorized_keys
tệp . Một khóa với một command
tùy chọn chỉ tốt khi chạy lệnh được chỉ định; nhưng lệnh trong authorized_keys
tệp chạy với biến môi trường SSH_ORIGINAL_COMMAND
được đặt thành lệnh do người dùng chỉ định. Biến này trống nếu người dùng không chỉ định lệnh và do đó mong đợi một vỏ tương tác. Vì vậy, bạn có thể sử dụng một cái gì đó như thế này ~/.ssh/authorized_keys
(tất nhiên, nó sẽ không áp dụng nếu bạn không sử dụng khóa này để xác thực):
command=". ~/.profile; if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then eval \"$SSH_ORIGINAL_COMMAND\"; else exec \"$SHELL\"; fi" ssh-rsa …
Một khả năng khác là viết một tập lệnh bao bọc trên máy chủ. Một cái gì đó như sau ~/bin/ssh-wrapper
:
#!/bin/sh
. ~/.profile
exec "${0##*/}" "$@"
Sau đó tạo các liên kết tượng trưng cho tập lệnh này được gọi rsync
, unison
v.v. Truyền --rsync-path='bin/rsync'
vào rsync
dòng lệnh, v.v. cho các chương trình khác. Ngoài ra, một số lệnh cho phép bạn chỉ định toàn bộ đoạn mã shell để chạy từ xa, cho phép bạn đặt lệnh độc lập: ví dụ: với rsync, bạn có thể sử dụng --rsync-path='. ~/.profile; rsync'
.
Có một con đường khác phụ thuộc vào vỏ đăng nhập của bạn là bash hoặc zsh. Bash luôn đọc ~/.bashrc
khi nó được gọi bởi rshd hoặc sshd, ngay cả khi nó không tương tác (nhưng không được gọi là as sh
). Zsh luôn đọc ~/.zshenv
.
## ~/.bashrc
if [[ $- != *i* ]]; then
# Either .bashrc was sourced explicitly, or this is an rsh/ssh session.
. ~/.profile
fi
## ~/.zshenv
if [[ $(ps -p $PPID -o comm=) = [rs]shd && $- != *l* ]]; then
# Not a login shell, but this is an rsh/ssh session
. ~/.profile
fi