Чи може .ssh / config Host мати кілька записів HostName?


10

Я налаштував переадресацію порту ssh та маршрутизатора, щоб я міг потрапити в комп’ютер у домашній мережі, коли я не вдома. Наразі у моєму .ssh/configфайлі є два записи, один - коли я перебуваю в домашній мережі та один - коли я не:

Host mycomputer
  HostName 192.168.X.X

Host mycomputerathome
  HostName my.no-ip.dynamic

Це працює, але мені цікаво, чи можу я полегшити собі справи. Я сподівався, що існує спосіб перелічити декілька записів HostName таким чином, що якщо перша не вдасться, вона повертається до другої:

Host mycomputer
  HostName 192.168.X.X
  HostName my.no-ip.dynamic

Так що він спершу спробує підключитися до хоста в моїй локальній мережі, а якщо цього немає, він спробує підключитися, використовуючи моє ім'я динамічного хоста no-ip. Я намагався ввести два HostNames, але запускаючи ssh mycomputerпросто блоки, нічого не роблячи.

Я вимкнув автентифікацію пароля на користь ключів, тому випадково підключившись до комп'ютера в локальній мережі, коли я не в домашній мережі, не варто ризикувати, щоб пароль потрапив туди, куди він не повинен.

Чи можна вказати резервні HostNames, щоб спробувати, якщо перший не працює?


unix.stackexchange.com/questions/424755/… подібний і, ймовірно, може бути адаптований для імені хоста замість порту
триль

BTW, .ssh/configможе запускати сценарії для певних властивостей. Я знаю, що ви можете з ProxyCommand. Ви можете зробити щось, як показано в цьому запитанні від SF - serverfault.com/questions/401233/… .
slm

Відповіді:


8

Це некрасиво, але я думаю, що ви могли це зробити, використовуючи execкритерій для Matchвиходу статусу порту, наприклад

Host mycomputer
  Match exec "nc -z 192.168.1.11 %p"
    HostName 192.168.1.11
  Match !exec "nc -z 192.168.1.11 %p"
    HostName my.no-ip.dynamic

Зауважте, що це насправді не може визначити, чи перебуваєте ви у "вашій" домашній мережі - просто ви знаходитесь у приватному сегменті локальної мережі з тим самим діапазоном адрес, який, як правило, має послугу прослуховування за тією ж адресою / портом.


1
Мені довелося додати -w 1або ще, ncздавалося, чекати вічно. Що може бути простіше, це другий матч може, Match exec "true"тому що якщо перший матч не вдався, просто сліпо спробуйте другий вибір.
Корі Огберн

@CoreyOgburn ах, так, я намагався придумати кращий спосіб зробити альтернативну умову (шкода Matchне має Else)
steeldriver

Тому я зіткнувся з проблемою такого підходу. Я також запустити сайт, скажімо , xyz.com, і коли я спробував ssh xyz.comмій Match exec "true"зловила , що і перенаправлені мене в мій домашній сервер з допомогою мого віддаленого хоста. Я спробую з вашим exec, але думаю, що станеться те ж саме.
Корі Огберн

Так, використання вашого Match exec... Match !execвикликає ssh'ing в інші домени, щоб запустити Match !execі переписати HostName.
Корі Огберн

2
Ось і виходить, що ~/.ssh/configне можна було б менше піклуватися про відступи. Окремі команди скидають область, тобто кожен новий рядок хоста говорить: "попередні рядки були для попереднього хоста, наступні рядки - для цього нового хоста". Виявляється, Matchмає ту саму потужність, що "скидає область", що й Host. Щоб врахувати це, я замінив свою хост-лінію Match Host mycomputer exec "nc -w 1 -z 192.168.X.X 22"та визначив усі власні значення для моєї локальної мережі. Потім я додав відповідний рядок, за винятком !execі додав усі значення, коли я не в мережі. Зараз це чудово працює для всіх господарів.
Корі Огберн

2

Я використовую так.

Match host mycomputer exec "nc -G 1 -z 192.168.1.11 %p"
    HostName 192.168.1.11
Match host mycomputer # fallback
    HostName my.no-ip.dynamic
Host mycomputer
    # ... other configs

Host not-my-computer
# ... other configs

ssh_config не має щось подібне до блоку відступу. Якщо ви хочете обмежити відповідне речення певним хостом, то вам слід описати повну умову.

Ви можете уникнути тривалого очікування nc, надавши параметр -G 1(час очікування з'єднання 1s), а ви можете використовувати наступну поведінку, щоб уникнути багаторазового викликуnc

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

https://www.freebsd.org/cgi/man.cgi?sshd_config(5)


1

Ні; якщо ви вказали кілька HostNames для одного Hostзапису, буде підтверджено лише перший:

$ grep -A5 Host .ssh/config
Host test
   HostName fake.tld.xyzzy
   HostName real.example.com
   HostName 127.1.2.3
   User username
$ ssh test
ssh: Could not resolve hostname fake.tld.xyzzy: Name or service not known

Я думаю, це має сенс. Якщо я ввожу ssh mycomputerйого, слід досить однозначно, до якого комп'ютера я підключаюся.
Корі Огберн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.