Официальный способ отправки переменных среды с клиента на сервер - через SendEnv и AcceptEnv . Проблема в том, что вам нужен root-доступ на сервере для настройки AcceptEnv . Большинство серверов сконфигурированы так, чтобы не принимать никаких или только несколько предопределенных переменных.
Я нашел две хитрости для отправки переменных среды от клиента к серверу, оба работают без необходимости root-доступа на сервере.
хитрость первая:
ssh -t server SSH_ORIGIN=$USERNAME@$HOSTNAME bash
он подключится к серверу и затем выполнит команду SSH_ORIGIN=$USERNAME@$HOSTNAME bash с уже замененными $USERNAME и $HOSTNAME на стороне клиента. затем на стороне сервера вы можете дополнительно обработать информацию, содержащуюся в переменной SSH_ORIGIN .
-t необходим, иначе bash будет запущен на сервере без tty (попробуйте, вы увидите).
небольшая модификация позволит транзитивно передавать информацию по более длинной цепочке ssh.
ssh -t server SSH_ORIGIN=$USERNAME@$HOSTNAME:$SSH_ORIGIN bash
обсуждение:
- bash запускается как интерактивная оболочка без авторизации (
.profile не читается).
- bash запускается дважды (
.bashrc читается дважды). один раз по sshd и один раз по команде пользователя.
- он всегда запускает bash, игнорируя оболочку по умолчанию на сервере.
трюк второй:
сначала вы должны сгенерировать ключ ssh и передать его в ~/.ssh/authorized_keys на сервере. затем добавьте строку с command="$SHELL" . см. справочную страницу sshd для получения дополнительной информации об этом.
подключиться к ssh серверу с помощью команды:
ssh -t server SSH_ORIGIN=$USERNAME@$HOSTNAME
это соединится с сервером, но на этот раз присвоение переменной не выполняется. вместо этого строка сохраняется в переменной среды $SSH_ORIGINAL_COMMAND . затем выполняется команда, указанная в ~/.ssh/authorized_keys . как только вы попали в оболочку, вы можете обрабатывать информацию, содержащуюся в $SSH_ORIGINAL_COMMAND .
как указано выше, вы можете сделать это переходным:
ssh -t server SSH_ORIGIN=$USERNAME@$HOSTNAME:$SSH_ORIGIN
обсуждение:
- он запустит оболочку по умолчанию на сервере.
- он всегда запускает оболочку по умолчанию на сервере. любая команда, которую вы дадите команде ssh, будет проигнорирована и сохранена в
$SSH_ORIGINAL_COMMAND . если вы хотите выполнить команду через ssh, вы можете использовать другой ключ ssh или иметь свой файл инициализации оболочки для обнаружения и выполнения $SSH_ORIGINAL_COMMAND .