Передача переменных env в соединение ssh

Или, что то же самое, ни с awk, ни с cut, но сsed:

$ sed '=' file \
      | sed 'N;s/\n/</' \
      | sort -t"<" -u -k2,2 \
      | sort -t"<" -k1,1 \
      | sed 's/^[0-9]*<//'
aaa<vvv>bbb<vvv>ccc
xxx<vvv>yyy<vvv>zzz
111<vvv>222<vvv>333

Но это очень неуклюже. Последнее (решение @Kusalananda на основе awk -)намного лучше.


Только ради педагогики два первых блока sedвыше эквивалентны более компактному awkcmd:

Кусалананды.
  • sed '=' file, печатает номера строк для последующего заказа
  • sed 'N;s/\n/</', добавляет следующую строку ввода в пространство шаблонов (, то есть «соединяет текущую и следующую строки» )и заменяет конец -строки -\nна <.

3-й и последний sedлакомый кусочек, sed 's/^[0-9]*<//', заменяет номер строки и «<», поставленные ранее в начале каждой строки, ничем.


Для получения дополнительных сведений о sedвведите $ info sedв консоли.

0
02.10.2020, 09:13
1 ответ

Ssh передает только переменную среды TERMчерез (+ LANGи LC_*во многих конфигурациях по умолчанию ^1). Изменение конфигурации сервера для принятия любых переменных среды может иметь серьезные последствия (, позволяя пользователю обходить свою оболочку входа в систему и любыеForceCommandвы не должны этого делать .

Вместо того, чтобы пытаться передать их через ssh, вы можете установить их справа, как часть аргумента «удаленная команда» (s )и явно запустить интерактивную оболочку входа в систему:

ssh -t user@host AAA=tatata bash -l

Опция -tпозволяет sshвыделить псевдо-терминал -, чего он не будет делать по умолчанию, когда указана удаленная команда. Параметр -lbash — позволить запустить оболочку входа в систему, т.е.чтобы позволить ему исходить ~/.bash_loginи максимально точно имитировать способ его запуска, когда для ssh не указаны аргументы удаленной команды.

Поскольку значения переменных окружения будут расширены дважды, как на локальной, так и на удаленной стороне, вам следует заключить их в двойные кавычки, что может быстро стать неприятным:

ssh -t user@host PRICE=\\\$19 bash -l

Но если ваша конфигурация позволяет использовать LC_*envvars, вы можете просто назвать свои переменные таким образом ;-)

LC_AAA=tatata ssh user@host

или, если конфигурация вашего ssh клиента не включает LC_*вSendEnv:

LC_AAA=tatata ssh -o SendEnv=LC_AAA user@host

^1 Чтобы иметь возможность передавать дополнительные envvars через ssh, необходимы как AcceptEnvна сервере, так и SendEnvна клиенте. Найдите эти директивы в ssh*_config, чтобы узнать, каковы их значения по умолчанию в вашей системе (s ).

4
18.03.2021, 23:01

Теги

Похожие вопросы