我有两套服务器。生产测试。所有服务器都有内部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