我已经设置了 ssh 和路由器端口转发,以便当我不在家时可以通过 ssh 登录到家庭网络上的计算机。目前,我的文件中有两个条目,.ssh/config
一个用于当我在家庭网络上时,另一个用于当我不在家庭网络上时:
Host mycomputer
HostName 192.168.X.X
Host mycomputerathome
HostName my.no-ip.dynamic
这可行,但我想知道是否可以让自己的事情变得更轻松。我希望有一种方法可以列出多个主机名条目,这样如果第一个主机名条目失败,它就会退回到第二个主机名条目:
Host mycomputer
HostName 192.168.X.X
HostName my.no-ip.dynamic
这样它会首先尝试连接到我的本地网络上的主机,如果该主机不存在,它将尝试使用我的 no-ip 动态主机名进行连接。我尝试输入两个主机名,但运行ssh mycomputer
只是阻止执行任何操作。
我已经关闭了密码身份验证,转而使用密钥,因此,当我不在家庭网络上时,意外连接到本地网络上的计算机时,我的密码不会出现任何不应该出现的情况。
如果第一个主机名不起作用,是否可以指定后备主机名来尝试?
答案1
虽然很丑,但我觉得你可以使用端口敲门的退出状态exec
的标准来执行此操作,例如Match
Host mycomputer
Match exec "nc -z 192.168.1.11 %p"
HostName 192.168.1.11
Match !exec "nc -z 192.168.1.11 %p"
HostName my.no-ip.dynamic
请注意,这并不能真正判断您是否位于“您的”家庭网络上 - 只是您位于具有相同地址范围的专用 LAN 网段上,而该网段恰好有一个服务正在侦听相同的地址/端口。
答案2
我就是这样用的
Match host mycomputer exec "nc -w 1 -z 192.168.1.11 %p"
HostName 192.168.1.11
Match host mycomputer # fallback
HostName my.no-ip.dynamic
Host mycomputer
# ... other configs
Host not-my-computer
# ... other configs
ssh_config 没有缩进块之类的东西。如果您想将匹配语句限制到特定主机,那么您应该描述完整的条件。
您可以nc
通过提供-w 1
(连接超时 1s)选项来避免长时间等待,并且您可以利用以下行为来避免多次调用nc
Match
引入条件块。如果满足“匹配”行上的所有条件,则以下行中的关键字将覆盖配置文件全局部分中设置的关键字,直到另一个“匹配”行或文件末尾。如果某个关键字出现在多个满足条件的 Match 块中,则仅应用该关键字的第一个实例。
答案3
不;如果为一个条目指定多个HostName
s Host
,则只有第一个会被确认:
$ grep -A5 Host .ssh/config
Host test
HostName fake.tld.xyzzy
HostName real.example.com
HostName 127.1.2.3
User username
$ ssh test
ssh: Could not resolve hostname fake.tld.xyzzy: Name or service not known
答案4
定时任务: @reboot ~/.ssh/scripts/distant_check.sh 〜/.ssh/scripts/distant_check.sh : ping -c1 [本地服务器 IP] 如果 [ $? -eq 0 ];然后 cp ~/.ssh/config_local ~/.ssh/config 别的 cp ~/.ssh/config_distant ~/.ssh/config 菲