Wie kann ich über eine Befehlszeile prüfen, ob das Netzwerk erreichbar ist?

Wie kann ich über eine Befehlszeile prüfen, ob das Netzwerk erreichbar ist?

Ich möchte mir selbst ein Knurren senden, nachdem der SuSE-Server den Startvorgang abgeschlossen hat. Ich habe diese Nachricht erhalten socket_sendto(): unable to write to socket [101]: Network is unreachable in.

Wie kann ich über die Befehlszeile prüfen, ob das Netzwerk erreichbar ist und warten, falls dies nicht der Fall ist?


Antwort1

pingzu einem externen Host kann aus einer Vielzahl von Gründen fehlschlagen, von denen nur wenige tatsächlich etwas Nützliches über den Zustand Ihres eigenen Netzwerks aussagen.

Öffnen Sie als ersten Schritt ein Terminalfenster und geben Sie ip route ls

Sie sollten eine Ausgabe in etwa wie folgt sehen:

shadur@equinox:~$ ip route ls
192.168.15.0/24 dev eth0  proto kernel  scope link  src 192.168.15.102 
default via 192.168.15.1 dev eth0 

Dies zeigt an, dass Ihr lokales Netzwerk eine Ethernet-Verbindung ( eth0) mit der Adresse ist 192.168.15.0und dass sein Standard-Gateway, über das es auf den Rest des Internets zugreift, unter zu finden ist 192.168.15.1.

Als nächstes können Sie es mit pingdieser Adresse versuchen:

shadur@equinox:~$ ping 192.168.15.1
PING 192.168.15.1 (192.168.15.1) 56(84) bytes of data.
64 bytes from 192.168.15.1: icmp_req=1 ttl=255 time=0.352 ms
64 bytes from 192.168.15.1: icmp_req=2 ttl=255 time=0.269 ms
^C
--- 192.168.15.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.269/0.310/0.352/0.045 ms

Wenn Sie etwas Ähnliches wie oben sehen, ist Ihr eigenes lokales Netzwerk zumindest in Ordnung. An diesem Punkt können Sie mit fortgeschritteneren Tools nachsehen, traceroutewo Ihre Verbindung zum Ziel möglicherweise fehlschlägt.

Nach einer kurzen Google-Überprüfung, was growleigentlich passieren soll, habe ich jedoch das Gefühl, dass etwas anderes schief läuft. Können Sie Ihre Frage erweitern und uns ein paar weitere Einzelheiten dazu geben, was Sie versuchen, wie Sie es versuchen und die vollständige Fehlerausgabe? Die Zeile, die Sie uns gerade geben, wird abrupt abgeschnitten ...

Antwort2

Eine sehr einfache und schnelle Möglichkeit ist die Verwendung des pingBefehls.

Sie können einfach eingeben

 $ ping yahoo.com

(oder cnn.com oder ein anderer Host) und sehen Sie, ob Sie eine Ausgabe zurückbekommen. Dies setzt voraus, dass Hostnamen aufgelöst werden können (d. h. DNS funktioniert). Wenn nicht, können Sie hoffentlich eine gültige IP-Adresse/Nummer eines Remote-Systems angeben und sehen, ob es erreichbar ist.

Hier ist diePing-Manpage.

Aktualisieren:

Als schnelles Beispiel können Sie dieRückgabewert(z. B. mit "echo $?"), um pingzu sehen, ob der Befehl erfolgreich war (Sie können die Ausgabe des Befehls auch an weiterleiten > /dev/nul). Beachten Sie, dass ich -c 1hier verwende, Sie können aber auch mehr verwenden.

$ ping -c 1 yahoo.com
PING yahoo.com (72.30.38.140) 56(84) bytes of data.
64 bytes from ir1.fp.vip.sp2.yahoo.com (72.30.38.140): icmp_seq=1 ttl=52 time=83.5 ms

--- yahoo.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 83.593/83.593/83.593/0.000 ms

echo $?
0


$ ping -c 1 unicorns.are.here
ping: unknown host unicorns.are.here

$ echo $?
2

Antwort3

Ich würde netcatden gewünschten Service gerne in Anspruch nehmen.

Zum Beispiel das Testen eines IP-Ports, erfolgreich

> nc -zv 192.168.1.1 80
Connection to 172.26.0.1 80 port [tcp/http] succeeded!

...und scheitert

> nc -zv 192.168.1.1 22
netcat: connect to 172.26.0.1 port 22 (tcp) failed: Connection refused

mit 10s Timeout

> nc -zv -w 10 10.0.0.1 80
netcat: connect to 10.0.0.1 port 80 (tcp) timed out: Operation now in progress

Antwort4

Ich verwende die folgende Funktion ... Sie ist standardmäßig auf quad9 eingestellt, aber Sie können eine andere Domäne angeben. Nach 15 Minuten wird die Funktion abgeschaltet.

wait_for_dns() {

   local fqhn="quad9.net"
   fqhn=${1:-$fqhn}

   printf "waiting"
   for i in {1..15}; do
      local a_record=$(dig +short +time=2 $fqhn)

      if [[ $a_record != '' ]]; then
         printf "\n"
         return 0
      fi

      printf '.'
      sleep 60
   done

   printf "\n"
   return 1
}

verwandte Informationen