Ssh

使主機名適應本地/遠端情況

  • February 20, 2017

我已經建立了一個本地 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.netDnsmasq是一個小型、簡單的 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,沒有找到。

您可以將此腳本設置為在連接到網路時執行。

對不起,我是用手機寫的。

引用自:https://unix.stackexchange.com/questions/346036