~/.ssh/config文件可以使用变量吗?

23

我正在编写一个SSH配置文件,并希望执行一些逻辑。例如:

Host myhost1
    ProxyCommand ssh -A {choose randomly between [bastion_host1] and [bastion_host2]} -W %h:%p

是否可以使用(bash?)变量实现上述内容?谢谢!

4个回答

17

您的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脚本的逻辑中。


1
在这个脚本中,$onehost 变量通过从 bash 数组中选择一个随机数组元素来设置。您的 ProxyCommand 是由您的 shell 执行的,只要您的 shell 是 bash,我不认为您不能将整个功能包含在单行中,虽然我没有尝试过。我这样回答是因为我不知道您是否将 bash 作为默认 shell。(在我的系统上,我用 bash 进行编程,但 tcsh 是我的默认 shell。) - ghoti
4
“May contain nuts”让我哈哈大笑! - UrLicht
你能指出我在这里做错了什么吗?(链接为 https://dev59.com/t7Pma4cB1Zd3GeqPlBu6) - Michael
1
点赞也是为了警示过敏者。六年前的回答仍然新鲜! - Scott Corscadden

10

~/.ssh/config 文件中,不能使用太多逻辑和 Bash。这个文件的手册在 man ssh_config 中,它没有提到这样的功能。

你可以创建一个脚本来实现所需的逻辑,并让你的 ssh 配置调用该脚本。具体示例如下:

ProxyCommand ~/bin/ssh-randomly.sh [bastion_host1] [bastion_host2]

编写一个Bash脚本~/bin/ssh-randomly.sh,以接受两个主机名参数,随机选择其中一个,并使用适当的参数运行真正的ssh命令。


7

不,.ssh/config 不被任何外部程序处理。您需要编写一个类似以下代码的 shell 函数:

ssh () {
    (( $RANDOM % 2 )) && bastion=bastion_host1 || bastion=bastion_host2

    command ssh -A "$bastion" "$@"
}

0

这可以通过使用辅助应用程序在ssh配置中处理。例如,

Host myhost match exec "randprog"
     hostname host1
Host myhost
     hostname host2

然后randprog将随机返回1或0(0将匹配第一行,给出host1)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接