我在所有计算机上同步 SSH 配置。其中一台计算机处于特定环境中,某些 SSH 连接需要跳转主机。我不能直接将该设置添加到我的 SSH 配置中,因为这会破坏我所有其他计算机。
是否可以根据当前主机名有条件地在 SSH 配置中应用该设置?我想象的是这样的:
Host *.company.com
User yhfe312
If ClientHostname == "special-hostname"
Host *.company.com
ProxyJump jumphost.example.com
我尝试了一种涉及Include
关键字的解决方法。在我的主 SSH 配置中,我将其添加到末尾:
Include special-hostname
然后~/.ssh/special-hostname
我添加:
Host *.company.com
ProxyJump jumphost.example.com
但它没有任何效果,除非我在命令行中手动指定它,否则不会使用 jumphost。
答案1
是的,对于 OpenSSH[1] 来说,Match
关键词它支持通过以下方式在 shell 中运行命令标准 exec
。如果 中指定的命令exec
的退出代码为0
则该条件已匹配,否则失败。
0
与本地主机名进行比较并在完全匹配时退出的 shell 命令:
test "conditionhostname" = "$(cat /etc/hostname)"
由于配置中的引用规则非常基本,请将其保存为具有可执行权限 +x 设置的文件,例如 at ~/.ssh/ishostname.sh
。这将把第一个传递的参数与本地主机名进行比较:
#!/bin/sh
test "$1" = "$(cat /etc/hostname)"
现在这可以用作 SSH 配置中的执行条件:
Match exec="~/.ssh/ishostname.sh 'special-hostname'"
# My directives for 'special-hostname' follow below...
[1]: 阅读 OpenSSH 客户端配置手册man ssh_config
。从技术上讲,Match
是 的超集,Host
具有更多选项。
答案2
我在问题中尝试的解决方法有效,我只需要将Include
关键字放在最顶部.ssh/config
。我不知道为什么这是必要的,但它确实有效。
总而言之,要仅在当前主机上覆盖 SSH 配置,请添加一行,如Include myhostname
顶部所示.ssh/config
,其中“myhostname”是当前计算机的主机名。创建一个名为 的文件,.ssh/myhostname
在其中放置配置覆盖。在其他机器上,该文件不存在,SSH 将默默忽略它。