使主机名适应本地/远程情况

使主机名适应本地/远程情况

我已经设置了一个本地 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

当我在家时......这使得脚本在自动化方面变得非常烦人scpgit 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,请将其配置为设置与您的家庭网络对应的连接上的主机条目。

相关内容