~/.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