使主機名適應本地/遠端情況
我已經建立了一個本地 ssh 伺服器,我喜歡從我的本地網路使用這個簡潔的別名來訪問它:
~/.ssh/config
:Host myserver-local HostName 192.168.2.8 User iago-lito Port 22
為了遠端訪問它,我設置了一個no-ip帳戶以通過dyndns IP 解析訪問它,我喜歡從任何其他網路使用這個簡潔的別名訪問它:
~/.ssh/config
:Host myserver HostName myserver.ddns.net User iago-lito Port 22
不幸的是,因為我的路由器不允許NAT loopbacks,我需要使用:
ssh myserver
當我不在時:
ssh myserver-local
當我在家時..這使得腳本在自動化等方面非常
scp
煩人git push
。我怎樣才能使相同的別名在這兩種情況下都起作用?
使用相當現代的 OpenSSH,您可以執行 shell 命令來
Match
選擇~/.ssh/config
. 假設您有一個腳本am-on-home-network
,在家庭網路上執行時返回 0,在外部執行時返回 1:Match Host myserver exec "am-on-home-network" HostName myserver User iago-lito Port 22 Host myserver HostName myserver.ddns.net User iago-lito Port 22
對於
am-on-home-network
,您可以使用arp
來探索本地網路。查找您家用路由器的 MAC 地址。(尋找 IP 地址是不可靠的,因為許多專用網路使用相同範圍的專用 IP 地址。)#!/bin/sh timeout 0.2 arping -f -q -I eth0 12:34:56:78:9a:bc
將 MAC 地址調整為您的電腦在家時看到的路由器的 MAC 地址。調整
eth0
電腦上用於連接家庭路由器的網路介面。純 SSH 方式的優點是可以在使用者態完成,但它只適用於 SSH,並且會顯著增加連接建立延遲。更好的解決方案是在系統級別執行 DNS 伺服器,並將其配置為在本地網路上為本地 IP 地址提供全域名稱
myserver.ddns.net
。Dnsmasq是一個小型、簡單的 DNS 記憶體和伺服器,適合在端點機器或小型網路上執行。如果您還沒有在您的機器上執行 DNS 記憶體,它將使一般 Internet 使用速度更快一些。Ubuntu 預設執行 dnsmasq。在 dnsmasq 中,創建一個
/etc/dnsmasq.d/home-server
包含host-record=myserver.ddns.net,192.168.2.1
將以下腳本添加到您的網路啟動腳本(無論它們在您的發行版中):
#!/bin/sh comment=\# if timeout 0.2 arping -f -q -I eth0 12:34:56:78:9a:bc; then comment= fi sed -i "\$s/^#*/$comment/" /etc/dnsmasq.d/home-server service dnsmasq restart
如果你的系統通過 D-Bus 設置了 Dnsmasq,編輯配置文件不是最好的選擇,我什至不知道它是否可以工作。您需要
dbus-send
根據 arping 的輸出呼叫以添加或刪除主機記錄。或者,如果您使用的是 NetworkManager,請將其配置為在與您的家庭網路對應的連接上設置主機條目。
您可以編寫一個腳本來 ping 伺服器的本地地址,並根據結果交換一個或另一個 .ssh/config 文件。例如:
ping -c1 -W1 192.168.x.x
這些選項是計數,即一個 ping 和等待,1 秒。使用 ping 的返回值 - 0 找到,不是 0,沒有找到。
您可以將此腳本設置為在連接到網路時執行。
對不起,我是用手機寫的。