我已经设置了一个本地 ssh 服务器,我喜欢从本地网络使用这个简洁的别名来访问它:
~/.ssh/config
:
Host myserver-local
HostName 192.168.2.8
User iago-lito
Port 22
为了远程访问它,我设置了一个无IP帐户来访问它通过dyndns IP 解析,我喜欢从任何其他网络使用这个简洁的别名进行访问:
~/.ssh/config
:
Host myserver
HostName myserver.ddns.net
User iago-lito
Port 22
不幸的是,因为我的路由器不允许NAT 环回,我需要使用:
ssh myserver
当我离开时:
ssh myserver-local
当我在家时......这使得脚本在自动化方面变得非常烦人scp
,git push
ETC。
如何使相同的别名在这两种情况下都有效?
答案1
您可以编写一个脚本来 ping 服务器的本地地址,并根据结果交换一个或另一个 .ssh/config 文件。例如:
ping -c1 -W1 192.168.x.x
这些选项是计数(即 1 次 ping)和等待(1 秒)。使用ping的返回值——0找到,不0,没有找到。
您可以设置此脚本在连接到网络时运行。
抱歉,我写得简短,我是用手机写的。
答案2
使用相当现代的 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 服务器,并将其配置为myserver.ddns.net
在本地网络上时为本地 IP 地址和全局名称提供服务。域名解析是一个小型、简单的 DNS 缓存和服务器,适合在端点计算机或小型网络上运行。如果您尚未在计算机上运行 DNS 缓存,它将使一般互联网使用速度更快一些。 Ubuntu 默认运行 dnsmasq。
/etc/dnsmasq.d/home-server
在 dnsmasq 中,创建一个包含以下内容的文件
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,请将其配置为设置与您的家庭网络对应的连接上的主机条目。