Comment tester une connexion Internet sans envoyer de requête ping à un site Web? Je veux dire, que se passe-t-il s'il y a une connexion mais que le site est en panne? Y a-t-il un contrôle pour une connexion avec le monde?
Comment tester une connexion Internet sans envoyer de requête ping à un site Web? Je veux dire, que se passe-t-il s'il y a une connexion mais que le site est en panne? Y a-t-il un contrôle pour une connexion avec le monde?
Réponses:
Sans ping
#!/bin/bash
wget -q --spider http://google.com
if [ $? -eq 0 ]; then
echo "Online"
else
echo "Offline"
fi
-q : mode silence
--spider : n'obtenez pas, vérifiez simplement la disponibilité de la page
$?: code retour du shell
0 : code shell "Tout est OK"
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
nc
pour vous assurer qu'il expire . quelque chose commenc google.com 80 -w 10
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
function ping_gw() { ... && return 0 || return 1 }
puis utilisé comme ceci:ping_gw || (echo "no network, bye" && exit 1)
ifconfig down wlan0
et j'ai toujours une passerelle par défaut et elle est pingable, même si je ne peux en fait pas atteindre le monde extérieur.
Super merci à l'utilisateur somedrew pour son message ici: https://bbs.archlinux.org/viewtopic.php?id=55485 le 20/09/2008 02:09:48
La recherche dans / sys / class / net devrait être à sens unique
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 Web est accessible. Si ce n'est PAS accessible, une fenêtre contextuelle me signale un problème.
Le script ci-dessous m'empêche de recevoir des messages contextuels toutes les cinq minutes lorsque 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
Remarque pour les nouveaux utilisateurs de bash: la dernière instruction «if» teste si NON [!] En ligne et se termine si c'est le cas. Voir man bash et recherchez «Les expressions peuvent être combinées» pour plus de détails.
PS Je pense que le ping n'est pas la meilleure chose à utiliser ici car il vise à tester une connexion à un hôte particulier PAS à tester s'il existe une connexion à un réseau de quelque sorte que ce soit.
PPS The Above fonctionne sur Ubuntu 12.04 Le / sys peut ne pas exister sur certaines autres distributions. Voir ci-dessous:
Les distributions Linux modernes incluent un répertoire / sys en tant que 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 traditionnels de type UNIX et Unix utilisent / sys comme lien symbolique vers l'arborescence des sources du noyau. [citation nécessaire]
De Wikipedia https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard
cat /sys/class/net/wwan0/carrier
Ne fonctionne pas sur ubuntu 14.04 LTS.
2>/dev/null
après cat /sys/class/net/$interface/carrier
pour ne pas avoir de sortie d'erreur au cas où le réseau est désactivé.
Cela fonctionne à la fois sur MacOSX et Linux:
#!/bin/bash
ping -q -w1 -c1 google.com &>/dev/null && echo online || echo offline
ping: invalid option -- w
)
fping google.com
ou tout simplement fping 8.8.8.8
faire la magie avec un bonus vous obtenez le code de statut sans avoir besoin de le tester (" google.com is alive
") ...
Dans Bash, en utilisant son wrapper réseau via / dev / { udp , tcp } / host / port :
if : >/dev/tcp/8.8.8.8/53; then
echo 'Internet available.'
else
echo 'Offline.'
fi
( :
est le Bash no-op, car vous voulez juste tester la connexion, mais pas le traitement.)
J'ai écrit des scripts avant cela, utilisez simplement telnet pour vous connecter au port 80, puis transmettez le texte:
HTTP/1.0 GET /index.html
suivi de deux séquences CR / LF.
À condition de récupérer une forme de réponse HTTP, vous pouvez généralement supposer que le site fonctionne.
La réponse principale ne tient pas compte du 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 Internet. Le PO demande comment il / elle peut tester une connexion avec le monde. Je suggère donc de modifier la réponse principale en changeant l'adresse IP de la passerelle en une adresse IP connue (xyzw) qui se trouve en dehors de votre LAN.
La réponse deviendrait donc:
ping -q -w 1 -c 1 x.y.z.w > /dev/null && echo ok || echo error
Suppression également des backticks défavorables pour la substitution de commande [1] .
Si vous voulez juste vous assurer que vous êtes connecté au monde avant d'exécuter du code, vous pouvez également utiliser:
if ping -q -w 1 -c 1 x.y.z.w > /dev/null; then
# more code
fi
assurez-vous que votre réseau autorise le trafic TCP entrant et sortant, vous pourrez alors récupérer votre adresse IP publique avec la commande suivante
curl ifconfig.co
Exécutez la commande suivante pour vérifier si un site Web est actif et quel message d'état le serveur Web affiche:
$ curl -Is http://www.google.com |
head -1 HTTP/1.1 200 OK
Le code d'état «200 OK» signifie que la demande a réussi et qu'un site Web est accessible.
curl -Is http://www.google.com | head -1 | grep 200; if [[ $? -eq 0 ]]; then; echo "Online"; else; echo "Offline"; fi;
Si votre serveur de noms local est en panne,
ping 4.2.2.1
est une adresse IP toujours active et facile à retenir (c'est en fait un serveur de noms, même).
le réponse la plus votée ne fonctionne pas pour MacOS, donc pour ceux sur Mac, j'ai testé avec succès ceci:
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
route
commande en route -n get default 2> /dev/null | grep gateway
pour éviter d'écrire une erreur dans stderr en mode hors connexion.
Ce script bash vérifie en permanence Internet et émet un bip lorsque 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
chemin le plus court: fping 4.2.2.1
=> "4.2.2.1 est vivant"
je préfère cela car c'est une sortie plus rapide et moins verbeuse que ping
, l'inconvénient est que vous devrez l'installer.
vous pouvez utiliser n'importe quel DNS public 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
De la même manière que la réponse de @ Jesse , cette option pourrait être beaucoup plus rapide que n'importe quelle solution utilisant ping
et peut-être légèrement plus efficace que la réponse de @ Jesse .
find /sys/class/net/ -maxdepth 1 -mindepth 1 ! -name "*lo*" -exec sh -c 'cat "$0"/carrier 2>&1' {} \; | grep -q '1'
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 des informations sur les interfaces réseau disponibles sur votre machine.
La commande en cours d' sh
exécution est une commande qui vérifie le contenu du fichier carrier
dans ces répertoires. La valeur de $interface/carrier
a 3 significations - Citations :
Il semble qu'il y ait trois états:
- ./carrier non lisible (par exemple lorsque l'interface est désactivée dans Network Manager).
- ./carrier contient "1" (lorsque l'interface est activée et qu'elle est connectée à un réseau WiFi)
- ./carrier contient "0" (lorsque l'interface est activée et qu'elle n'est pas connectée à un réseau WiFi)
La première option n'est pas prise en compte dans la réponse de @ Jesse . La sh
commande rayée est:
# Note: $0 == $interface
cat "$0"/carrier 2>&1
cat
est utilisé pour vérifier le contenu de carrier
et rediriger toute la sortie vers la sortie standard même en cas d'échec car le fichier n'est pas lisible. Sigrep -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 code de sortie final.
Par exemple, en utilisant l'état de sortie de cette commande, vous pouvez l'utiliser pour démarrer un gnubiff dans votre ~/.xprofile
uniquement si vous avez une connexion Internet.
online() {
find /sys/class/net/ -maxdepth 1 -mindepth 1 ! -name "*lo*" -exec sh -c 'cat "$0"/carrier 2>&1 > /dev/null | grep -q "1" && exit 0' {} \;
}
online && gnubiff --systemtray --noconfigure &
Si votre objectif est de vérifier réellement l' accès à Internet , la plupart des réponses existantes à cette question sont erronées. Quelques points à prendre en compte:
Dans cet esprit, je pense que la meilleure stratégie consiste à contacter plusieurs sites via une connexion HTTPS et à renvoyer 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
}
Usage:
if connected_to_internet; then
echo "Connected to internet"
else
echo "No internet connection"
fi
Quelques notes sur cette approche:
if wait $pid;
. Je ne sais pas pourquoi cela ne fonctionne pas sur votre système. Êtes-vous sûr d'utiliser bash?
wait
comprends maintenant que le code de retour est en effet en cours de test. J'ai recopié votre code et aujourd'hui ça marche - oups! J'ai dû foirer quelque chose la dernière fois même si je ne comprends pas quoi ni comment. Néanmoins, mea culpa. Toutes mes excuses.
C'est nettement plus rapide que n'importe quelle solution publiée ici, et peut être utilisé pour tester un hôte spécifique .
L'astuce consiste à résoudre l'IP en utilisant un solveur DNS moins occupé que celui utilisé par ping
:
validateConnection () {
host="${1}"
ip=$(getent ahostsv4 "${host}" | awk '{ print $1 }' | head -n1)
ping -c1 "${ip}" 2>&1 >"/dev/null"
if [ "${?}" -ne 0 ]; then
echo "No connection to: ${host}" >&2
exit 1
fi
}