具有多个 ssh 版本的 ssh 配置文件

具有多个 ssh 版本的 ssh 配置文件

我真的很喜欢 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 评论,别名可能不足以满足某些用例,例如使用rsyncOpenSSH 或其他使用 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

相关内容