Comment tester une connexion Internet avec bash?
comment une connexion internet peut-elle être testée sans qu'il y ait de site web? Je veux dire, et s'il y a une connexion mais que le site est en panne? Est-il vérifier pour une connexion avec le monde?
18 réponses
ping www.google.com
ping www.yahoo.com
ping www.facebook.com
ping www.stackoverflow.com
Faire cela, et vous pouvez être sûr:)
Ping votre passerelle par défaut:
#!/bin/bash
ping -q -w 1 -c 1 `ip r | grep default | cut -d ' ' -f 3` > /dev/null && echo ok || echo error
sans ping
#!/bin/bash
wget -q --spider http://google.com
if [ $? -eq 0 ]; then
echo "Online"
else
echo "Offline"
fi
- q : mode Silence
--spider : ne pas obtenir, il suffit de vérifier la disponibilité de la page
$? : code de retour shell
0 : coque "Tout est OK" code
sans wget
#!/bin/bash
echo -e "GET http://google.com HTTP/1.0\n\n" | nc google.com 80 > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "Online"
else
echo "Offline"
fi
Super merci à l'utilisateur somedrew pour leur post ici: https://bbs.archlinux.org/viewtopic.php?id=55485 le 2008-09-20 02:09: 48
en Regardant dans /sys/class/net devrait être un moyen
Voici mon script pour tester une connexion réseau Autre que la boucle de retour. J'utilise ce qui suit dans un autre script que j'ai pour tester périodiquement si mon site est accessible. Si ce n'est pas accessible une fenêtre popup m'alerte d'un problème.
le script ci-dessous m'empêche de recevoir des messages popup toutes les cinq minutes chaque fois que mon ordinateur portable n'est pas connecté au réseau.
#!/usr/bin/bash
# Test for network conection
for interface in $(ls /sys/class/net/ | grep -v lo);
do
if [[ $(cat /sys/class/net/$interface/carrier) = 1 ]]; then OnLine=1; fi
done
if ! [ $OnLine ]; then echo "Not Online" > /dev/stderr; exit; fi
Note pour les nouveaux venus à bash: la déclaration finale " si " tests sinon [!] en ligne et sort si tel est le cas. Voir Man bash et rechercher "Expressions may be combined" pour plus de détails.
P. S. je pense que ping n'est pas la meilleure chose à utiliser ici parce qu'il vise à tester une connexion à un hôte particulier ne pas tester s'il ya une connexion à un réseau de toute sorte.
P. P. S. Les travaux ci-Dessus sur Ubuntu 12.04 /sys ne peut pas exister sur d'autres distros. Voir ci-dessous:
distributions Linux modernes comprennent un répertoire / sys comme un système de fichiers virtuel (sysfs, comparable à / proc, qui est un procfs), qui stocke et permet la modification des périphériques connectés au système, alors que de nombreux systèmes D'exploitation UNIX et de type Unix traditionnels utilisent /sys comme lien symbolique vers l'arbre des sources du noyau.[citation nécessaire]
de Wikipedia https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard
cela fonctionne à la fois sur MacOSX et Linux:
#!/bin/bash
ping -q -w1 -c1 google.com &>/dev/null && echo online || echo offline
j'ai déjà écrit des scripts qui utilisent simplement telnet pour se connecter au port 80, puis transmettre le texte:
HTTP/1.0 GET /index.html
suivi de deux séquences CR/LF.
si vous obtenez une réponse HTTP, vous pouvez généralement supposer que le site fonctionne.
la réponse du haut manque le fait que vous pouvez avoir une connexion parfaitement stable à votre passerelle par défaut, mais cela ne signifie pas automatiquement que vous pouvez réellement atteindre quelque chose sur l'internet. L'OP demande comment il/elle peut tester une connexion avec le monde. Je suggère donc de modifier la réponse en haut en changeant L'adresse IP de la passerelle en une adresse IP connue (X. Y. z. w) c'est en dehors de votre LAN.
ainsi la réponse deviendrait:
ping -q -w 1 -c 1 x.y.z.w > /dev/null && echo ok || echo error
enlevant également le backticks défavorables pour la substitution de commande [1] .
si vous voulez juste vous assurer que vous êtes connectés au monde avant d'exécuter un code, vous pouvez aussi utiliser:
if ping -q -w 1 -c 1 x.y.z.w > /dev/null; then
# more code
fi
si votre serveur de noms local est en panne,
ping 4.2.2.1
est une adresse IP facile à mémoriser (c'est même en fait un serveur de noms).
assurez-vous que votre réseau TCP trafic, alors vous pourriez récupérer votre public face IP avec la commande suivante
curl ifconfig.co
exécutez la commande suivante pour vérifier si un site web est activé, et quel message d'état le serveur web affiche:
$ curl -Is http://www.hithertech.com |
head -1 HTTP/1.1 200 OK
code de statut '200 OK' signifie que la demande a réussi et qu'un site web est accessible.
Ping a été conçu pour faire exactement ce que vous cherchez à faire. Cependant, si le site bloque ICMP echo, alors vous pouvez toujours faire le telnet au port 80 d'un site, wget, ou curl.
chemin le plus court: fping 4.2.2.1
= > "4.2.2.1 est vivant"
je préfère ce que c'est plus rapide et moins verbeux sortie de ping
, l'inconvénient est que vous aurez à installer.
vous pouvez utiliser n'importe quel public dns plutôt qu'un site Web spécifique.
fping -q google.com && echo "do something because you're connected!"
-q
renvoie un code de sortie, Donc je montre juste un exemple d'exécution de quelque chose que vous êtes en ligne.
à installer sur mac: brew install fping
; sur ubuntu: sudo apt-get install fping
le top réponse voté ne fonctionne pas pour MacOS donc pour ceux sur un mac, Je l'ai testé avec succès:
GATEWAY=`route -n get default | grep gateway`
if [ -z "$GATEWAY" ]
then
echo error
else
ping -q -t 1 -c 1 `echo $GATEWAY | cut -d ':' -f 2` > /dev/null && echo ok || echo error
fi
testé sur MacOS High Sierra 10.12.6
ce script bash vérifier en permanence pour Internet et faire un bip sonore lorsque L'Internet est disponible.
#!/bin/bash
play -n synth 0.3 sine 800 vol 0.75
while :
do
pingtime=$(ping -w 1 8.8.8.8 | grep ttl)
if [ "$pingtime" = "" ]
then
pingtimetwo=$(ping -w 1 www.google.com | grep ttl)
if [ "$pingtimetwo" = "" ]
then
clear ; echo 'Offline'
else
clear ; echo 'Online' ; play -n synth 0.3 sine 800 vol 0.75
fi
else
clear ; echo 'Online' ; play -n synth 0.3 sine 800 vol 0.75
fi
sleep 1
done
Pong ne signifie pas que le service web sur le serveur est en cours d'exécution; cela signifie simplement que le serveur répond à ICMP echo. Je recommande d'utiliser curl et de vérifier sa valeur de retour.
vérifier la page d'index de Google est une autre façon de le faire:
#!/bin/bash
WGET="/usr/bin/wget"
$WGET -q --tries=20 --timeout=10 http://www.google.com -O /tmp/google.idx &> /dev/null
if [ ! -s /tmp/google.idx ]
then
echo "Not Connected..!"
else
echo "Connected..!"
fi
comme pour @la réponse de Jesse , cette option pourrait être beaucoup plus rapide que n'importe quelle solution utilisant ping
et peut-être un peu plus efficace que @la réponse de Jesse .
find /sys/class/net/ -maxdepth 1 -mindepth 1 ! -name "*lo*" -exec sh -c 'cat ""151900920""/carrier 2>&1' {} \; | grep -q '1'
explication:
cette commande utilise find
avec -exec
pour exécuter la commande sur tous les fichiers non nommés *lo*
dans /sys/class/net/
. Il doit s'agir de liens vers des répertoires contenant de l'information. sur les interfaces réseau disponibles sur votre machine.
la commande exécutée est une commande sh
qui vérifie le contenu du fichier carrier
dans ces répertoires. La valeur de $interface/carrier
a 3 significations - citant :
il semble qu'il y ait trois états:
- ./ support non lisible (par exemple lorsque l'interface est désactivée dans le réseau Gestionnaire.)
- ./transporteur contient "1" (lorsque l'interface est activée et qu'il est connecté à un réseau wi-fi)
- ./transporteur contenir "0" (lorsque l'interface est activée et qu'il n'est pas connecté à un réseau WiFi)
la première option n'est pas prise en compte dans la réponse de @Jesse . La commande sh
rayée est:
# Note: "151910920" == $interface
cat ""151910920""/carrier 2>&1
cat
est utilisé pour vérifier le contenu de carrier
et rediriger toute la sortie vers la sortie standard même si elle échoue parce que le fichier n'est pas lisible.
Si grep -q
trouve "1"
parmi ces fichiers, cela signifie qu'il y a au moins 1 interface connectée. Le code de sortie de grep -q
sera le dernier code de sortie.
Utilisation
par exemple, en utilisant le statut de sortie de cette commande, vous pouvez l'utiliser pour démarrer un gnubiff dans votre ~/.xprofile
seulement si vous avez une connexion internet.
online() {
find /sys/class/net/ -maxdepth 1 -mindepth 1 ! -name "*lo*" -exec sh -c 'cat ""151920920""/carrier 2>&1 > /dev/null | grep -q "1" && exit 0' {} \;
}
online && gnubiff --systemtray --noconfigure &
référence
si votre but est de vérifier réellement l'accès Internet , bon nombre des réponses existantes à cette question sont erronées. Il y a quelques choses que vous devez savoir:
- il est possible pour votre ordinateur d'être connecté à un réseau sans que ce réseau ait accès à internet
- il est possible qu'un serveur soit en panne sans que tout l'internet soit inaccessible
- il est possible pour un captive portail de retourner une réponse HTTP pour une URL arbitraire même si vous n'avez pas accès à internet
dans cet esprit, je crois que la meilleure stratégie est de contacter plusieurs sites via une connexion HTTPS et de retourner true si l'un de ces sites répond.
par exemple:
connected_to_internet() {
test_urls="\
https://www.google.com/ \
https://www.microsoft.com/ \
https://www.cloudflare.com/ \
"
processes="0"
pids=""
for test_url in $test_urls; do
curl --silent --head "$test_url" > /dev/null &
pids="$pids $!"
processes=$(($processes + 1))
done
while [ $processes -gt 0 ]; do
for pid in $pids; do
if ! ps | grep "^[[:blank:]]*$pid[[:blank:]]" > /dev/null; then
# Process no longer running
processes=$(($processes - 1))
pids=$(echo "$pids" | sed --regexp-extended "s/(^| )$pid($| )/ /g")
if wait $pid; then
# Success! We have a connection to at least one public site, so the
# internet is up. Ignore other exit statuses.
kill -TERM $pids > /dev/null 2>&1 || true
wait $pids
return 0
fi
fi
done
# wait -n $pids # Better than sleep, but not supported on all systems
sleep 0.1
done
return 1
}
Utilisation:
if connected_to_internet; then
echo "Connected to internet"
else
echo "No internet connection"
fi
quelques notes sur cette approche:
- Il est robuste contre tous les faux positifs et négatifs que j'ai décrits ci-dessus
- les demandes se produisent toutes en parallèle pour maximiser la vitesse
- Il retournera false si vous techniquement ont accès à internet, mais le DNS est non fonctionnel ou vos paramètres réseau sont autrement foiré, je pense que c'est une chose raisonnable à faire dans la plupart des cas