我正在编写一个SSH配置文件,并希望执行一些逻辑。例如:
Host myhost1
ProxyCommand ssh -A {choose randomly between [bastion_host1] and [bastion_host2]} -W %h:%p
是否可以使用(bash?)变量实现上述内容?谢谢!
您的ProxyCommand
可以是一个 shell 脚本。
host myhost1
ProxyCommand $HOME/bin/selecthost %h %p
然后在~/bin/selecthost
文件中:
#!/usr/bin/env bash
hosts=(bastion1 bastion2)
onehost=${hosts[$RANDOM % ${#hosts[@]}]}
ssh -x -a -q ${2:+-W $1:$2} $onehost
未经测试。效果因人而异。可能含有坚果。
根据评论,我还测试了以下内容,并且效果很好:
host myhost1 myhost2
ProxyCommand bash -c 'hosts=(bastion1 bastion2); ssh -xaqW%h:22 ${hosts[$RANDOM % ${#hosts[@]}]}'
当然,这种方法不允许您为每个主机指定自定义端口。如果您的SSH配置匹配同一个host
条目中的多个主机,您可以将其添加到单独的shell脚本的逻辑中。
在 ~/.ssh/config
文件中,不能使用太多逻辑和 Bash。这个文件的手册在 man ssh_config
中,它没有提到这样的功能。
你可以创建一个脚本来实现所需的逻辑,并让你的 ssh 配置调用该脚本。具体示例如下:
ProxyCommand ~/bin/ssh-randomly.sh [bastion_host1] [bastion_host2]
编写一个Bash脚本~/bin/ssh-randomly.sh
,以接受两个主机名参数,随机选择其中一个,并使用适当的参数运行真正的ssh
命令。
不,.ssh/config
不被任何外部程序处理。您需要编写一个类似以下代码的 shell 函数:
ssh () {
(( $RANDOM % 2 )) && bastion=bastion_host1 || bastion=bastion_host2
command ssh -A "$bastion" "$@"
}
这可以通过使用辅助应用程序在ssh配置中处理。例如,
Host myhost match exec "randprog"
hostname host1
Host myhost
hostname host2
然后randprog
将随机返回1或0(0将匹配第一行,给出host1)。
$onehost
变量通过从 bash 数组中选择一个随机数组元素来设置。您的 ProxyCommand 是由您的 shell 执行的,只要您的 shell 是 bash,我不认为您不能将整个功能包含在单行中,虽然我没有尝试过。我这样回答是因为我不知道您是否将 bash 作为默认 shell。(在我的系统上,我用 bash 进行编程,但 tcsh 是我的默认 shell。) - ghoti