~/.profileзазвичай не читається під час запуску ssh somecommand, на відміну від інтерактивного сеансу ssh (або іншого способу входу, де ви запускаєте інтерактивний сеанс).
Ssh підтримує надсилання змінних середовища. У OpenSSH використовуйте SendEnvдирективу в ~/.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