Uärg, sehe gerade das beim rüberkopieren und rumbasteln der Quellcode ziemlich zerpflückt wurde \^^. Ich poste das nochmal sauber(er).
#!/bin/bash
# usage: checkPort IP-Number Port-Number
# returns: 0 if an open port was found 1 otherwise
function checkPort {
return `nmap ${1} -p ${2} | grep open > /dev/null`;
}
checkPort $1 $2
if [ $? -eq 0 ]; then
echo Port $2 on $1 seems to be open
else
echo Port $1 on $1 seems to be closed
fi
exit $?
Danke, Eine gute Lösung. Aber was bedeutet grep open >/dev/null
Also alles spielt sich eigentlich in der Zeile
return `nmap ${1} -p ${2} | grep open > /dev/null`;
ab. Die besteht aus verschiedenen Teilen
return $VAL
Liefert als Funktionsrückgabe den Wert von $VAL (nmap ${1} -p ${2} | grep open > /dev/null
) zurück.
`nmap ${1} -p ${2} | grep open > /dev/null`
Besteht aus einer Befehlskette deren Ausgabe zu einem anderen Ziel als die Standardausgabe umgeleitet wird (/dev/null).
/dev/null ist ein spezielles Gerät, dass nichts anderes macht, als alle Eingaben zu vergessen.
Es wird also effektiv die Ausgabe einfach weggeschmissen. Man könnte auch darauf verzichten, dann würde die Console halt mit sinnlosen Nachrichten geflooded.
ls > dir.txt würde zB. die Ausgabe von ls in eine Datei namens dir.txt umleiten.
Schauen wir uns mal die Befehlskette an:
nmap ${1} -p ${2} | grep open
führt nmap mit den ersten zwei parametern der Funktion aus, das Pipe-Symbol "|" sorgt dafür, dass dessen Ausgabe an den Befehl grep mit dem Parameter "open" als Eingabe weitergegeben wird.
grep open durchsucht die Eingabe nach einer Zeile die das Wort "open" enthält und gibt diese mit dem Rückgabewert 0 zurück. Ansonsten gibts grep nichts aus (keine Zeile gefunden) und liefert 1 zurück.
Also passiert zusammengefasst folgendes.
nmap ermittelt ob der Port geöffnet ist oder nicht und gibt eine menschenlesbare Meldung zurück. Mit grep wandel ich das in einen Rückgabewert um, und die Umleitung sorgt dafür, dass die Ausgabe von grep nicht auf der Console erscheint (bzw. wohin auch immer die Standardausgabe gerade zeigt).
und $? -eq 0 ?
$? enthält immer den letzten berechneten Rückgabewert. In diesem Fall also von checkPort $1 $2
-eq ist eine Schreibweise für den Gleichheitstest (-eq → equals, -neq not equals usw.)
Also heisst
if [ $? -eq 0 ]; then
falls der letzte Rückgabewert 0 war, mache...
So ich hoffe ich habe alle Klarheiten beseitigt 😉. Wie gesagt das geht aber bestimmt noch schöner.
P.S. wenn du 10000 IPs untersuchen willst, und ne durchschnittliche Ping von 100ms hättest (was zieemlich gut wäre), dann braucht das Script allein zum Warten auf die Antworten 1000 Sekunden (knapp 17 Minuten). Ich würde dir ernsthaft empfehlen dich nach einer parallelisierten Lösung umzusehen, die sagen wir 100 IPs parallel überprüft. Dazu wird nen reines Bashscript aber wahrscheinlich weniger geeignet sein.