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

问题描述 投票:0回答:4

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

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

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

bash ssh config
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 脚本的逻辑中。


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)。

© www.soinside.com 2019 - 2024. All rights reserved.