~/.profile
выполняется только логинами. Программа, вызывающая оболочку, решает, будет ли оболочка входить в оболочку входа (путем помещения в -
качестве первого символа нулевого аргумента при вызове оболочки). Обычно он не выполняется при входе в систему для выполнения определенной команды.
В частности, OpenSSH вызывает оболочку входа в систему, только если вы не указали команду. Поэтому, если вы укажете команду, ~/.profile
не будут прочитаны.
OpenSSH позволяет устанавливать переменные среды на стороне сервера. Это должно быть включено в конфигурации сервера с помощью PermitUserEnvironment
директивы. Переменные могут быть установлены в файле ~/.ssh/environment
. Предполагая, что вы используете аутентификацию с открытым ключом, вы также можете установить переменные для каждого ключа в ~/.ssh/authorized_keys
: добавить environment="FOO=bar"
в начале соответствующей строки.
Ssh также поддерживает отправку переменных среды. В OpenSSH используйте SendEnv
директиву in ~/.ssh/config
. Однако конкретная переменная среды должна быть включена с помощью AcceptEnv
директивы в конфигурации сервера, так что это может не сработать для вас.
Одна вещь, которая, я думаю, всегда работает (как ни странно), если вы используете аутентификацию с открытым ключом, - это (ab) использовать command=
опцию в authorized_keys
файле . Ключ с command
опцией подходит только для запуска указанной команды; но команда в authorized_keys
файле выполняется с переменной среды, SSH_ORIGINAL_COMMAND
установленной для команды, указанной пользователем. Эта переменная пуста, если пользователь не указал команду и поэтому ожидал интерактивную оболочку. Таким образом, вы можете использовать что-то вроде этого ~/.ssh/authorized_keys
(конечно, это не будет применяться, если вы не используете этот ключ для аутентификации):
command=". ~/.profile; if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then eval \"$SSH_ORIGINAL_COMMAND\"; else exec \"$SHELL\"; fi" ssh-rsa …
Другой возможностью является написание сценариев-обёрток на сервере. Что-то вроде следующего в ~/bin/ssh-wrapper
:
#!/bin/sh
. ~/.profile
exec "${0##*/}" "$@"
Затем сделайте символические ссылки на этот сценарий под названием rsync
, unison
и т.д. Pass --rsync-path='bin/rsync'
на rsync
командной строке, и так далее для других программ. В качестве альтернативы, некоторые команды позволяют указать удаленный запуск всего фрагмента оболочки, что позволяет сделать команду автономной: например, с 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