~/.profileобычно не читается при запуске ssh somecommand, в отличие от интерактивного сеанса SSH (или другого метода входа в систему, когда вы запускаете интерактивный сеанс).
Ssh поддерживает отправку переменных окружения. В OpenSSH используйте SendEnvдирективу in ~/.ssh/config. Однако конкретная переменная среды должна быть включена с помощью AcceptEnvдирективы в конфигурации сервера , так что это может не сработать для вас.
OpenSSH также позволяет устанавливать переменные среды на стороне сервера. Опять же, это должно быть включено в конфигурации сервера, здесь с PermitUserEnvironmentдирективой. Переменные могут быть установлены в файле ~/.ssh/environment. Предполагая, что вы используете аутентификацию с открытым ключом, вы также можете установить переменные для каждого ключа в ~/.ssh/authorized_keys: добавить environment="FOO=bar"в начале соответствующей строки.
Одна вещь, которая, я думаю, всегда работает (как ни странно), если вы используете аутентификацию с открытым ключом, - это (ab) использовать command=опцию в authorized_keysфайле. Ключ с commandопцией подходит только для запуска указанной команды; но команда в authorized_keysфайле выполняется с переменной среды, SSH_ORIGINAL_COMMANDустановленной для команды, указанной пользователем (пусто для интерактивных сеансов). Таким образом, вы можете использовать что-то вроде этого ~/.ssh/authorized_keys(конечно, это не будет применяться, если вы не используете этот ключ для аутентификации):
command="export LD_LIBRARY_PATH=\"$HOME\"/lib;
if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then
eval \"$SSH_ORIGINAL_COMMAND\";
else exec \"$SHELL\"; fi" ssh-rsa …
Обратите внимание, что я поместил разрывы строк выше для удобочитаемости, но на самом деле это все должно быть на одной строке.
Другая возможность - написать скрипт-обертку ~/bin/rsync-wrapperна сервере, что-то вроде
#!/bin/sh
. ~/.profile
exec rsync "$@"
Затем перейдите --rsync-path='bin/rsync-wrapper'в rsyncкомандную строку. Аргумент to --rsync-pathрасширяется оболочкой, поэтому, если вы предпочитаете, вы можете сделать командную строку rsync самодостаточной, передав что-то вроде --rsync-path='. ~/.profile; rsync'.
Есть еще один путь, который зависит от того, какая оболочка для входа в систему - bash или zsh. Bash всегда читает, ~/.bashrcкогда он вызывается с помощью rshd или sshd, даже если он не интерактивен (но не если он вызывается как sh). Зш всегда читает ~/.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