インターフェイスアップに基づいてSSHサーバーに接続する

インターフェイスアップに基づいてSSHサーバーに接続する

インターフェイスの可用性に応じて、SSHを介してサーバーに接続するためのbashエイリアスを作成しようとしています。最初のインターフェイスが利用可能な場合はそのIPを介して接続し、そうでない場合は他の特定のIPを介して接続します。

これが私が思いついたものです:

alias server='if [ ip a | grep -Eq ': tun0:.*state UP' || up == up ] then ssh [email protected] else ssh [email protected]'

この行を.bashrcに入れましたが、新しい端末を開くと常に次のエラーが発生します。

bash: alias: tun0:.*state: not found
bash: alias: `UP || up ': invalid alias name

エイリアス自体は機能しません。エイリアスを使用しようとすると、次の出力が表示されるためです。

>

質問を明確にするために:可能であれば、特定のIPアドレス(192.168.1.130)を使用してサーバーにSSHで接続したい場合、それ以外の場合は10.10.10.10を使用したいと思います。その逆の場合も同様です。それは私にとって重要ではないからです。

ベストアンサー1

tun0インターフェイスが動作していることを確認しip、テスト結果に基づいてIPアドレスを選択するために使用します。

if ip address show tun0 | grep -q -F 'state UP'; then
    remote=10.10.10.10
else
    remote=192.168.1.130
fi

ssh root@"$remote"

ここではこれは[ ... ]必要ありません。代わりに、ifステートメントの終了状態を使用するようにしてくださいgrep -q。使用されるオプションは、grep出力がなく、指定されたパターンが正規表現ではなく文字列として使用されることを保証します。

このipコマンドは、関心のある単一のインターフェイスに関する情報のみを提供する方法で使用されます。

エイリアスとして使用したい場合は、シェル関数を使用することをお勧めします。これにより、正しく引用が簡単になります。これは、提案したコードの問題の1つです。また、コードを読みやすくするために、適切なインデントを含む複数行を使用できるため、正しい構文を簡単に取得できます。

server () {
    local remote

    if ip address show tun0 | grep -q -F 'state UP'; then
        remote=10.10.10.10
    else
        remote=192.168.1.130
    fi
    
    ssh root@"$remote"
}

おすすめ記事