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?

78
demandé sur lauriys 2009-05-30 12:45:49

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:)

-6
répondu Silfverstrom 2016-03-23 03:32:52

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
86
répondu mateusza 2009-05-31 15:04:55

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
83
répondu user3439968 2015-08-03 19:45:36

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

22
répondu Jesse 2013-02-18 15:09:32

cela fonctionne à la fois sur MacOSX et Linux:

#!/bin/bash

ping -q -w1 -c1 google.com &>/dev/null && echo online || echo offline
18
répondu legel 2018-05-03 15:53:56

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.

8
répondu paxdiablo 2009-05-30 08:50:24

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
5
répondu Fuwan 2018-02-01 14:42:00

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).

4
répondu ephemient 2009-05-31 02:43:52

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
3
répondu WaiKit Kung 2017-11-19 09:52:14

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.

3
répondu Chaminda Bandara 2017-12-13 13:53:07

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.

2
répondu nikudesu 2009-05-31 15:16:48

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

2
répondu Alex Moore-Niemi 2017-10-11 00:40:34

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

2
répondu Francisc0 2018-01-12 15:34:43

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
2
répondu Arjun G Perambra 2018-02-27 09:07:02

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.

1
répondu tomoe 2009-06-02 13:55:25

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
1
répondu dm76 2014-12-03 18:18:47

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

1
répondu Doron Behar 2017-06-16 16:15:04

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:

  1. il est possible pour votre ordinateur d'être connecté à un réseau sans que ce réseau ait accès à internet
  2. il est possible qu'un serveur soit en panne sans que tout l'internet soit inaccessible
  3. 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:

  1. Il est robuste contre tous les faux positifs et négatifs que j'ai décrits ci-dessus
  2. les demandes se produisent toutes en parallèle pour maximiser la vitesse
  3. 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
0
répondu Ajedi32 2018-09-04 13:25:05