Existe-t-il un moyen simple de vérifier la connectivité Internet à partir de la console? J'essaie de jouer dans un script Shell. Une idée me semble être de wget --spider http://www.google.co.in/
et de vérifier le code de réponse HTTP pour interpréter si la connexion Internet fonctionne correctement. Mais je pense qu'il doit y avoir moyen facile sans la nécessité de vérifier un site qui ne plante jamais;)
Edit: On dirait qu'il peut y avoir beaucoup de facteurs qui peuvent être examinés individuellement, ce qui est une bonne chose. Mon intention pour le moment est de vérifier si mon blog est en panne. J'ai configuré cron pour le vérifier toutes les minutes. Pour cela, je vérifie le code de réponse HTTP de wget --spider sur mon blog. Si ce n'est pas 200, il m'en avertit (je pense que ce sera mieux que de simplement l'envoyer, car le site peut être très chargé et le délai d'attente ou une réponse très tardive). Or hier, il y avait un problème avec mon Internet. Le réseau local était bien connecté, mais je ne pouvais accéder à aucun site. Je continue donc à recevoir des notifications car le script ne pouvait pas trouver 200 dans la réponse wget. Maintenant, je veux m'assurer qu'il affiche une notification lorsque j'ai une connexion Internet.
Donc, vérifier la connectivité DNS et LAN est un peu excessif pour moi car je n’ai pas vraiment besoin de comprendre le problème. Alors, que suggérez-vous comment je le fais?
Voici mon script pour continuer à vérifier les temps d'arrêt de mon blog:
#!/bin/bash
# Sending the output of the wget in a variable and not what wget fetches
RESULT=`wget --spider http://blog.ashfame.com 2>&1`
FLAG=0
# Traverse the string considering it as an array of words
for x in $RESULT; do
if [ "$x" = '200' ]; then
FLAG=1 # This means all good
fi
done
if [ $FLAG -eq '0' ]; then
# A good point is to check if the internet is working or not
# Check if we have internet connectivity by some other site
RESULT=`wget --spider http://www.facebook.com 2>&1`
for x in $RESULT; do
if [ "$x" = '200' ]; then
FLAG=1 # This means we do have internet connectivity and the blog is actually down
fi
done
if [ $FLAG -eq '1' ]; then
DISPLAY=:0 notify-send -t 2000 -i /home/ashfame/Dropbox/Ubuntu/icons/network-idle.png "Downtime Alert!" "http://blog.ashfame.com/ is down."
fi
fi
exit
De cette manière, je n'ai besoin de vérifier la connectivité Internet que s'il existe un problème avec le code de réponse de mon blog. C'est un peu lourd (comme je n'utilise pas de ping) mais ne devrait pas donner de faux positifs. Droite? Aussi, comment puis-je envoyer des requêtes ping sur un site différent à chaque fois, comme Facebook, Google, Yahoo, etc.? De plus, je peux écrire dans un fichier journal afin de contrôler le nombre de contrôles d'indisponibilité et passez ensuite à d'autres vérifications jusqu'à ce que le site soit en panne ou provoquez des vérifications plus longues (10 minutes au lieu de toutes les minutes). Qu'est-ce que tu penses?
Premièrement, plusieurs bons services de surveillance en ligne sont disponibles. Pour en choisir un, Pingdom inclut un compte gratuit permettant de surveiller une cible. (Avertissement: je suis pas affilié à Pingdom en aucune façon).
Deuxièmement, utiliser wget --spider
pour votre propre script est une bonne idée. Vous obtenez des faux positifs lorsque votre ordinateur est en panne ou que votre serveur DNS ne fonctionne pas. Vérifier le code de retour est un moyen simple de le faire:
wget --spider --quiet http://example.com
if [ "$?" != 0 ]; then
echo "Website failed!" | mail -s "Website down" [email protected]
fi
Encore une fois, cette approche présente des lacunes. Si votre fournisseur a mis en cache votre enregistrement DNS, mais que le serveur DNS est en panne, les autres utilisateurs ne peuvent pas accéder à votre site même si l'analyse indique que tout va bien. Vous pouvez écrire une solution de contournement rapide avec Host
, par exemple Host example.com <your dns server IP>
. Cela renverra une erreur si le serveur DNS ne répond pas, même si OpenDNS ou le serveur DNS de votre propre fournisseur fonctionne correctement.
Il n'y a pas vraiment de moyen facile de gérer cela dans tous les cas.
Vous pouvez par exemple exécuter ping -c1
sur plusieurs sites connus (par exemple, www.google.com, facebook.com et ping.funet.fi) et vérifier les codes de retour pour déterminer si une destination est accessible. Vous pouvez vérifier automatiquement le code de retour à l'aide de la variable $?
. Le paramètre -c1
limite le nombre de paquets ping à un.
Vous pouvez rencontrer des problèmes avec certains réseaux publics lorsqu'il existe une passerelle de connexion qui redirige toutes les requêtes ping et HTTP. Si tel est le cas, vous pouvez obtenir des réponses au ping et des codes d’état HTTP sans erreur, même lorsque vous ne pouvez accéder à aucun autre site.
Si vous voulez vérifier l'état du câble, vous pouvez utiliser
Sudo ethtool eth0
De sortie (extrait):
Speed: 1000Mb/s
Duplex: Full
Port: Twisted Pair
Link detected: yes
Cependant, cela ne dit pas si vous avez réellement une connectivité ou pas, mais juste si le câble est connecté et quelque chose est à l'autre bout.
J'utilise cette méthode ...
if [["$ (ping -c 1 8.8.8.8 | grep '100% perte de paquet')"! = ""]]; alors echo "Internet n'est pas présent" sortie 1 sinon echo "Internet est présent" wget www.site.com Fi
Je viens d'utiliser
nm-online
qui s'interrompt jusqu'à ce qu'une connexion réseau soit présente par le gestionnaire de réseau. A bien fonctionné. Vous pouvez aussi faire d'autres choses avec.
La vérification de la disponibilité d’un site est généralement effectuée à l’aide d’un outil de surveillance tel que nagios
name__. Cela surveillera en permanence le site et pourra vous avertir des pannes.
Lorsque je vérifie si Internet est activé depuis la ligne de commande, je passe par un certain nombre d’étapes:
ping google.com
(vérifie DNS et le site accessible connu).wget
ou w3m
pour récupérer la page.Si Internet n'est pas actif, diagnostiquez-le vers l'extérieur.
Si Internet est en service mais que le site est en panne, vérifiez avec w3m http://isup.me/example.com
en remplaçant example.com
par le site qui apparaît en bas. Utilisez wget, lynx ou tout autre navigateur en ligne de commande disponible si le navigateur w3m n’est pas installé.
Voici le script Shell que j'utilise pour tester la connectivité Internet:
alarm.sh
#! /bin/bash
if curl --silent --head http://www.google.com/ |
egrep "20[0-9] Found|30[0-9] Found" >/dev/null
then
echo Internet status: OK
else
echo Internet status: ERROR
mpg321 alarm.mp3 &> /dev/null
fi
sleep 60
clear
./alarm.sh
Vous devrez installer curl et mpg321
Sudo apt-get install curl mpg321
Vous aurez besoin d’un fichier son .mp3 renommé en alarm.mp3 dans le même dossier si vous souhaitez une fonctionnalité d’alarme sonore. Enfin, configurez l’URL du site Web et egrep à vos besoins.
Sudo nm-tool | grep "State: connected" | wc -l
De sortie (extrait):
1 #System is connected to internet
Cependant, comme d'autres l'ont mentionné, cela ne dit pas si vous avez réellement une connectivité ou non. Par exemple. Vous pourriez être connecté au routeur et le routeur n’est pas nécessairement connecté à Internet.
J'utilise cette méthode:
if curl -s --head --request GET www.google.com | grep "200 OK" > /dev/null ; then
echo "Internet is present"
else
echo "Internet isn't present"
fi
Il essaiera de se connecter à un site Web bien connu et s’il peut s'y connecter, nous supposerons qu’il ya Internet.
Je recherchais un script permettant de tester en permanence ma connexion Internet, qui serait démarré chaque fois que mon serveur était installé et que je réalisais ceci:
Tout d'abord, installez fping
apt-get install fping
Créez un script d'initialisation dans le dossier /etc/init.d avec le contenu suivant (je l'ai appelé testcon)
#!/bin/bash
PIDFILE=/var/run/testcon.pid
. /lib/lsb/init-functions
case "$1" in
start)
log_daemon_msg "Starting internet connection tester"
/etc/init.d/testcond &
echo $! > $PIDFILE
log_end_msg $?
;;
stop)
log_daemon_msg "Stopping internet connection tester"
PID=$(cat $PIDFILE)
kill -9 "$PID"
log_end_msg $?
;;
*)
echo "Usage: /etc/init.d/testcon {start|stop}"
exit 1
;;
esac
exit 0
Créez un script dans le dossier /etc/init.d avec le contenu suivant (je l'ai appelé testcond)
#echo Computer starting or testing daemon init
while [ "$itest" == "" ]
do
#wait 5 seconds
sleep 5
itest=$(fping 8.8.8.8 | grep alive)
done
date | mail -s "Server is up and Internet is online" [email protected]
#loop forever
while [ "1" == "1" ]
do
itest=$(fping 8.8.8.8 | grep alive)
#if internet is down
if [ "$itest" == "" ]
then
#echo Internet is down
#log time it was found down
current_time=$(date)
echo "Internet was found down @ $current_time" >> /mnt/data/Server/internet_log.txt
#loop until it is back
while [ "$itest" == "" ]
do
#wait 60 seconds
sleep 60
itest=$(fping 8.8.8.8 | grep alive) # test the internet
done
#when it is back
current_time=$(date)
echo "Internet is back @ $current_time" >> /mnt/data/Server/internet_log.txt
body=$(tail -2 /mnt/data/Server/internet_log.txt)
echo "$body" | mail -s "Internet is back online" [email protected]
fi
#echo Internet is online
#wait 60 seconds
sleep 60
done
Ensuite, j'exécute les commandes ci-dessous pour ajouter au démarrage:
Sudo update-rc.d testcon defaults
Sudo update-rc.d testcon enable
Redémarrer
J'avais besoin d'aide pour la même question et j'ai obtenu ma réponse de la manière suivante:
echo $(nm-online) $? connection problems
Vérifier si Internet fonctionne n'est pas si trivial. ping est ICMP, donc cela pourrait fonctionner même si le proxy web est en panne. Quelque chose de similaire se produit avec DNS si vous testez avec une adresse IP.
Comme ma connexion Internet est instable, j'ai créé ce script ( basé sur celui-ci ) qui émet un son doux pour m'appeler, et utilise également Ubuntu notify lorsque la connexion Internet est rétablie:
#!/bin/bash
hash play 2>&- || { echo >&2 "I require «play» but it's not installed. Try apt-get install sox. Aborting."; exit 1; }
WGET="`which wget`"
URL="http://www.google.com"
delay=3;
noConnectionMessage="No connection, trying again in $delay seconds...";
connectionMessage="WE HAVE INTERNET! :) Trying again in $delay seconds...";
echo "INTERNET TESTER: Type Ctrl+C to quit";
rm --force /tmp/index.site
function playSound {
time=1; # Time played
if [ `sox --version| grep -oP "v[0-9.]+" | sed "s/[v.]//g"` -lt 1431 ]; then #analize sox version, if greater than v14.3.1 can use pluck
play -q -n synth $time sine;
else
play -q -n synth $time pluck $1;
#for i in G4 G4 G4 E4;do play -n synth 0.1 pluck $i repeat 2;done # You can play with something like this also :) (first three notes from Beethoven 5th symphony)
fi
}
while [ 1 -eq 1 ]; do
$WGET -q --tries=10 --timeout=2 $URL -O /tmp/index.site &> /dev/null
if [ ! -s /tmp/index.site ];then
echo $noConnectionMessage;
#playSound E2
sleep 1;
else
#~ zenity --warning --text "ADDRESS is back"
notify-send -i "notification-network-wireless-full" "Connection state:" "$connectionMessage";
echo $connectionMessage;
playSound E3
fi
sleep $delay;
done
exit 0;
J'ai été confronté à des déjections aléatoires de connexions Wi-Fi avec ma puce Broadcom BCM94331CD
. J'ai conçu le script bash suivant (boucle infinie) vérifiant chaque seconde si la connexion Internet Wi-Fi est opérationnelle. Une autre ligne de commande proposée ici attendra au moins 5 à 10 secondes avant de se fermer avec un statut, à savoir ping
name__. En attendant, je cherche aussi une solution définitive.
D'après les résultats de askubuntu, je devrai purger le paquet bcmwl-kernel-source
car j'utilise firmware-b43-installer
et b43-fwcutter
.
Merci à tous pour leurs suggestions (ci-dessus).
Ce script doit être ajouté aux programmes de démarrage et n'a pas besoin du privilège super user
pour s'exécuter également.
#!/bin/bash
#
# Check if Wi-Fi is disabled e.g. 'out of range'
# If so quickly re-enable Wi-Fi
# Due to a problem with Broadcom proprietary driver in package firmware-b43-installer
# Script is part of Start-Up programs
# Stored in /usr/local/bin/
# Infinite loop checking every second if Wi-Fi is up and running
while true; do
# https://askubuntu.com/questions/27954/how-can-i-check-internet-connectivity-in-a-console
if [[ $(nmcli -f STATE -t g) != 'connected' ]]; then
# Disable and Re-Enable Wi-Fi as the Wi-Fi is now 'out of range' (disconnected)
nmcli radio wifi off
nmcli radio wifi on
fi
sleep 1
done