J'ai trouvé des scripts qui disent qu'ils vérifient la connectivité Internet. Certains vérifient l'adresse IP si l'interface est en place MAIS elle ne vérifie pas la connectivité Internet. J'en ai trouvé qui utilisent ping comme ceci: if [ 'ping google.com -c 4 | grep time' != "" ]; then
mais parfois cela peut ne pas être fiable car le ping lui-même peut se bloquer pour une raison quelconque (par exemple, attendre des E/S bloquées).
Avez-vous des suggestions sur la manière appropriée/fiable de vérifier la connectivité Internet à l'aide de scripts? Dois-je utiliser des packages?
Il doit être en mesure de vérifier périodiquement avec cron
par exemple, puis, faire quelque chose lorsque la connexion tombe en panne comme invoquer ifup --force [interface]
Si votre réseau laisse passer les pings, essayez d'envoyer une requête ping à 8.8.8.8 (un serveur géré par Google).
if ping -q -c 1 -W 1 8.8.8.8 >/dev/null; then
echo "IPv4 is up"
else
echo "IPv4 is down"
fi
Si vous souhaitez que le test réussisse uniquement lorsque DNS fonctionne également, utilisez un nom d'hôte.
if ping -q -c 1 -W 1 google.com >/dev/null; then
echo "The network is up"
else
echo "The network is down"
fi
Certains pare-feu bloquent les pings. Certains endroits ont un pare-feu qui bloque tout le trafic, sauf via un proxy Web. Si vous souhaitez tester la connectivité Web, vous pouvez effectuer une demande 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
Je recommande fortement contre d'utiliser ping
pour déterminer la connectivité. Il y a trop d'administrateurs réseau qui désactivent ICMP (le protocole qu'il utilise) en raison des inquiétudes concernant ping flood les attaques provenant de leurs réseaux .
Au lieu de cela, j'utilise un test rapide d'un serveur fiable sur un port que vous pouvez vous attendre à ouvrir:
if nc -zw1 google.com 443; then
echo "we have connectivity"
fi
Cela utilise netcat (nc
) dans son mode scan de port , un coup rapide (-z
est mode zéro E/S [utilisé pour la numérisation] ) avec un délai d'attente rapide (-w 1
attend au plus une seconde). Il vérifie Google sur le port 443 (HTTPS).
J'ai utilisé HTTPS plutôt que HTTP pour me protéger contre portails captifs et proxies transparents qui peuvent répondre sur le port 80 (HTTP) pour tout hôte. Cela est moins probable lors de l'utilisation du port 443 car il y aurait une incompatibilité de certificat, mais cela se produit toujours.
Si vous souhaitez vous protéger contre cela, vous devrez valider la sécurité de la connexion:
test=google.com
if nc -zw1 $test 443 && echo |openssl s_client -connect $test:443 2>&1 |awk '
handshake && $1 == "Verification" { if ($2=="OK") exit; exit 1 }
$1 $2 == "SSLhandshake" { handshake = 1 }'
then
echo "we have connectivity"
fi
Cela vérifie une connexion (plutôt que d'attendre qu'opssl expire), puis effectue la négociation SSL, en tapant sur la phase de vérification. Il se ferme silencieusement ("vrai") si la vérification était "OK" ou bien se termine avec une erreur ("faux"), alors nous rapportons la constatation.
J'ai fait un script qui utilise plusieurs façons de vérifier la connexion Internet (ping, nc et curl, grâce à Adam Katz, Gilles et Archemar). J'espère que quelqu'un trouve cela utile. N'hésitez pas à le modifier à votre guise/à l'optimiser.
Vérifie votre passerelle, DNS et connexion Internet (en utilisant curl, nc et ping). Mettez-le dans un fichier puis rendez-le exécutable (généralement 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
il existe de nombreuses adresses IP sur Internet, une approche légère consiste à cingler certains d'entre eux
if ping -c 4 google.com ; then OK ; else KO ; fi
if ping -c 4 facebook.com ; then OK ; else KO ; fi
if ping -c 4 nsa.gov ; then OK ; else KO ; fi # <- this one might not reply
une réponse plus complète pourrait être d'obtenir des pages en utilisant wget
wget google.com -o google.txt
if parse google.txt ; then OK ; else KO ; fi
où
grâce à vos contributions de chaque utilisateur et autre web, j'ai réussi à terminer ce script en 3 jours. et je le laisserai libre pour son utilisation.
ce script automatise le renouvellement de l'adresse IP lorsque la connexion est perdue, il le fait de manière persistante.
#!/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
Pastebin: https://Pastebin.com/wfSkpgKA
@PNDA a suggéré d'obtenir des données d'ethtool, ce que j'aime. Mais, je préfère le piping à grep et l'utilisation d'une commande awk plus simple que les non-bash peuvent comprendre plus rapidement. La différence de temps entre les deux est négligeable.
Utilisation: buntu Bionic 18.04
Découverte de l'interface réseau:
root@srv:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope Host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope Host
valid_lft forever preferred_lft forever
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:1e:67:96:a3:97 brd ff:ff:ff:ff:ff:ff
inet 10.0.1.101/8 brd 10.255.255.255 scope global eno1
valid_lft forever preferred_lft forever
inet6 fe80::21e:67ff:fe96:a397/64 scope link
valid_lft forever preferred_lft forever
3: rename3: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
link/ether 00:1e:67:96:a3:96 brd ff:ff:ff:ff:ff:ff
sortie ethtool:
root@srv:~# ethtool eno1
Settings for eno1:
Supported ports: [ TP ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Supported pause frame use: No
Supports auto-negotiation: Yes
Supported FEC modes: Not reported
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Advertised pause frame use: No
Advertised auto-negotiation: Yes
Advertised FEC modes: Not reported
Speed: 1000Mb/s
Duplex: Full
Port: Twisted Pair
PHYAD: 1
Transceiver: internal
Auto-negotiation: on
MDI-X: on (auto)
Supports Wake-on: pumbg
Wake-on: g
Current message level: 0x00000007 (7)
drv probe link
Link detected: yes
Exemple de commande:
ethtool eno1 | grep "ink detected" | awk '{print $3}'
Choisissez votre propre aventure:
ethtool {{network adapter}} | grep "ink detected" | awk '{print $3}'
Production:
S'il y a un lien:
root@srv:~# ethtool eno1 | grep "ink detected" | awk '{print $3}'
yes
S'il n'y a pas de lien:
root@srv:~# ethtool rename3 | grep "ink detected" | awk '{print $3}'
no