Czy host .ssh / config może mieć wiele wpisów HostName?

10

Skonfigurowałem przekierowywanie portów ssh i routera, aby móc ssh do komputera w mojej sieci domowej, gdy nie ma mnie w domu. Obecnie w moim .ssh/configpliku są dwa wpisy: jeden dla mojej sieci domowej i jeden dla mnie, gdy nie jestem:

Host mycomputer
  HostName 192.168.X.X

Host mycomputerathome
  HostName my.no-ip.dynamic

To działa, ale zastanawiam się, czy mogę sobie ułatwić sprawę. Miałem nadzieję, że istnieje sposób na wyświetlenie listy wielu wpisów HostName, tak że jeśli pierwsza nie powiedzie się, spadnie do drugiej:

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

Tak, że najpierw spróbuje połączyć się z hostem w mojej sieci lokalnej, a jeśli go nie ma, spróbuje połączyć się przy użyciu mojej dynamicznej nazwy hosta bez adresu IP. Próbowałem wprowadzić dwie nazwy hosta, ale uruchomiłem ssh mycomputertylko bloki i nic nie robiłem.

Wyłączyłem uwierzytelnianie hasła na rzecz kluczy, więc przypadkowe połączenie z komputerem w sieci lokalnej, gdy nie jestem w sieci domowej, nie powinno ryzykować, że moje hasło dotrze tam, gdzie nie powinno.

Czy można określić zastępcze nazwy hosta, aby wypróbować, jeśli pierwszy nie działa?

Corey Ogburn
źródło
unix.stackexchange.com/questions/424755/… jest podobny i prawdopodobnie można go dostosować do nazwy hosta zamiast portu
thrig
BTW, .ssh/configmożna uruchamiać skrypty dla niektórych właściwości. Wiem, że możesz dzięki ProxyCommand. Można coś zrobić, jak pokazano w tym Q & A z SF - serverfault.com/questions/401233/... .
slm

Odpowiedzi:

8

To brzydkie, ale myślę, że można to zrobić, stosując execkryterium do Matchstatusu wyjścia z pukania do portu np

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

Zauważ, że tak naprawdę nie jest w stanie stwierdzić, czy jesteś w „domowej” sieci domowej - tylko, że jesteś w prywatnym segmencie sieci LAN z tym samym zakresem adresów, który przypadkowo ma usługę nasłuchującą na tym samym adresie / porcie.

steeldriver
źródło
1
Musiałem dodać -w 1albo ncwydawało się, że czekam wiecznie. Prostszy może być drugi mecz, Match exec "true"ponieważ jeśli pierwszy mecz się nie powiedzie, po prostu na ślepo wypróbuj drugi wybór.
Corey Ogburn,
@CoreyOgburn ah tak starałem się myśleć o ładniejszy sposób zrobić warunek alternatywny (szkoda Matchnie ma Else)
steeldriver
Więc wpadłem na problem z tym podejściem. Ja również uruchomić witrynę, powiedzmy xyz.com, a gdy próbowałem ssh xyz.commój Match exec "true"złowione i przekierowanie mnie do mojego serwera domowego używając mojego zdalnego hosta. Spróbuję z twoim dyrektorem, ale myślę, że to samo się stanie.
Corey Ogburn,
Tak, użycie twojego Match exec... Match !execpowoduje, że ssh'ing do innych domen wyzwala Match !execi przepisuje nazwę hosta.
Corey Ogburn
2
Okazuje się więc, że ~/.ssh/confignie mniej ważne jest wcięcie. Niektóre polecenia resetują zakres, tzn. Każda nowa linia hosta mówi „poprzednie linie były dla poprzedniego hosta, następne linie dla tego nowego hosta”. Okazuje się Match, że ma taką samą moc „resetowania zakresu” jak Host. Aby to uwzględnić, zastąpiłem linię hosta Match Host mycomputer exec "nc -w 1 -z 192.168.X.X 22"i zdefiniowałem wszystkie niestandardowe wartości dla mojej sieci lokalnej. Następnie dodałem pasującą linię oprócz !execi dodałem wszystkie wartości, kiedy jestem poza siecią. Teraz działa dobrze dla wszystkich hostów.
Corey Ogburn,
2

Używam w ten sposób.

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 nie ma czegoś takiego jak blok wcięcia. Jeśli chcesz ograniczyć zdanie dopasowania do konkretnego hosta, powinieneś opisać pełny warunek.

Można uniknąć długiego oczekiwania nc, nadając mu -G 1opcję (limit czasu połączenia 1s), i można wykorzystać następujące zachowanie, aby uniknąć wielokrotnego wywoływanianc

Dopasuj
Wprowadza blok warunkowy. Jeśli wszystkie kryteria w wierszu Dopasuj są spełnione, słowa kluczowe w kolejnych wierszach zastępują te ustawione w globalnej sekcji pliku konfiguracyjnego, aż do kolejnej linii Dopasowania lub końca pliku. Jeśli słowo kluczowe pojawia się w wielu satysfakcjonujących blokach dopasowania, stosowana jest tylko jego pierwsza instancja.

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

SeongChan Lee
źródło
1

Nie; jeśli określisz wiele HostNames dla jednego Hostwpisu, tylko pierwszy zostanie potwierdzony:

$ 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
źródło
Myślę, że to ma sens. Jeśli wpiszesz ssh mycomputer, powinno być dość jednoznaczne, z którym komputerem się łączę.
Corey Ogburn,