Hinweis für den Leser : Die ursprüngliche Antwort wurde vor einiger Zeit und zu der Zeit, als ich nur Shell-Scripting lernte, veröffentlicht. In der überarbeiteten Version unten finden Sie ein neues und verbessertes Skript, das viel schneller ausgeführt wird.
Ursprüngliche Antwort
nmap
wäre meine erste Wahl, aber was ist, wenn Sie es nicht haben? Der DIY-Weg wäre mit einem Ping-Skript, das jede mögliche IP-Adresse im Netzwerk manuell durchläuft. Was wir hier haben, ist nur eine while-Schleife, in der wir die letzte Nummer in der Adresse setzen, einen stillen einzelnen Ping an die Adresse senden, prüfen, ob der Befehl erfolgreich war oder nicht (und wenn er erfolgreich war, dann ist der Host offensichtlich aktiv) und eine printf
Anweisung. Schnell und schmutzig, brauchte ungefähr 10 Minuten, um es zu schreiben, aber die Laufzeit ist möglicherweise etwas langsam.
#!/bin/sh
# set -x
NUM=1
while [ $NUM -lt 256 ];do
ping -q -c 1 192.168.0.$NUM > /dev/null
RESULT=$(echo $?)
if [ $RESULT -eq 0 ]; then
printf 192.168.0.$NUM"\n"
fi
NUM=$(expr $NUM + 1)
done
Überarbeitete Antwort
Ich habe diese Antwort ursprünglich im August 2015 gepostet. Seitdem habe ich etwas mehr über Shell-Skripte gelernt. Als ich dieses Skript sah, hielt ich es für eine gute Idee, diese Antwort zu überarbeiten, um ein paar Verbesserungen hinzuzufügen. Hier sind ein paar Ideen:
Das Skript ist offensichtlich langsam und ping
wartet auf die Antwort des Hosts. In der Standardeinstellung ping
für zwei RTT, die auf variieren je nachdem , wie überlastet ist Ihr Netzwerk, und so weit ich das TCP - Protokoll verstehen verdoppelt sich die Wartezeit jedes Mal (zumindest nach dieser ). Also könnten wir ping
mit -w 1
flag eine Auszeit erzwingen . Da wir 256 Adressen haben und für jede Adresse 1 Sekunde annehmen, dauert das Skript ungefähr 256/60 = 4,27 Minuten.
Einen Befehl auszuführen und dann seinen Exit-Status mit zu erfassen, $?
war nicht wirklich notwendig. Sie if ... then;...fi
können Befehle direkt bearbeiten. Mit anderen Worten, es reicht aus, dies zu tun:
if ping -w 1 -q -c 1 192.168.0.$NUM > /dev/null ;
then
<some other code here>
fi
Der printf
Befehl kann folgendermaßen umgeschrieben werden:
printf "IP %s is up\n" 192.168.0."$NUM"
Dies ist eher eine stilistische Änderung, stimmt jedoch mit der Funktionsweise printf
und dem Erscheinungsbild vieler anderer Sprachen überein , wobei "$NUM"
Variablen zitiert werden. Das Zitieren hier ist nicht erforderlich - da es sich nur um Zahlen handelt, müssen wir nicht mit dem Aufteilen von Wörtern rechnen, da Leerzeichen in einer Variablen vorhanden sind.
Eine viel bessere Leistungsverbesserung kann erreicht werden, wenn wir mehrere Hintergrundprozesse erzeugen. Die folgende Skriptbearbeitung erledigt genau das. Ich setze das ping
und printf
in eine Funktion pingf
(ja, kitschiger Name, ich weiß). Jetzt gibt es auch eine einzige main
Funktion, die das Schleifen und Aufrufen von erledigt pingf
.
#!/bin/sh
# Uncomment for debugging
#set -x
pingf(){
if ping -w 2 -q -c 1 192.168.0."$1" > /dev/null ;
then
printf "IP %s is up\n" 192.168.0."$1"
fi
}
main(){
NUM=1
while [ $NUM -lt 255 ];do
pingf "$NUM" &
NUM=$(expr "$NUM" + 1)
done
wait
}
main
Wie viel besser funktioniert das? Eigentlich nicht schlecht, dauert nur ein paar Sekunden.
$ time ./ping_script.sh
IP 192.168.0.1 is up
IP 192.168.0.101 is up
IP 192.168.0.27 is up
IP 192.168.0.29 is up
0m02.50s real 0m00.01s user 0m00.12s system
Dinge zu beachten
- Windows (seit Windows 7, glaube ich) hat begonnen, die Antwort auf ICMP-Echoanforderungen zu blockieren. Es gibt einige Fragen dazu auf Ask Ubuntu und anderen Sites der Art "Hey, mein Linux-Computer kann gepingt werden, aber nicht Windows, was ist damit los?" Beachten Sie jedoch, dass Sie für neuere Windows-Versionen die Antwort auf ICMP-Echo aktivieren müssen.
angry ip scanner