インターフェイスアップに基づいて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"
}

答え2

エイリアス定義行に一重引用符がありません。二重引用符を使用してエイリアスコマンドを定義してみてください。上部にはfi末尾と先行セミコロンがありませんthen。もう一つ注意すべき点はip a ...「命令置換」なので$(...)

答え3

ファイル内のインターフェースの状態を確認できます/sys/class/net/$interface/operstate

if [[ $(</sys/class/net/tun0/operstate) == up ]]
then
    ip=10.10.10.10
else
    ip=192.168.1.130
fi

答え4

私が間違っていない場合は、条件付き構文に少しの作業が必要です

if [ condition ]; then <>;else <>? fi

何かをすることで何を達成しようとしていますかup == up

tun0UP時に接続するためにこのようなエイリアスを思い出しました。

alias server="if [ $(ip a | grep -Eq ': tun0:.*state UP') ]; then ssh [email protected]; else ssh [email protected];fi"

関連情報