Dzięki za odpowiedź @ till , bardzo mnie to zainspirowało.
Odkryłem, że możesz siłą przekierować swoje połączenie ProxyCommand nc dst dst-port.
Na przykład połączysz się, B.comjeśli korzystasz
ssh A.com -o ProxyCommand="nc B.com 22"
Ale UserKnownHostsFilenadal będzie nagrywać jakoA.com
Możesz dodać domenę „auto” do swojej 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'
Wymieniłem nc -w 1 %h %pz (timeout 0.1 nc -z %h %p) && nc %h %p, to będzie bardziej szybkie, jeśli można dotrzeć do wewnętrznego serwera mniej niż 100ms.
Lub możesz go zastąpić ping, ale może to oznaczać złe informacje, jeśli używasz serwera proxy opartego na TCP proxychainslub serwer nie zezwala na echo 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'
Możesz zastąpić (timeout 0.1 nc -z %h %p)wszystko, co wykrywa, czy jesteś na serwerze wewnętrznym.
Jeśli masz wiele adresów IP kandydatów, nawet Ty możesz użyć tego:
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'
Spróbuje się połączyć 1.1.1.1, jeśli nie, spróbuj się połączyć 2.2.2.2, a następnie 3.3.3.3.