ubuntuusers.de

Bash-SSH Verbindung überprüfen-Skript

Status: Gelöst | Ubuntu-Version: Kubuntu 7.10 (Gutsy Gibbon)
Antworten |

edwin7

Anmeldungsdatum:
30. Mai 2007

Beiträge: 102

Hallo,

Ich möchte mit Hilfe von Bash eine SSH-Verbindung an einen Rechner überprüfen, z.B.:

\––-nur Überprüfung\––\––\––\––-
#!bin/bash

if(ssh möglich); then
echo"wow. Es funktioniert!. Die SSH-Verbindung ist möglich"

else
echo "Die SSH-Verbindung ist nicht möglich"

\––\––\––\––\––\––\––\––\––\––
und nach der Überprüfung kann jetzt eine SSH-Verbindung aufgebaut werden.

Weiß vielleicht jemand, wie es geht?

Danke,

Edwin

Blattlaus

Avatar von Blattlaus

Anmeldungsdatum:
29. März 2006

Beiträge: 1399

Ich verstehe nicht wo der Sinn liegen soll. Versuch doch einfach eine SSH Verbindung aufzubauen. Wenn geht, gehts und wenns nicht geht, gehts offenbar nicht...wozu willst du da vorher überprüfen obs geht?

edwin7

(Themenstarter)

Anmeldungsdatum:
30. Mai 2007

Beiträge: 102

Damit kann ich Zeit sparen.

Ich habe fast mehr als 10000-SSH-Verbindungen. Aber wenn ich am Anfang schon die Verbindungen überprüfe, brauche ich dann nur etwa 100 Verbindungen aufzubauen.

stitch

Anmeldungsdatum:
24. August 2005

Beiträge: 291

edwin7 hat geschrieben:

Damit kann ich Zeit sparen.

Ich habe fast mehr als 10000-SSH-Verbindungen. Aber wenn ich am Anfang schon die Verbindungen überprüfe, brauche ich dann nur etwa 100 Verbindungen aufzubauen.

Nur so aus Interesse... was machst du? Ein Botnetz administrieren?

edwin7

(Themenstarter)

Anmeldungsdatum:
30. Mai 2007

Beiträge: 102

Ich schreibe momentan über ein Protokoll, das unter PlanetLab läüft.

http://www.planet-lab.org/

edwin7

(Themenstarter)

Anmeldungsdatum:
30. Mai 2007

Beiträge: 102

Keiner weiß?

Der_Gestreifte

Avatar von Der_Gestreifte

Anmeldungsdatum:
21. Juni 2007

Beiträge: 1261

Wohnort: Nürnberg

Was verstehst Du unter "ssh-Verbindung möglich"?

Reicht es, wenn auf Port 22 jemand (oder ssh auf einem anderen Port) auf Verbindungen wartet?
Oder soll ein ssh-Login tatsächlich möglich sein?

edwin7

(Themenstarter)

Anmeldungsdatum:
30. Mai 2007

Beiträge: 102

ich glaube, es reicht , den Port 22 zu überprüfen.

Aber mit ping geht es nicht.

Greebo

Avatar von Greebo

Anmeldungsdatum:
21. November 2006

Beiträge: 3443

Wohnort: 97070 Würzburg

Du kannst mit nmap einzelne ports prüfen

nmap $ip -p 22

edwin7

(Themenstarter)

Anmeldungsdatum:
30. Mai 2007

Beiträge: 102

Danke,

Aber wie kann ich die Antwort als true oder false? Damit ich eine If-Zweig benutzen kann.

Greebo

Avatar von Greebo

Anmeldungsdatum:
21. November 2006

Beiträge: 3443

Wohnort: 97070 Würzburg

Z.B. so (gibt bestimmt sauberere Lösungen, bin kein Scripting Mensch)

#!/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
#!/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 $?

edwin7

(Themenstarter)

Anmeldungsdatum:
30. Mai 2007

Beiträge: 102

Danke, Eine gute Lösung. Aber was bedeutet grep open >/dev/null und $? -eq 0 ?

Greebo

Avatar von Greebo

Anmeldungsdatum:
21. November 2006

Beiträge: 3443

Wohnort: 97070 Würzburg

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.

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

@edwin
Dir sollten ein paar Dinge klar sein: Ein Post-Scan erzeugt eine wesentliche Netzwerklast (vor allem wenn er parallel ausgeführt wird), die aber keinerlei Daten transportiert. Deswegen hat ein Portscan in normalem Verkehr nichts zu suchen. Zudem bedeutet ein offener Port 22 keineswegs, dass dort auch tatsächlich ein SSH-Login möglich ist, zum einen, weil du ja tatsächlich nur den Port überprüfst, zum anderen, weil nicht garantiert ist, dass der Port beim eigentlichen Verbindungsaufbau noch offen ist. Du erzeugst also zangsläufig eine Race Condition, weswegen du beim eigentlichen Verbindungsaufbau immer noch darauf vorbereitet sein musst, dass der Verbindungsaufbau fehlschlägt. Das wiederrum bedeutet allerdings, dass du dir den vorherigen Scan schenken kannst...

Ich persönlich kann hinter diesem Vorhaben keinerlei Sinn erkennen.

Ghaldez

Avatar von Ghaldez

Anmeldungsdatum:
14. April 2007

Beiträge: 796

Ich glaub da das erkennen ob der Port 22 für ssh offen ist ja nur den versuch folgen lässt mit ssh zu verbinden
dann sollte man sich ein skript basteln das einfach sich auf diese zig tausend rechner einloggt per ssh.
dann kann man ja alles mit log's machen damit man sieht wo es nicht klappt.

Antworten |