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

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

インターネット接続を確認するスクリプトが見つかりました。一部は、インターフェイスが動作している場合は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。)

答え2

IPv4接続テスト

ネットワークでpingを許可している場合は、8.8.8.8(Googleが運営するサーバー)にpingを試してください。

if ping -q -c 1 -W 1 8.8.8.8 >/dev/null; then
  echo "IPv4 is up"
else
  echo "IPv4 is down"
fi

IP接続とDNSテスト

DNSが機能している場合にのみテストが成功するようにするには、ホスト名を使用します。

if ping -q -c 1 -W 1 google.com >/dev/null; then
  echo "The network is up"
else
  echo "The network is down"
fi

ネットワーク接続テスト

一部のファイアウォールはpingをブロックします。一部の場所には、ネットワークプロキシを除くすべてのトラフィックをブロックするファイアウォールがあります。 Web 接続をテストするには、HTTP 要求を行うだけです。

case "$(curl -s --max-time 2 -I http://google.com | sed 's/^[^ ]*  *\([0-9]\).*/\1/; 1q')" in
  [23]) echo "HTTP connectivity is up";;
  5) echo "The web proxy won't let us through";;
  *) echo "The network is down or very slow";;
esac

答え3

私はいくつかの方法を使用してインターネット接続を確認するスクリプトを作成しました(Adam Katz、Gilles、Archemarのおかげでping、nc、およびcurl)。誰かがこれが役に立つと思います。必要に応じて自由に編集/最適化してください。

ゲートウェイ、DNS、およびインターネット接続を確認してください(curl、nc、pingを使用)。ファイルに入れて実行可能にします(通常sudo chmod +x filename)。

#!/bin/bash

GW=`/sbin/ip route | awk '/default/ { print $3 }'`
checkdns=`cat /etc/resolv.conf | awk '/nameserver/ {print $2}' | awk 'NR == 1 {print; exit}'`
checkdomain=google.com

#some functions

function portscan
{
  tput setaf 6; echo "Starting port scan of $checkdomain port 80"; tput sgr0;
  if nc -zw1 $checkdomain  80; then
    tput setaf 2; echo "Port scan good, $checkdomain port 80 available"; tput sgr0;
  else
    echo "Port scan of $checkdomain port 80 failed."
  fi
}

function pingnet
{
  #Google has the most reliable host name. Feel free to change it.
  tput setaf 6; echo "Pinging $checkdomain to check for internet connection." && echo; tput sgr0;
  ping $checkdomain -c 4

  if [ $? -eq 0 ]
    then
      tput setaf 2; echo && echo "$checkdomain pingable. Internet connection is most probably available."&& echo ; tput sgr0;
      #Insert any command you like here
    else
      echo && echo "Could not establish internet connection. Something may be wrong here." >&2
      #Insert any command you like here
#      exit 1
  fi
}

function pingdns
{
  #Grab first DNS server from /etc/resolv.conf
  tput setaf 6; echo "Pinging first DNS server in resolv.conf ($checkdns) to check name resolution" && echo; tput sgr0;
  ping $checkdns -c 4
    if [ $? -eq 0 ]
    then
      tput setaf 6; echo && echo "$checkdns pingable. Proceeding with domain check."; tput sgr0;
      #Insert any command you like here
    else
      echo && echo "Could not establish internet connection to DNS. Something may be wrong here." >&2
      #Insert any command you like here
#     exit 1
  fi
}

function httpreq
{
  tput setaf 6; echo && echo "Checking for HTTP Connectivity"; tput sgr0;
  case "$(curl -s --max-time 2 -I $checkdomain | sed 's/^[^ ]*  *\([0-9]\).*/\1/; 1q')" in
  [23]) tput setaf 2; echo "HTTP connectivity is up"; tput sgr0;;
  5) echo "The web proxy won't let us through";exit 1;;
  *)echo "Something is wrong with HTTP connections. Go check it."; exit 1;;
  esac
#  exit 0
}


#Ping gateway first to verify connectivity with LAN
tput setaf 6; echo "Pinging gateway ($GW) to check for LAN connectivity" && echo; tput sgr0;
if [ "$GW" = "" ]; then
    tput setaf 1;echo "There is no gateway. Probably disconnected..."; tput sgr0;
#    exit 1
fi

ping $GW -c 4

if [ $? -eq 0 ]
then
  tput setaf 6; echo && echo "LAN Gateway pingable. Proceeding with internet connectivity check."; tput sgr0;
  pingdns
  pingnet
  portscan
  httpreq
  exit 0
else
  echo && echo "Something is wrong with LAN (Gateway unreachable)"
  pingdns
  pingnet
  portscan
  httpreq

  #Insert any command you like here
#  exit 1
fi

答え4

すべてのユーザーと他のサイトの貢献のおかげで、私はこのスクリプトを3日で完了できました。無料で使用させていただきます。

このスクリプトは、接続が切断されるとIPアドレスを自動的に更新し、継続的に更新します。

#!/bin/bash

# Autor: John Llewelyn
# FB: fb.com/johnwilliam.llewelyn
# Twitter: twitter.com/JWLLEWELYN
# TLF: +584-1491-011-15
# Its use is free.
# Description: Connection Monitor for ADSL modem.
# Requirements:
# Copy this code or save to /home/administrator/ConnectionMonitor.sh
# It requires the installed packages fping beep and cron
# Comment the blacklist pcspkr snd-pcsp in /etc/modprobe.d/blacklist.conf
# Give execute permissions: chmod +x /home/administrator/ConnectionMonitor.sh
# Add this line in crontab -e with root user
# @reboot sleep 120 && /home/administrator/MonitorDeConexion.sh

#################################################################################
# SETTINGS
TEST="8.8.8.8"       # TEST PING
ADAPTER1="enp4s0"    # EXTERNAL ETHERNET ADAPTER

# Report
LOGFILE=/home/administrator/Documentos/ReportInternet.log

# Messages
MESSAGE1="Restoring Connectivity..."
MESSAGE2="Wait a moment please..."
MESSAGE3="No Internet connectivity."
MESSAGE4="Yes, there is Internet connectivity."
#################################################################################

# Time and Date
TODAY=$(date "+%r %d-%m-%Y")

# Show IP Public Address
IPv4ExternalAddr1=$(ip addr list $ADAPTER1 |grep "inet " |cut -d' ' -f6|cut -d/ -f1)
IPv6ExternalAddr1=$(ip addr list $ADAPTER1 |grep "inet6 " |cut -d' ' -f6|cut -d/ -f1)

# Alarm
alarm() {
    beep -f 1500 -l 200;beep -f 1550 -l 200;beep -f 1500 -l 200;beep -f 1550 -l 200;beep -f 1500 -l 200;beep -f 1550 -l 200;beep -f 1500 -l 200;beep -f 1550$
}

# Restoring Connectivity
resolve() {
    clear
    echo "$MESSAGE1"
    sudo ifconfig $ADAPTER1 up;sudo dhclient -r $ADAPTER1;sleep 5;sudo dhclient $ADAPTER1
    echo "$MESSAGE2"
    sleep 120
}

# Execution of work
while true; do
    if [[ "$(fping -I $ADAPTER1 $TEST | grep 'unreachable' )" != "" ]]; then
        alarm
        clear
        echo "================================================================================" >> ${LOGFILE}
        echo "$MESSAGE3 - $TODAY"                                                               >> ${LOGFILE}
        echo "$MESSAGE3 - $TODAY"
        echo "================================================================================" >> ${LOGFILE}
        sleep 10
        resolve
    else
        clear
        echo "================================================================================"   >> ${LOGFILE}
        echo "$MESSAGE4 - $TODAY - IPv4 Addr: $IPv4ExternalAddr1 - IPv6 Addr: $IPv6ExternalAddr1" >> ${LOGFILE}
        echo "$MESSAGE4 - $TODAY - IPv4 Addr: $IPv4ExternalAddr1 - IPv6 Addr: $IPv6ExternalAddr1"
        echo "================================================================================"   >> ${LOGFILE}
        sleep 120
    fi
done

貼り付けボックス:https://pastebin.com/wfSkpgKA

関連情報