我真的很喜欢 OpenSSH 6.5 版本中添加的“Match”关键字,并且我在 .ssh/config 文件中大量使用了它。
但该配置文件位于我的 NFS 家庭中,因此当我登录到 LAN 中的几台计算机中的任何一台时都会引用该配置文件。
其中许多计算机的 ssh 版本仍然低于 6.5。
因此,如果我在其中一台计算机上尝试 ssh(或 scp/rsync),我会收到一条抱怨,称“匹配”是“错误的配置选项”,并且 ssh 终止。
我宁愿 ssh 继续而不在我的配置文件中进行自定义,而不是根本不工作。但我似乎找不到任何方法来编写配置文件,以便较新的版本可以使用较新的选项,但旧版本无需它们即可工作。如果有人有任何好主意,请分享。
我已经设法弄清楚我可以对旧版本执行“ssh -F /dev/null”。我只是觉得这是必要的,这很令人厌烦。更喜欢“自动”解决方案。
答案1
不幸的是,这是不可能的。一些应用程序,其中新版本引入了新的可选语法,已经诉诸于“条件编译”注释,一个值得注意的例子是 MySQL。
但值得庆幸的是 OpenSSH 还没有到那个阶段。
可能的解决方案:如果您的整个主目录安装在不同的操作系统中,您可以将一个脚本添加到 .profile 中,用于检查 SSH 的版本,如果不足以加载您的配置文件,则将别名添加ssh
到.profile 中ssh -F /dev/null
。例如:
if [ "$(bc -l <<<"$(ssh -V 2> >(sed 's,^[^0-9]*,,;s,[^\.0-9].*,,')) < 6.5")" == 1 ]
then
alias ssh="/usr/bin/ssh -F/dev/null"
fi
或者,根据 @derobert 评论,别名可能不足以满足某些用例,例如使用rsync
OpenSSH 或其他使用 OpenSSH 作为传输并ssh
直接调用程序(而不让 shell 解析别名)的应用程序。如果这确实也是一个问题,您可能需要创建一个ssh
在本地 bin 目录中调用的脚本(通常~/bin
为 或~/.local/bin
)。当应用程序解析二进制文件的路径时ssh
,它应该在路径的早期看到您的本地 bin 目录并运行您的脚本,然后该脚本将执行所需的逻辑。
也许是这样的:
#!/bin/bash
if [ "$(bc -l <<<"$(ssh -V 2> >(sed 's,^[^0-9]*,,;s,[^\.0-9].*,,')) < 6.5")" == 1 ]
then
/usr/bin/ssh -F/dev/null "$@"
else
/usr/bin/ssh "$@"
fi