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


10

我已经设置了ssh和路由器端口转发,以便在不在家时可以ssh进入家庭网络中的计算机。当前,我的.ssh/config文件中有两个条目,一个用于当我在家庭网络中时,另一个用于当我不在家庭网络中时:

Host mycomputer
  HostName 192.168.X.X

Host mycomputerathome
  HostName my.no-ip.dynamic

这行得通,但我想知道是否可以使自己更轻松。我希望有一种方法可以列出多个HostName条目,这样,如果第一个失败,它会退回到第二个:

Host mycomputer
  HostName 192.168.X.X
  HostName my.no-ip.dynamic

因此,它将首先尝试连接到本地网络上的主机,如果该主机不存在,它将尝试使用我的no-ip动态主机名进行连接。我尝试输入两个主机名,但ssh mycomputer只运行了什么也不做的块。

我已经关闭了密码验证功能,以支持密钥,因此在不在本地网络上时意外连接到本地计算机上的计算机,也不会冒我的密码无法进入任何地方的风险。

如果第一个不起作用,是否可以指定备用主机名来尝试?


unix.stackexchange.com/questions/424755/…是相似的,可能可以改编成主机名而不是端口
thrig

顺便说一句,.ssh/config可以为某些属性运行脚本。我知道您可以使用ProxyCommand。你可以做一些如本Q&A从SF - serverfault.com/questions/401233/...
slm

Answers:


8

这很丑陋,但我认为您可以使用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网段上,而恰好有一个服务正在侦听相同的地址/端口。


1
我确实必须添加一个-w 1,否则nc似乎将永远等待。可能更简单的是第二场比赛,Match exec "true"因为如果第一场比赛失败,那就盲目尝试第二场比赛。
科里·奥格本

@CoreyOgburn啊,是的,我正在尝试考虑一种更好的方法来处理替代状况(可惜Match没有Else
steeldriver

所以我遇到了这种方法的问题。我也办一个网站,说xyz.com,当我尝试ssh xyz.comMatch exec "true"抓住这一点,用我的远程主机名重定向我到我的家庭服务器。我将与您的执行官一起尝试,但我认为同样的事情将会发生。
科里·奥格本

是的,使用您的Match exec... Match !exec域名会导致ssh'ing到其他域以触发Match !exec并重写HostName。
科里·奥格本

2
因此,事实证明,~/.ssh/config缩进并不算少。某些命令会重置作用域,即,每条新的主机行都说“先前的行用于先前的主机,以下行用于此新主机”。事实证明它Match具有与主机相同的“范围重置”功能。为了解决这个问题,我用主机行替换了Match Host mycomputer exec "nc -w 1 -z 192.168.X.X 22"并定义了本地网络的所有自定义值。然后我添加了一条匹配行,除了!exec并添加了我不在网络时的所有值。现在,它适用于所有主机。
科里·奥格本

2

我正在这样使用。

Match host mycomputer exec "nc -G 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通过提供它-G 1(连接超时1s)选项来避免长时间等待,并且可以利用以下行为来避免多次调用nc

匹配
引入条件块。如果满足“匹配”行中的所有条件,则以下各行中的关键字将覆盖在配置文件的全局部分中设置的关键字,直到另一“匹配”行或文件末尾为止。如果一个关键字出现在满足的多个Match块中,则仅应用该关键字的第一个实例。

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


1

没有; 如果HostName为一个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

我想这很有道理。如果输入,ssh mycomputer应该很清楚我要连接到哪台计算机。
科里·奥格本
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.