接続された最初のアドレスを使用して両方のアドレスにSSHを介して接続

接続された最初のアドレスを使用して両方のアドレスにSSHを介して接続

私は家にコンピュータを持っています。フランクリン(私はそう呼んでいます)私は仕事用のラップトップでSSHを頻繁に使います。家にいるときはFranklin.localでSSH経由で接続し、職場や他の場所にいるときはRemote.address.of.franklinでSSH経由で接続します。

状況に応じて、常に正しい方法で接続する機能が私のプロフィールにあってほしいです。私のネットワークの状態は頻繁に変わります(有線対無線、さまざまなSSIDなど)。したがって、ネットワークの状態を検出してこれを実行したくないのではなく、次のことを行います。

  1. フランクリンをローカルで利用できる場合は、ローカルに接続してください。
  2. それ以外の場合はリモート接続

これが私が今使っているものです:

function franklin () {
    ping -c 5 "franklin.local" > /dev/null
    if [[ $? != 0 ]]
        then
        echo "franklin not available on local, so trying remote connection"
        ssh -p 22 remote.address.of.franklin
    else
        echo "franklin available on local network, so trying local connection"
        ssh [email protected]
    fi
}

問題は、pingに時間がかかることです。私の質問は次のとおりです2つのSSHコマンドを同時に実行し、自動的に最初のリンクコマンドを使用できますか?

答え1

ORシェルで簡単なものを試してみてはいかがですか?

ssh [email protected] || ssh -p 22 remote.address.of.franklin

私はZSHについてはよくわかりませんが、評価ロジックはまだ怠惰なようです。つまり、2番目の部分は、最初の部分が失敗した場合にのみ評価されることを意味します。もちろん、最初のコマンドがfranklin.local利用可能であることを確認するためにしばらく待機することもできます。

関数で行ったように、コマンドをエイリアスに割り当てることで短縮できます。

答え2

私は使うncpingを送る代わりに:

franklin() {
    local host=franklin.local
    if nc -w1 $host 22 &>/dev/null; then
        echo "connecting locally"
    else
        echo "connecting remotely"
        host=remote.address.of.franklin
    fi
    ssh username@$host "$@"
}

"$@"SSH呼び出しに追加しました。これにより、次のリモートコマンドをすばやく実行できます。

franklin uptime

答え3

知ってみると思ったより解決策に近かったです。 pingのアドレスルックアップ部分がどのように機能するかについて間違った仮定がありました。ネットワークに問題があり、Franklin.localがpingを返さない場合は失敗し、リモートで接続されているようです。 Franklin.localがネットワーク上にある場合はping -c 1 franklin.local0を返し、そうでない場合は68をすぐに返します。したがって、唯一の変更は、pingの数が5から1に変更されることです(より理解しやすくスクリプトの順序も調整しました)。

function franklin
{
    ping -c 1 franklin.local &> /dev/null
    if [[ $? == 0 ]]; then
        echo "Connecting locally."
        ssh "[email protected]"
    else
        echo "Connecting remotely."
        ssh "remote.address.of.franklin"
    fi
}

これは以前に行ったよりもはるかに速く、適切なsshコマンドを直接使用するよりもはるかに遅くはありません。

関連情報