Bisakah Host .ssh / config memiliki beberapa entri HostName?


10

Saya telah mengatur ssh dan penerusan port router sehingga saya dapat ssh ke komputer di jaringan rumah saya ketika saya tidak di rumah. Saat ini saya memiliki dua entri di .ssh/configfile saya satu untuk ketika saya berada di jaringan rumah saya dan satu untuk ketika saya tidak:

Host mycomputer
  HostName 192.168.X.X

Host mycomputerathome
  HostName my.no-ip.dynamic

Ini bekerja tetapi saya bertanya-tanya apakah saya dapat membuat segalanya lebih mudah pada diri saya sendiri. Saya berharap ada cara untuk daftar beberapa entri HostName sehingga jika yang pertama gagal itu kembali ke yang kedua:

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

Jadi itu pertama-tama akan mencoba untuk terhubung ke host di jaringan lokal saya dan jika itu tidak ada, itu akan mencoba untuk terhubung menggunakan nama host dinamis no-ip saya. Saya telah mencoba memasukkan dua Nama Host tetapi menjalankan ssh mycomputerhanya blok tanpa melakukan apa pun.

Saya telah mematikan otentikasi kata sandi demi kunci sehingga secara tidak sengaja menghubungkan ke komputer di jaringan lokal ketika saya tidak berada di jaringan rumah saya tidak akan mengambil risiko kata sandi saya pergi ke mana pun seharusnya tidak.

Apakah mungkin untuk menentukan HostNames cadangan untuk mencoba jika yang pertama tidak berhasil?


unix.stackexchange.com/questions/424755/… serupa dan mungkin dapat diadaptasi untuk nama host alih-alih port
thrig

BTW, .ssh/configdapat menjalankan skrip untuk properti tertentu. Saya tahu Anda bisa dengan ProxyCommand. Anda dapat melakukan sesuatu seperti yang ditunjukkan dalam Tanya Jawab ini dari SF - serverfault.com/questions/401233/… .
slm

Jawaban:


8

Ini jelek, tapi saya pikir Anda bisa melakukannya menggunakan execkriteria untuk Matchpada status keluar dari ketukan port misalnya

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

Perhatikan bahwa ini tidak dapat memastikan apakah Anda berada di jaringan rumah "Anda" - hanya saja Anda berada di segmen LAN pribadi dengan rentang alamat yang sama yang kebetulan memiliki layanan yang mendengarkan pada alamat / port yang sama.


1
Saya memang harus menambahkan -w 1atau ncsepertinya menunggu selamanya. Apa yang bisa lebih sederhana adalah Pertandingan kedua Match exec "true"karena jika pertandingan pertama gagal, coba saja pilihan kedua secara membabi buta.
Corey Ogburn

@CoreyOgburn ah ya saya mencoba memikirkan cara yang lebih baik untuk melakukan kondisi alternatif (disayangkan Matchtidak ada Else)
steeldriver

Jadi saya mengalami masalah dengan pendekatan ini. Saya juga menjalankan sebuah situs, mengatakan xyz.com, dan ketika saya mencoba untuk ssh xyz.comsaya Match exec "true"tertangkap itu dan diarahkan saya ke server rumah saya menggunakan Hostname jauh saya. Saya akan mencoba dengan eksekutif Anda tetapi saya pikir hal yang sama akan terjadi.
Corey Ogburn

Ya, menggunakan Anda Match exec... Match !execmenyebabkan ssh'ing ke domain lain untuk memicu Match !execdan menulis ulang HostName.
Corey Ogburn

2
Jadi ternyata ~/.ssh/configtidak peduli tentang lekukan. Perintah tertentu mengatur ulang ruang lingkup, yaitu setiap baris Host baru mengatakan "baris sebelumnya adalah untuk Host sebelumnya, baris berikut adalah untuk Host baru ini." Ternyata Matchmemiliki kekuatan "pengaturan ulang" yang sama dengan Host. Untuk menjelaskan hal ini, saya mengganti baris Host saya dengan Match Host mycomputer exec "nc -w 1 -z 192.168.X.X 22"dan mendefinisikan semua nilai khusus untuk jaringan lokal saya. Saya kemudian menambahkan baris yang cocok kecuali !execdan menambahkan semua nilai ketika saya keluar dari jaringan. Sekarang berfungsi dengan baik untuk semua host.
Corey Ogburn

2

Saya menggunakan seperti ini.

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 tidak memiliki sesuatu seperti blok indentasi. Jika Anda ingin membatasi kalimat yang cocok dengan host tertentu, maka Anda harus menjelaskan kondisi lengkapnya.

Anda dapat menghindari menunggu lama ncdengan memberikannya -G 1(batas waktu koneksi 1s), dan Anda dapat menggunakan perilaku berikut untuk menghindari beberapa permintaan darinc

Match
Memperkenalkan blok bersyarat. Jika semua kriteria pada baris Pencocokan terpenuhi, kata kunci pada baris berikut mengesampingkan yang ditetapkan di bagian global file konfigurasi, hingga baris Pencocokan lain atau akhir file. Jika kata kunci muncul di beberapa blok Pencocokan yang dipenuhi, hanya kata kunci pertama yang diterapkan.

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


1

Tidak; jika Anda menentukan beberapa HostNames untuk satu Hostentri, hanya entri pertama yang akan diakui:

$ 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

Saya kira itu masuk akal. Jika saya mengetik di ssh mycomputerdalamnya harus cukup jelas komputer mana yang saya hubungkan.
Corey Ogburn
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.