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