Terima kasih untuk @ till's Answer , itu menginspirasi saya banyak.
Saya menemukan bahwa Anda dapat mengarahkan koneksi Anda dengan paksa ProxyCommand nc dst dst-port .
Misalnya, Anda sebenarnya akan terhubung B.comjika menggunakan
ssh A.com -o ProxyCommand="nc B.com 22"
Tapi UserKnownHostsFile masih akan mencatat sebagaiA.com
Jadi, Anda dapat menambahkan domain "otomatis" ke ssh_config
Host auto.internal-server
Hostname {internal-server ip or domain}
ProxyCommand bash -c '(timeout 0.1 nc -z %h %p) && nc %h %p || ssh -W %h:%p external-server'
Saya diganti nc -w 1 %h %pdengan (timeout 0.1 nc -z %h %p) && nc %h %p, akan lebih cepat jika Anda dapat mencapai server internal kurang dari 100 ms.
Atau Anda dapat diganti dengan ping, tetapi ini mungkin menunjukkan informasi yang buruk jika Anda menggunakan proxy berbasis TCP seperti proxychains, atau server tidak mengizinkan gema ICMP.
Host auto.internal-server
Hostname {internal-server ip or domain}
ProxyCommand bash -c '(ping %h &>/dev/null) && nc %h %p || ssh -W %h:%p external-server'
Anda dapat mengganti (timeout 0.1 nc -z %h %p)dengan apa pun yang mendeteksi apakah Anda berada di server internal.
Jika Anda memiliki beberapa IP kandidat, bahkan Anda dapat menggunakan ini:
Host auto.internal-server
Hostname {internal-server ip or domain}
ProxyCommand bash -c 'f(){(timeout 0.1 ping -c 1 $1 &>/dev/null) && nc $1 %p;}; f 1.1.1.1 || f 2.2.2.2 || f 3.3.3.3'
Itu akan mencoba untuk terhubung 1.1.1.1, jika gagal mencoba untuk terhubung 2.2.2.2, dan kemudian 3.3.3.3.