複数のSSHバージョンを含むSSH構成ファイル

複数のSSHバージョンを含むSSH構成ファイル

私はOpenSSHバージョン6.5に追加された「Match」キーワードが本当に好きで、これを.ssh / configファイルでよく使用します。

ただし、プロファイルは私のNFSホームにあるため、LAN上の複数のコンピュータにログインすると参照されます。

これらのシステムの多くは、まだSSHバージョンが6.5未満です。

したがって、これらのシステムのいずれかでssh(またはscp / rsync)を試みると、「match」が「無効な設定オプション」であるという苦情が表示され、sshが終了します。

まったく機能しないよりも、設定ファイルでカスタマイズせずにsshを続行する方が良いです。ただし、最新バージョンが最新のオプションを使用できるように構成ファイルを作成する方法が見つからないようですが、以前のバージョンはそのオプションなしで機能します。誰か良いアイデアがあれば共有してください。

私は以前のバージョンで「ssh -F /dev/null」を実行できることに気づきました。必ず必要で面倒なだけだと思います。 「自動」ソリューションを好む。

答え1

残念ながら、これは不可能です。新しいバージョンに新しいオプションの構文が導入された一部のアプリケーションでは、「条件付きコンパイル」アノテーションを使用しており、注目すべき例はMySQLです。

しかし幸いなことに、OpenSSHはまだその段階に達していません。

考えられる回避策:ホームディレクトリ全体が別のOSにインストールされている場合は、SSHのバージョンを確認するスクリプトを.profileに追加できます。プロファイルをロードするのに十分でない場合は、エイリアスを.profilesshに追加します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またはsshOpenSSHをトランスポートとして使用し、プログラムを直接呼び出す(シェルでエイリアスを確認せずに)他のアプリケーションを使用するなど、一部のユースケースではエイリアスが不十分な場合があります。これが実際に問題になる場合は、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

関連情報