シェルスクリプト:インターネット接続を確認する正しい方法は何ですか?

シェルスクリプト:インターネット接続を確認する正しい方法は何ですか?

インターネット接続を確認するスクリプトが見つかりました。一部は、インターフェイスが動作している場合はIPアドレスを確認しますが、インターネット接続は確認しません。私は次のpingを使用していることを発見しました。if [ 'ping google.com -c 4 | grep time' != "" ]; thenしかし、時にはping自体が何らかの理由で(たとえば、IOが停止するのを待つなど)中断される可能性があるため、これは信頼できない可能性があります。

スクリプトを使用してインターネット接続を確認する正確で信頼性の高い方法に関する提案はありますか?使用する必要があるパッケージはありますか?

cronたとえば、定期的に確認した後に接続が切断された場合は、電話をかけるなどの操作を実行できるはずです。ifup --force [interface]

ベストアンサー1

私は強くお勧めします反対する接続を決定するために使用されますping。あまりにも多くのネットワーク管理者が無効になっています。ICMP(使用するプロトコル) 懸念によりピング洪水ネットワークから攻撃を受けます。

代わりに、開いていると予想されるポートで信頼性の高いサーバーを使用してクイックテストを実行しました。

if nc -zw1 google.com 443; then
  echo "we have connectivity"
fi

ncこれはnetcat()を使用します。ポートスキャンモード、クイック突き(-zはいZero I/Oモード[スキャン用])には高速タイムアウトがあります(-w 1最大1秒待ちますが、Apple OS Xユーザーはこの機能を使用する必要があるかもしれません-G 1)。ポート443(HTTPS)でGoogleを確認してください。

回避するために、HTTPの代わりにHTTPSを使用してください。捕虜ポータルそして透明プロキシすべてのホストに対してポート80(HTTP)で応答できます。証明書の不一致が原因でポート 443 を使用すると、これが発生する可能性は少なくなりますが、まだ発生する可能性があります。

これを証明するには、接続のセキュリティを確認する必要があります。

test=google.com
if nc -zw1 $test 443 && echo |openssl s_client -connect $test:443 2>&1 |awk '
  $1 == "SSL" && $2 == "handshake" { handshake = 1 }
  handshake && $1 == "Verification:" { ok = $2; exit }
  END { exit ok != "OK" }'
then
  echo "we have connectivity"
fi

これは、接続を確認してから(opensslタイムアウトを待つのではなく)確認ステップに焦点を当て、SSLハンドシェイクを実行します。検証が「OK」の場合は自動的に終了し(「true」)、そうでない場合はエラー(「false」)で終了し、結果が報告されます。

opensslawkコードは出力を1行ずつ分析します。

  1. 行の最初の単語が「SSL」で、2番目の単語が「Verification」の場合は、次のようhandshakeに設定されます。1
  2. handshake設定し、行の最初の単語が「verification」の場合は、
    2番目の単語(検証状態)を保存しokて読み取りを中止します。
  3. 0検証ステータスがtrueの場合(true)値で終了しOK、それ以外の場合1(false)値で終了します。シェルの終了コードが次のものと逆のため、ここで使用します
    !=

(awkの1つの奇妙な点:行のexit読み取り中に実行すると、行の読み取りが停止し、END実際に実行できる条件が入力されますexit。)

おすすめ記事