我正在尝试设置我的.ssh/config
,以便它仅ProxyCommand
在无法到达本地服务器时使用。然而,我正在努力使Match
例如。我有
Match host="X" !exec "is_reachable X"
User me
ProxyCommand ssh me2@proxy exec netcat %h %p 2> /dev/null
ForwardAgent yes
Match host="Y" !exec "is_reachable Y"
User me
ProxyCommand ssh me2@proxy exec netcat %h %p 2> /dev/null
ForwardAgent yes
...
X
并且Y
位于同一网络上,因此如果其中一个可以访问,则另一个也可以访问。我真的不需要is_reachable
改变这个论点。理想情况下,我想要这样的东西:
Match host="X Y" !exec "is_reachable X"
User me
ProxyCommand ssh me2@proxy exec netcat %h %p 2> /dev/null
ForwardAgent yes
这与X
和都匹配Y
。我有大约 15 个主机名,我不想为所有主机名制定单独的规则。
我见过类似的解决方案仅将匹配关键字应用于 ssh 配置中的单个主机但它们只处理单个主机。
答案1
我知道这是一个两年前的问题,但我今天试图找到这个答案并且做到了。查遍之后,发现里面说的很清楚了文档(至少是当前版本)。
其他关键字的条件必须是单个条目或逗号分隔的列表,并且可以使用模式部分中描述的通配符和否定运算符。
所以我现在使用Match
这样的线路,而且效果很好:
Match host prefix1*,prefix2*,prefix3*
User root
ProxyJump bastion-host.example.com
ForwardAgent yes
确保不要用逗号和空格(仅逗号)分隔主机模式。
关键字有很大的力量Match
。这可以通过我的用例来展示,该用例进一步扩展了一点。我需要执行一个“前脚本”以确保我的本地环境已针对请求正确设置,因此我将条件关键字originalhost
和exec
.我只需确保我的脚本返回0
响应代码,以便主机匹配originalhosts
条件不会Match
因我的exec
脚本而失败。
Match originalhost prefix1*,prefix2*,prefix3* exec ~/.ssh/pre_script
User root
ProxyJump bastion-host.example.com
ForwardAgent yes
我正在使用以下版本编写所有这些内容(如 ssh -v 输出顶部所示):
OpenSSH_9.0p1, LibreSSL 3.3.6