インターフェイスの可用性に応じて、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
?
tun0
UP時に接続するためにこのようなエイリアスを思い出しました。
alias server="if [ $(ip a | grep -Eq ': tun0:.*state UP') ]; then ssh [email protected]; else ssh [email protected];fi"