"login internet checker one-liner"

Avec cela, je peux vérifier, qu'il y a "connection internet". s'il n'y a pas de "connection internet" (pings réussis à ce 2 places), alors il attend 600 sec, puis il court:

ping -W 1 -c 4 www.google.com >& /dev/null && ping -W 1 -c 4 www.yahoo.com >& /dev/null || sleep 600 

Mais: comment pourrais-je réécrire cette seule ligne, pour qu'elle se boucle jusqu'à ce qu'il y ait une connection internet?

 while ! ping -W 1 -c 4 www.google.com >& /dev/null || ! ping -W 1 -c 4 www.yahoo.com >& /dev/null; do sleep 600 done 

Bien que je venais de tester la connectivité à une adresse IP; 8.8.8.8 est le server DNS public de Google (il dispose d'une très haute disponibilité). Tester si le travail DNS est peu fiable de toute façon parce que l'input peut être dans le cache.

 while ! ping -W 1 -c 1 8.8.8.8 >&/dev/null; do sleep 600; done 

Le ping n'est pas toujours la meilleure façon de vérifier la connectivité Internet. De nombreux endroits (en particulier les réseaux d'entreprise) bloquent tous les access sauf le Web. Vous pouvez tester si le site Web fonctionne en téléchargeant un file à partir d'un server haute disponibilité. Cela teste également DNS, du less du sharepoint vue du proxy HTTP (ce qui est souvent ce qui count).

 while ! wget -q -O /dev/null --no-cache http://www.google.com/; do sleep 6000; done 

Quelques défauts avec certaines des approches ci-dessus, et pourquoi un «travail sur Internet» complet ne peut pas vraiment être fait en une seule ligne:

  • Vous devriez toujours vérifier si votre lien est actif avant même d'essayer de cingler quoi que ce soit. S'il n'y a pas de câble branché sur votre port Ethernet ou si votre stupide chat a mâché le fil, rien ne fonctionne.

  • Devrait tester localhost en premier. Cela permettra de vérifier l'intégrité de votre stack TCP / IP.

  • S'appuyer sur la résolution DNS en spécifiant des noms de doman peut échouer si votre server DNS est inaccessible ou bloqué. Tout simplement parce que votre server DNS préféré est en panne ne signifie pas que vous ne pouvez pas vous connecter à d'autres hôtes via Internet

  • Pas bon d'utiliser toujours la même adresse ou l'hôte pour vérifier la connectivité, sur un server dont vous n'êtes pas propriétaire. Vous devriez tester un set varié / randomisé d'hôtes connus à être toujours présents, de preference des hôtes que vous possédez en dehors de votre réseau.

  • J'irais même jusqu'à dire que vous devriez utiliser une variété de protocoles pour vraiment voir si l'Internet est en place ou pas. Peut-être une machine de zombies sur votre réseau a envoyé un flot de pings dans le cadre d'un DDoS et votre FAI a bloqué ICMP.

Si vous devez vraiment avoir une approche en ligne, ce que je ferais est un traceroute vers google.com ou tout autre site Internet bien connu de votre choix. Juste une fois. Découvrez combien de houblons votre trafic prend pour sortir du réseau de votre fournisseur de services. Par la suite, vous pouvez utiliser un traceroute pour tester votre connectivité externe, mais le limiter à autant de sauts. Si le ping final dans le traceroute est réussi, vous pouvez sortir du réseau. J'aimerais qu'il y ait un utilitaire "traceroute-like" pour d'autres protocoles, tels que HTTP et autres.

Vous pouvez simplement utiliser une boucle while depuis le shell.

 while true; do if ping -W 1 -c 4 www.google.com >& /dev/null && ping -W 1 -c 4 www.yahoo.com >& /dev/null; then break fi sleep 600 done 

Les commands /bin/true et test 0 returnneront toujours 0 (true), mais true ne sera pas toujours embedded.

Pour rendre la logique un peu plus claire, vous pouvez écrire le chèque dans un sous-shell, par exemple

 while ! ( ping -W 1 -c 4 www.google.com >& /dev/null && ping -W 1 -c 4 www.yahoo.com >& /dev/null ); do sleep 600 done 

Ou écrire le test dans une fonction.

 can_ping_internet() { ping -W 1 -c 4 www.google.com && ping -W 1 -c 4 www.yahoo.com } while ! can_ping_internet; do sleep 600 done