Динамічно генеруйте записи хоста SSH у ~ / .ssh / config


9

Я маю адмініструвати цілу купу хостів над 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аргументі, але це було б ім'я хоста. Мені справді потрібна така собі заміна рядків, як баш ${VAR%thingie}. Чи можливо це?

Відповіді:


24

Це можна зробити за допомогою наступного конфігураційного файла 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.


6

Вам не потрібно вказувати HostName вручну, оскільки він буде надходити з командного рядка.

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

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

Проблема такого підходу полягає в тому, що ім'я хоста є досить загальним (наприклад, db1, www, mail2), тоді як я хочу, щоб вони також були встановлені з проектом, оскільки мені може знадобитися перейти на іншу машину під назвою 'db2'. Звідси префікс у Host
Rory

2
Таким чином, ви насправді хочете переналаштувати свій DNS. Найпростіше (але найбільш громіздке рішення) - це змінити ваш файл хостів. Ви можете, з іншого боку, завжди додавати локальний DNS-сервер на свою робочу станцію.
Мартін М.

Позначайте +1 попереднім. Створіть субдомен для кожного проекту. DNS є для того, щоб полегшити вам життя;)
Ден Карлі


1

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


1
Хочете поділитися своїм сценарієм? Я думав зробити це, але здається, що для надійного і загального рішення може знадобитися багато роботи, щоб виправитись. Навіть якщо ваше рішення ще не таке, було б корисно знати, що ви вважаєте, що воно стає правильним, і що ви зробили б інакше, якби це зробити.
іконоборство

Моя думка полягала в тому, щоб мати .ssh/config.dфайл для кожного шаблону, де кожен шаблон генерував би одну чи декілька записів у фіналі ~/.ssh/config. Був би також файл із універсальними змінними, але кожен шаблон може мати свої змінні, які мали б перевагу над глобальними, переліченими вгорі. ~/.ssh/configФайл може бути створений на вимогу або за розкладом, вона не має значення, до тих пір , як ви ніколи не робили прямі зміни в ньому , що ви хотіли зберегти.
іконоборство

Мій сценарій абсолютно недокументований, і я не думаю, що це було б зрозумілим без документації чи прикладів, які я не маю часу створити.
Майкл Гофман

Зрозуміло. Будемо вдячні будь-які відгуки щодо окресленого мною підходу, особливо якщо я не помічаю будь-якої важливої ​​потреби або випадку використання, або ще якісь великі (або маленькі) перешкоди.
іконоборство

1
Я думаю, що це прекрасний підхід, напевно, трохи менш заплутаний, ніж той підхід, який я використовував. Я читаю в пам'яті кілька декларацій Хоста, потім кілька декларацій, що не приймаються. Декларації, не приймаючі хост, застосовуються до кожного хоста в поточній групі, поки не з’явиться інший хост. Я також дозволяю хостам оголошувати кілька разів у файлі, включаючи використання глобулінгу. Наприкінці я виписую все, що будую на пам'ять.
Майкл Гофман

1

Ігноруйте вказівку переопределення імені хоста безпосередньо через 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

Сподіваюся, це допомагає!


0

У мене був клієнт із тією ж установкою, і я використовував DSSH для вирішення своєї проблеми.
DSSH, крім іншого, дозволяє прозоро увійти до віддалених хостів через хост шлюзу.

Використовуйте випадки

  • Зберіть параметри конфігурації з маршрутизаторів Cisco, які потребують входу "ena"
  • Увійдіть на сервери, на яких PermitRootLogin відключений безпосередньо як корінь (ввівши su - і пароль автоматично), зберігаючи статус виходу
  • Додайте власну логіку, таку як розширений журнал
  • тунель через декілька з'єднань, щоб дістатися до цільового сервера

5
Я б краще не почав використовувати якогось випадкового сторонніх клієнтів ssh, який використовує Java, для речей, які я можу робити в ~ / .ssh / config.
Rory

посилання мертве
іконоборство

Джерело програмного забезпечення можна знайти на Github: github.com/digmia/dssh
Гість
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.