使用env变量表示SSH选项

时间:2019-07-09 03:26:25

标签: ssh environment-variables

这两个ssh选项:

 ssh -o StrictHostKeyChecking=no -o NumberOfPasswordPrompts=0

我有兴趣使用env变量设置这些变量,有没有办法做到?

export StrictHostKeyChecking=no 
export NumberOfPasswordPrompts=0

但是那当然不是很正确

1 个答案:

答案 0 :(得分:2)

执行此操作的“正确”方法位于您的~/.ssh/config文件中,您可以在其中将所有连接设为全局连接,也可以按主机(或其他一些高级操作)对其进行限制。我将假设您无法执行此操作,但是您仍然可以更改~/.bashrc或其他任何内容。

您可以通过将其放在~/.bashrc~/.zshrc中(或通过在ssh之前运行这些行)来解决此问题:

SSH_ARGS=( -o StrictHostKeyChecking=no -o NumberOfPasswordPrompts=0 )
alias ssh='ssh "${SSH_ARGS[@]}"'

如果您想要明确的环境变量(例如您在问题中提出的内容)(例如$StrictHostKeyChecking),则必须制作一个非常难看的别名或函数,以将它们全部转换为最终的{{1} }。这是一个应该在bash中有效但在POSIX shell中不可用的解决方案:

ssh

以上示例仅支持问题中命名的两个SSH变量。该行可能必须花很长时间,因为它必须在带有ssh() { local SSH_VAR SSH_VAR_VALUE for SSH_VAR in StrictHostKeyChecking NumberOfPasswordPrompts; do # expand this SSH_VAR_VALUE="${!SSH_VAR}" # bash indirect expansion if [ -n "$SSH_VAR_VALUE" ]; then set -- -o "$SSH_VAR=$SSH_VAR_VALUE" "$@" fi done command ssh "$@" } 注释的行中的分号之前明确命名每个选项。

这会遍历每个受支持的SSH变量,并使用bash's indirect expansion来检查它是否在环境中(而不是空值)。如果是,则# expand this以及选项名称及其值将放在参数列表(-o)的开头。

如果使用zsh,则需要zsh's parameter expansion flag P,用zsh的$@代替bash的${!SSH_VAR}。其他shell可能需要用${(P)SSH_VAR}替换整个“ bash间接扩展”行(请注意此处的引用,否则该行可能很危险)。

调用eval "SSH_VAR_VALUE=\"\${$SSH_VAR}\""可以防止我们从同名函数中调用command ssh得到的递归。 ssh会忽略该函数,而是实际运行真正的command ssh命令。