这两个ssh选项:
ssh -o StrictHostKeyChecking=no -o NumberOfPasswordPrompts=0
我有兴趣使用env变量设置这些变量,有没有办法做到?
export StrictHostKeyChecking=no
export NumberOfPasswordPrompts=0
但是那当然不是很正确
答案 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
命令。