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

Phi*_*hil 5 openssh

我非常喜欢在 6.5 版左右添加到 OpenSSH 的“匹配”关键字,并且我在我的 .ssh/config 文件中大量使用它。

但是那个配置文件在我的 NFS 家庭中,所以当我登录到我们局域网中的几台计算机中的任何一台时都会被引用。

并且这些计算机中的许多仍然具有早于 6.5 的 ssh 版本。

因此,如果我在其中一台计算机上尝试 ssh(或 scp/rsync),我会收到抱怨 Match 是“错误的配置选项”,并且 ssh 终止。

我宁愿 ssh 在没有在我的配置文件中进行自定义的情况下继续进行,也不愿根本不工作。但我似乎找不到任何方法来编写配置文件,以便较新的版本可以使用较新的选项,但旧版本没有它们也能工作。如果有人有任何聪明的想法,请分享。

我已经设法弄清楚我可以使用旧版本执行“ssh -F /dev/null”。我只是觉得这是必要的令人厌烦。更喜欢“自动”解决方案。

Gus*_*uss 4

不幸的是,这是不可能的。一些应用程序,其中新版本引入了新的可选语法,已经诉诸于“条件编译”注释,一个值得注意的例子是 MySQL。

但值得庆幸的是 OpenSSH 还没有到那个阶段。

可能的解决方案:如果您的整个主目录安装在不同的操作系统中,您可以将一个脚本添加到 .profile 中,用于检查 SSH 的版本,如果不足以加载您的配置文件,则将别名添加到 .profilesshssh -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
Run Code Online (Sandbox Code Playgroud)

或者,根据 @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
Run Code Online (Sandbox Code Playgroud)