ssh - 使用 env 变量来表示 SSH 选项
问题描述
这两个 ssh 选项:
ssh -o StrictHostKeyChecking=no -o NumberOfPasswordPrompts=0
我有兴趣设置那些使用 env 变量,有没有办法做到这一点?
export StrictHostKeyChecking=no
export NumberOfPasswordPrompts=0
但这当然不完全正确
解决方案
执行此操作的“正确”方法是在您的~/.ssh/config
文件中,您可以在其中为所有连接设置全局,或者您可以通过主机(或一些更高级的东西)限制它。我会假设你不能这样做,但你仍然有能力改变你的~/.bashrc
或其他的。
您可以通过将其放入您的~/.bashrc
or ~/.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
命令。
推荐阅读
- r - 函数中的动态选择表达式
- mysql-8.0 - Mysql 8.0.3:函数 regexp_replace 不存在
- php - Zend Framework 3 中的公用文件夹
- servlets - Glassfish 5:指定文档库以将上传的文件存储在服务器的文件系统上
- javascript - 提交没有表单 ID 的表单
- excel - 将值从 ListBox 复制到工作表单元格
- php - 如何获取会话和比较
- vue.js - Laravel Mix Vue,使用Vue Router时延迟加载组件返回错误作为未知自定义元素
- c++ - 在 NativeActivity 中处理输入
- android - GridLayout 中的 ImageView