Может ли хост .ssh / config иметь несколько записей HostName?

10

Я настроил ssh и переадресацию портов маршрутизатора, чтобы я мог 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. Я попытался ввести два имени хоста, но запустить ssh mycomputerтолько блоки, ничего не делая.

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

Можно ли указать резервный HostNames, чтобы попытаться, если первый не работает?

Кори Огберн
источник
unix.stackexchange.com/questions/424755/… аналогичен и, вероятно, может быть адаптирован для имени хоста вместо порта
три
Кстати, .ssh/configможно запускать сценарии для определенных свойств. Я знаю, что вы можете с ProxyCommand. Вы можете сделать что-то, как показано в этом Q & A от 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

Обратите внимание, что на самом деле это не может определить, находитесь ли вы в «своей» домашней сети - просто вы находитесь в частном сегменте локальной сети с тем же диапазоном адресов, в котором служба прослушивает один и тот же адрес / порт.

steeldriver
источник
1
Я должен был добавить -w 1или, ncказалось, ждать вечно. Что может быть проще, так это второй матч, Match exec "true"так как если первый матч не удался, просто слепо попробуйте второй вариант.
Кори Огберн
@CoreyOgburn ах да, я пытался придумать лучший способ выполнить альтернативное условие (жалко, Matchчто нет Else)
Steeldriver
Таким образом, я столкнулся с проблемой с этим подходом. Я также запустить сайт, скажем , xyz.com, и когда я попытался ssh xyz.comмой Match exec "true"поймала , что и перенаправлены меня в мой домашний сервер с помощью моего удаленного хоста. Я постараюсь с вашим руководителем, но я думаю, что то же самое произойдет.
Кори Огберн
Да, использование вашего Match exec... Match !execвызывает ssh'ing для других доменов, чтобы вызвать Match !execи переписать имя хоста.
Кори Огберн
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(время ожидания соединения 1 с), и вы можете использовать следующее поведение, чтобы избежать многократного вызова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
DopeGhoti
источник
Я думаю, это имеет смысл. Если я наберу ssh mycomputerэто, должно быть довольно однозначно, к какому компьютеру я подключаюсь.
Кори Огберн