.ssh/config 主机可以有多个主机名条目吗?

.ssh/config 主机可以有多个主机名条目吗?

我已经设置了 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 块中,则仅应用该关键字的第一个实例。

https://www.freebsd.org/cgi/man.cgi?sshd_config(5)

答案3

不;如果为一个条目指定多个HostNames 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

相关内容