~/.profile
thườ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 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.
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 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.
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 (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-wrapper
trên máy chủ, đại loại như
#!/bin/sh
. ~/.profile
exec rsync "$@"
Sau đó truyền --rsync-path='bin/rsync-wrapper'
vào rsync
dò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 ~/.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