有没有办法在 ~/.ssh/config 中使用正则表达式

有没有办法在 ~/.ssh/config 中使用正则表达式

我有两套服务器。生产测试。所有服务器都有内部IP。目前我正在使用别名登录:

Host pro-10
Hostname 192.168.1.10
ProxyCommand ssh production-server nc %h %p

对于每台服务器我都需要重复这个规则。我正在寻找一种常规的表达方式来做到这一点?

Host pro-*
Hostname 192.168.1.$1
ProxyCommand ssh production-server nc %h %p

有办法做到这一点吗?

答案1

不,ssh 不支持正则表达式ssh_config (1)并且您给出的示例不是正则表达式。ssh_config (1)支持PATTERNS,即您可以为您的 IP 定义一个模式,即:

Host 192.168.1.*
  ProxyCommand ssh production-server nc %h %p

并且您应该能够转发所有内部 IP。另一种解决方案是添加/etc/hosts特定 IP 的条目,即:

192.168.1.10 pro10
192.168.1.11 pro11

并在文件中创建一个条目~/.ssh/config

Host pro1?
  ProxyCommand ssh production-server nc %h %p

答案2

我不认为可以使用正则表达式来动态设置 SSH 配置。但是,您应该能够在 Bash 中使用 for 循环来自动在每个服务器的配置文件中创建三行。对于此示例,我假设您需要为服务器 pro-75 到 pro-125 创建条目。

for i in $(seq 75 125);
do
    echo "Host pro-$i" >> ~/.ssh/config
    echo "Hostname 192.168.1.$i" >> ~/.ssh/config
    echo "ProxyCommand ssh production-server nc %h %p" >> ~/.ssh/config
    echo "\n" >> ~/.ssh/config
done

这将构建一个包含从 75 到 125 的所有数字的列表,并将其存储为循环的列表。然后它循环遍历列表中的每个成员并替换 $i。每行都附加到 SSH 用户配置文件的末尾。最后,我添加了换行符来稍微分解配置文件。

如果列表中需要特定值,而不是连续的数字段,则手动构建列表,如下所示:

1 23 45 67 89

答案3

不,不幸的是,这是不可能的。您可能已经知道可以使用扩展%h,但仅此而已。

在你的情况下为什么不使用for循环呢?

for i in {4..10}
do  
  echo -e "Host pro-$i\nHostname 192.168.1.$i\nProxyCommand ssh production-server nc %h %p\n"; >> ~/.ssh/config
done

我能想到的唯一其他选择是,也许使用正则表达式创建 DNS 条目(如果您的服务器支持此选项),然后使用它们。

答案4

使用 ProxyCommand 是可能的 - 因为它只是一组 shell 命令:

主机 pro-*
ProxyCommand ssh 生产服务器 nc 192.168.1。`echo "%h" | perl -pe 's/pro-//'` %p

相关内容