~/.profileвиконується лише оболонками для входу. Програма, яка викликає оболонку, вирішує, чи буде оболонка оболонкою для входу (шляхом введення в -якості першого символу нульового аргументу виклику оболонки). Зазвичай він не виконується під час входу для виконання певної команди.
Зокрема, OpenSSH викликає оболонку входу, лише якщо ви не вказали команду. Отже, якщо ви вкажете команду, ~/.profileвона не буде прочитана.
OpenSSH дозволяє встановити змінні середовища на стороні сервера. Це повинно бути включено в налаштуваннях сервера з PermitUserEnvironmentдирективою. Змінні можна встановити у файлі ~/.ssh/environment. Припустимо, що ви використовуєте аутентифікацію відкритих ключів, ви також можете встановити змінні для кожного ключа у ~/.ssh/authorized_keys: додати environment="FOO=bar"на початку відповідного рядка.
Ssh також підтримує надсилання змінних середовища. У OpenSSH використовуйте SendEnvдирективу в ~/.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