Официальный способ отправки переменных среды с клиента на сервер - через 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
.