~/.profilechỉ đượ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, ~/.profilesẽ 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 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.
Ssh cũng 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.
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. 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, unisonv.v. Truyền --rsync-path='bin/rsync'vào rsyncdò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 ~/.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