~/.profilethường không được đọc khi bạn chạy ssh somecommand, trái ngược với phiên ssh tương tác (hoặc phương thức đăng nhập khác nơi bạn bắt đầu phiên tương tác).
Ssh hỗ trợ gửi các biến môi trường. Trong OpenSSH, sử dụng SendEnvchỉ 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 AcceptEnvtrong 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.
OpenSSH cũng cho phép thiết lập các biến môi trường ở phía máy chủ. Một lần nữa, điều này phải được kích hoạt trong cấu hình máy chủ, ở đây với PermitUserEnvironmentchỉ 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.
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_keystệp. Một khóa với một commandtùy chọn chỉ tốt khi chạy lệnh được chỉ định; nhưng lệnh trong authorized_keystệ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 (trống cho các phiên 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="export LD_LIBRARY_PATH=\"$HOME\"/lib;
if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then
eval \"$SSH_ORIGINAL_COMMAND\";
else exec \"$SHELL\"; fi" ssh-rsa …
Lưu ý rằng tôi đặt ngắt dòng ở trên cho mức độ dễ đọc, nhưng điều này thực sự cần phải nằm trên một dòng.
Một khả năng khác là viết một tập lệnh bao bọc ~/bin/rsync-wrappertrên máy chủ, đại loại như
#!/bin/sh
. ~/.profile
exec rsync "$@"
Sau đó truyền --rsync-path='bin/rsync-wrapper'vào rsyncdòng lệnh. Đối số --rsync-pathđược mở rộng bằng shell, vì vậy nếu bạn thích, bạn có thể đặt dòng lệnh rsync độc lập bằng cách chuyển một cái gì đó như --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 ~/.bashrckhi 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