インターネット接続を確認するスクリプトが見つかりました。一部は、インターフェイスが動作している場合は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」)で終了し、結果が報告されます。
openssl
awkコードは出力を1行ずつ分析します。
- 行の最初の単語が「SSL」で、2番目の単語が「Verification」の場合は、次のよう
handshake
に設定されます。1
handshake
設定し、行の最初の単語が「verification」の場合は、
2番目の単語(検証状態)を保存しok
て読み取りを中止します。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