首页 > 解决方案 > 使用 env 变量来表示 SSH 选项

问题描述

这两个 ssh 选项:

 ssh -o StrictHostKeyChecking=no -o NumberOfPasswordPrompts=0

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

export StrictHostKeyChecking=no 
export NumberOfPasswordPrompts=0

但这当然不完全正确

标签: sshenvironment-variables

解决方案


执行此操作的“正确”方法是在您的~/.ssh/config文件中,您可以在其中为所有连接设置全局,或者您可以通过主机(或一些更高级的东西)限制它。我会假设你不能这样做,但你仍然有能力改变你的~/.bashrc或其他的。

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

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

如果您想要明确的环境变量,例如您在问题中提出的内容(例如$StrictHostKeyChecking),那么您将不得不制作一个非常丑陋的别名或函数来将它们全部转换为最终ssh调用。这是一个应该在 bash 中工作但不能在 POSIX shell 中工作的解决方案:

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 变量。该行可能必须非常长,因为它必须在# expand this注释行的分号之前明确命名每个选项。

这会遍历每个受支持的 SSH 变量,并使用bash 的间接扩展来检查它是否在环境中(而不是空值)。如果是,则 a-o和选项名称及其值被添加到参数列表 ( $@) 的开头。

如果使用 zsh,则需要zsh 的参数扩展标志P,将 bash 替换${!SSH_VAR}为 zsh ${(P)SSH_VAR}。其他 shell 可能需要将整个“bash 间接扩展”行替换为eval "SSH_VAR_VALUE=\"\${$SSH_VAR}\""(注意那里的引用,否则该行可能很危险)。

调用command ssh可以防止我们从ssh同名函数中调用的递归。command ssh忽略该函数并实际运行真正的ssh命令。


推荐阅读