私は家にコンピュータを持っています。フランクリン(私はそう呼んでいます)私は仕事用のラップトップでSSHを頻繁に使います。家にいるときはFranklin.localでSSH経由で接続し、職場や他の場所にいるときはRemote.address.of.franklinでSSH経由で接続します。
状況に応じて、常に正しい方法で接続する機能が私のプロフィールにあってほしいです。私のネットワークの状態は頻繁に変わります(有線対無線、さまざまなSSIDなど)。したがって、ネットワークの状態を検出してこれを実行したくないのではなく、次のことを行います。
- フランクリンをローカルで利用できる場合は、ローカルに接続してください。
- それ以外の場合はリモート接続
これが私が今使っているものです:
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
私は使うnc
pingを送る代わりに:
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.local
0を返し、そうでない場合は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コマンドを直接使用するよりもはるかに遅くはありません。