Наследовать переменную среды в сеансе ssh?

Мне нужно иметь дело с большим количеством удаленных компьютеров, и каждая машина разделяет глобальную переменную среды (например, CONTROLLER_IP). Когда я пытаюсь ssh на удаленную машину, я хотел бы установить CONTROLLER_IP в соответствии с текущей настройкой localhost. есть ли способ сделать это возможным?

Пример:

В хосте localhost я устанавливаю значение c1 = 192.168.0.1 и ofc2 = 192.168.1.1, и мне нужно ssh tos1, ofs2. Я хотел бы сделать что-то вроде:

CONTROLLER_IP=$ofc1 ssh root@ofs1; CONTROLLER_IP=$ofc2 ssh root@ofs2

то я получу настройку CONTROLLER_IP в каждом сеансе ssh. (код, показанный выше, не работает...)

2 ответа

В /etc/sshd_config на сервере вы можете определить список принятых переменных среды с помощью параметра AcceptEnv, а затем вы можете отправить переменные среды следующим образом:

CONTROLLER_IP=$ofc1 ssh -o SendEnv=CONTROLLER_IP root@ofs1

Но это кажется немного излишним для ваших целей.

Альтернативой является передача переменных в удаленной команде, например:

ssh root@ofs1 "CONTROLLER_IP=$ofc1 somecmd"

Или, если вы запускаете несколько удаленных команд, выполните следующие действия:

ssh root@ofs1 "export CONTROLLER_IP=$ofc1; cmd1; cmd2; cmd3; ..."

Если вам нужно указать значение переменной, вы можете сделать следующее:

ssh root@ofs1 "CONTROLLER_IP='$ofc1' somecmd"


Пытаться

ssh root@ofs1 "env CONTROLLER_IP=$ofc1 somescript"

(предполагая, что $ofc1 оценивается на некоторый IP-адрес, например, 12.234.56.178 без пробелов или непослушных символов)

или, возможно,

ssh root@ofs1 "env CONTROLLER_IP='$ofc1' somescript"

если $ofc1 может содержать пробелы или непослушные символы

где somescript - скрипт на удаленной машине ofs1; если вы хотите, чтобы интерактивная оболочка пыталась

ssh root@ofs1 "env CONTROLLER_IP='$ofc1' /bin/bash"

Наконец, ssh обычно устанавливает некоторые переменные среды (на удаленном компьютере), в частности SSH_CONNECTION. Вы можете использовать его на удаленной машине. Его третьим полем является IP-адрес хоста происхождения (тот, на котором вы делаете ssh...). Поэтому возможно, что .bashrc на удаленном хосте может содержать

if [ -n "$SSH_CONNECTION" ]; then
 export CONTROLLER_IP=$(echo $SSH_CONNECTION|cut -f3 -d' ')
 fi

еще лучше, замените появление CONTROLLER_IP в ваших удаленных скриптах чем-то, используя SSH_CONNECTION

licensed under cc by-sa 3.0 with attribution.