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