我可以根据*客户端*主机名覆盖 SSH 配置吗?

我可以根据*客户端*主机名覆盖 SSH 配置吗?

我在所有计算机上同步 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 将默默忽略它。

相关内容