Назад | Перейти на главную страницу

Динамически генерировать записи хоста SSH в ~ / .ssh / config

Мне нужно управлять целой кучей хостов по ssh. Однако я могу получить к ним доступ только через определенный SSH-сервер шлюза.

У меня в моем ~/.ssh/config:

Host mygateway-www
Hostname www
IdentityFile ~/.ssh/id_rsa
ProxyCommand ssh mygateway nc %h 22

Однако мне приходится подключаться ко многим из этих машин. Вместо того, чтобы помещать десятки записей в мои ~/.ssh/config, есть ли у меня что-то вроде этого:

Host mygateway-*
Hostname ???WHAT GOES HERE????
IdentityFile ~/.ssh/id_rsa
ProxyCommand ssh mygateway nc %h 22

Я знаю, ты можешь использовать %h в Hostname аргумент, но это будет имя хоста. Что мне действительно нужно, так это какая-то подстановка строк, например, bash ${VAR%thingie}. Это возможно?

Это можно сделать с помощью следующего файла конфигурации SSH:

Host *
  ServerAliveInterval 120

Host gateway.somewhere.com
  User jdoe

Host gateway+*
  User jdoe
  ProxyCommand ssh -T -a $(echo %h |cut -d+ -f1).somewhere.com nc $(echo %h |cut -d+ -f2) %p 2>/dev/null
  ControlMaster auto
  ControlPath ~/.ssh/ssh-control_%r@%h:%p

Затем вы получаете доступ к своим внутренним хостам следующим образом:

ssh gateway+internalhost01.somewhere.com
ssh gateway+internalhost02.somewhere.com

Имя, которое вы выбираете для правой половины, должно разрешаться хостом перехода.

Параметр User указывается в случае, если вам необходимо вручную сопоставить разных пользователей на разных классах хостов. ControlMaster и ControlPath указаны для повторного использования SSH-соединения.

Вам не нужно вручную указывать HostName, так как оно берется из командной строки.

Просто попробуйте:

Host *.domain  
  IdentityFile ~/.ssh/id_rsa  
  ProxyCommand ssh mygateway /usr/bin/nc %h 22

Похоже, это никак нельзя сделать.

У меня была аналогичная проблема, и в итоге я написал сценарий, который сгенерировал для меня все шаблоны. Я больше не меняю ~ / ssh / config, я меняю ~ / ssh / config.in и перезапускаю свой скрипт.

Игнорируйте указание переопределения имени хоста напрямую через Hostname объявление и вместо этого определить его во время выполнения. Сделайте это, оценив его как часть ProxyCommand, с помощью %h для ссылки на него в команде (также используйте %p вместо порта жесткого кодирования как 22), т.е.

Host mygateway-*
   #Hostname ???WHAT GOES HERE????
   IdentityFile ~/.ssh/id_rsa
   ProxyCommand ssh mygateway nc $(echo %h|sed 's/^mygateway-//') %p

Можно даже иметь более общую строфу, в которой вы можете указать любой хост без - обрабатываться как есть или в соответствии с другими подходящими строфами, но иметь общий - подход к уточнению любых <gateway>-<target>:

Host *-*
   # Assume LHS of "-" is GW and RHS of "-" is target host
   IdentityFile ~/.ssh/id_rsa
   ProxyCommand ssh $(echo %h|cut -d - -f1) nc $(echo %h|cut -d - -f2-) %p

Кроме того, более новые версии клиента SSH поддерживают [-W host:port] возможность напрямую выполнять ту же функцию, что и nc (netcat). Таким образом, мы можем использовать модифицированные:

Host *-*
   # Assume LHS of "-" is GW and RHS of "-" is target host
   IdentityFile ~/.ssh/id_rsa
   ProxyCommand ssh -W $(echo %h|cut -d - -f2-):%p $(echo %h|cut -d - -f1)

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

Host host1 host2 host3 hostN
   IdentityFile ~/.ssh/id_rsa
   ProxyCommand ssh mygateway nc %h %p

Надеюсь это поможет!

У меня был клиент с такой же настройкой, и я использовал ДСШ чтобы решить мою проблему.
DSSH, помимо прочего, позволяет прозрачно входить в систему на удаленных хостах через хост-шлюз.

Случаи использования

  • Собирать параметры конфигурации с маршрутизаторов Cisco, для которых требуется вход в систему "ena"
  • Авторизуйтесь на серверах, на которых PermitRootLogin отключен, напрямую как root (автоматически набрав su и пароль), сохраняя статус выхода.
  • Добавьте настраиваемую логику, например расширенное ведение журнала
  • туннель через несколько соединений, чтобы добраться до целевого сервера