Überprüfen Sie den Status eines Ports auf dem Remote-Host [geschlossen]

158

Ich benötige eine Befehlszeile, die den Portstatus auf einem Remote-Host überprüfen kann. Ich habe es versucht, ping xxx.xxx.xxx.xxx:161aber es erkennt den "Host" nicht. Ich dachte, es wäre eine "gute" Antwort, bis ich den gleichen Befehl gegen einen Host ausführte, von dem ich weiß, dass dieser Port offen ist. Dies gilt für eine Batchdatei unter Windows, die den Status des Remote-Ports überprüft und dann einen Befehl ausführt, der diesen Remote-Port zur Information verwendet, dann den Befehl zum Überprüfen des Remote-Ports erneut und dann den Befehl, der diesen Port auf dem nächsten Server zur Information verwendet , und so weiter. Ich habe überall gesucht und gedacht, dass der Ping es tun könnte, aber es muss verschiedene Versionen von Ping geben, ich nehme an, da der Server, auf dem ich dies mache, diese Option nicht anzeigt.

Nur zum Lachen habe ich einen webbasierten Remote-Port-Checker von einer Website aus ausprobiert - und die Ergebnisse waren sowohl für den "Problem" -Server als auch für den richtigen Server korrekt. Ich kann dies jedoch nicht in einem Batch-Lauf mit mehr als 500 Server-IPs verwenden.

Kann ich etwas tun, das einfach ist? Meine Perl-Kenntnisse sind extrem verrostet (benutze es oder verliere es), kenne keine anderen Windows-basierten Sprachen außer Batch. Unix ist meine Fähigkeit, aber dies muss von Widows Server 2003 ausgeführt werden.

Ross Ridge
quelle
5
Vielleicht möchten Sie dies auf serverfault.com
John Rasch
1
Jemand hat dies bereits getan: serverfault.com/questions/309357/ping-a-specific-port
Vadzim
1
Da diese Frage geschlossen ist, habe ich hier
npocmaka
PowerShell: Wie kann
Kenorb
Fenster ps> tnc xxx.xxx.xxx.xxx -port 161
Moslem Shahsavan

Antworten:

151

Sie scheinen nach einem Port-Scanner wie nmap oder netcat zu suchen , die beide für Windows, Linux und Mac OS X verfügbar sind.

Überprüfen Sie beispielsweise eine bekannte IP-Adresse auf Telnet:

nmap -A 192.168.0.5/32 -p 23

Suchen Sie beispielsweise auf host.example.com nach offenen Ports von 20 bis 30:

nc -z host.example.com 20-30
Glenn
quelle
Beide sind für Windows verfügbar.
Glenn
1
Ihr nmap-Befehl sollte "-p23" ohne Leerzeichen sein. nmap behandelt jede Einheit, der nicht unmittelbar ein Flag vorangestellt ist, als separates Scan-Ziel
Brandon Lebedev
14
sollte sein nc -zv host.example.com 20-30. Andernfalls erfolgt keine Ausgabe
Aryeh Beitz
1
Die Option -zfür ncist unter Linux nicht verfügbar.
Valentin_Nasta
1
@valentin_nasta ja, das hängt vielleicht davon ab, welche Version von Netcat Sie verwenden (gnu oder openbsd). Hier ist die relevante Zeile aus der Manpage für nc (openbsd-Version) auf meinem Arch Linux-System: -z Gibt an, dass nc nur nach abhörenden Dämonen suchen soll, ohne Daten an sie zu senden. Es ist ein Fehler, diese Option in Verbindung mit der Option -l
pgoetz
126

In der Eingabeaufforderung können Sie den Befehl telnet verwenden. Zum Beispiel, um über Port 80 eine Verbindung zu IP 192.168.10.1 herzustellen.

telnet 192.168.10.1 80

Um Telnet in Windows 7 und höher zu aktivieren, klicken Sie auf . Aktivieren Sie im verlinkten Artikel Telnet über die Systemsteuerung -> Programme und Funktionen -> Windows-Funktionen -> Telnet-Client oder führen Sie dies einfach in einer Administrator-Eingabeaufforderung aus:

dism /online /Enable-Feature /FeatureName:TelnetClient
Naveen Yedugani
quelle
3
Dies ist die einfachste Methode, wenn Telnet auf dem Windows-Gerät installiert ist
Shonky Linux-Benutzer
30
... und es dauert 2 Sekunden, um es zu Windows hinzuzufügen (in meinem Fall 8.1)> Systemsteuerung> Programme hinzufügen> Windows-Funktionen
aktivieren
14
Nur zur Information: Wenn der Port nicht geöffnet ist: Verbindung zu ##### herstellen ... Verbindung zum Host konnte nicht hergestellt werden, auf Port ####: Verbindung fehlgeschlagen; Und wenn der Port geöffnet ist, landen Sie in Telnet (STRG +] und dann "Beenden")
blackstrype
27

Für Skriptzwecke habe ich festgestellt, dass der curlBefehl dies kann, zum Beispiel:

$ curl -s localhost:80 >/dev/null && echo Connected. || echo Fail.
Connected.
$ curl -s localhost:123 >/dev/null && echo Connected. || echo Fail.
Fail.

Möglicherweise funktioniert es nicht für alle Dienste, da curlin einigen Fällen (gemäß Kommentar) unterschiedliche Fehlercodes zurückgegeben werden können. Das Hinzufügen der folgenden Bedingung kann daher zuverlässig funktionieren:

[ "$(curl -sm5 localhost:8080 >/dev/null; echo $?)" != 7 ] && echo OK || echo FAIL

Hinweis: Hinzugefügt -m5, um ein maximales Verbindungszeitlimit von 5 Sekunden festzulegen.

Wenn Sie auch überprüfen möchten, ob der Host gültig ist, müssen Sie auch nach dem 6Exit-Code suchen:

$ curl -m5 foo:123; [ $? != 6 -a $? != 7 ] && echo OK || echo FAIL
curl: (6) Could not resolve host: foo
FAIL

Führen Sie einfach Folgendes aus, um den zurückgegebenen Fehlercode zu beheben: curl host:portz.

$ curl localhost:80
curl: (7) Failed to connect to localhost port 80: Connection refused

Siehe: man curlfür eine vollständige Liste der Exit-Codes.

Kenorb
quelle
Leider funktioniert das bei mir nicht (zumindest bei Bash in OS X).
Mike Atlas
1
Ein kundenspezifischer Service. FWIW es funktioniert irgendwie: curl $IP:$PORTergibt: curl: (52) Empty reply from server(versus curl: (7) Failed to connect) aber ähnlich nckann ich | grep Emptyfür diese Ausgabeanweisungen nicht, wie man es erwarten könnte (etwas über Zeilenumbrüche oder fehlende sofortige Ausgabe?). Ich nehme an, Ihre Leitung ist eine Bedingung, die auf dem Exit-Code basiert, oder? Ich bin auf El Cap; Vielleicht wird in anderen Versionen oder Betriebssystemen der Fehlerstatus -1eher beendet als 52?
Mike Atlas
Ja das würde es tun. curl -s $IP:$PORT >/dev/null; if [ $? -eq 52 ]; then echo "Connected."; else echo "Fail."; fi
Mike Atlas
Die Frage betraf Windows, das offensichtlich nicht zB / dev / null hat
Arthur Tacca
@ArthurTacca Sie können immer Windows Subsystem für Linux (WSL) verwenden.
Kenorb
23

Drücken Sie Windows+ RArt cmdundEnter

Geben Sie in der Eingabeaufforderung ein

telnet "machine name/ip" "port number"

Wenn der Port nicht geöffnet ist, wird folgende Meldung angezeigt:

"Connecting To "machine name"...Could not open connection to the host, on port "port number":

Andernfalls werden Sie zum geöffneten Port weitergeleitet (leerer Bildschirm wird angezeigt)

Löwe
quelle
7
Beachten Sie, dass Telnet auf modernen Windows-Systemen nicht standardmäßig installiert ist. Sie müssen es über die Systemsteuerung Windows-Funktionen hinzufügen / entfernen installieren.
Greg
1
@ Greg oder mit einem Online-Tool wie telnet-online.net
oz
2
@oz wahr, es sei denn, Sie überprüfen den Status eines internen Servers
Greg
funktioniert unter Windows10
Gaurav
19

Verwenden Sie den Befehl nc.

nc -zv <hostname/ip> <port/port range>

For example,
nc -zv localhost 27017-27019
or
nc -zv localhost 27017

Sie können auch den Telnet-Befehl verwenden

telnet <ip/host> port
minhas23
quelle
4

nc oder 'netcat' hat auch einen Scan-Modus, der von Nutzen sein kann.

Caskey
quelle
3
Auf Mac "nc-zv Server Port-Range"
Vijay Kumar
2

Ich denke, Sie suchen nach Hping ( http://www.hping.org/ ), das eine Windows-Version hat.

"Die Schnittstelle ist vom Unix-Befehl ping (8) inspiriert, aber hping kann nicht nur ICMP-Echoanforderungen senden. Es unterstützt TCP, UDP, ICMP ..."

Dies ist auch sehr nützlich, wenn Sie sehen möchten, wo entlang einer Route ein TCP-Port blockiert wird (z. B. durch eine Firewall), wo sich ICMP möglicherweise nicht befindet.

Wahres Blut
quelle
2

In Bash können Sie Pseudo-Gerätedateien verwenden, die eine TCP-Verbindung zum zugehörigen Socket herstellen können. Die Syntax lautet /dev/$tcp_udp/$host_ip/$port.

Hier ist ein einfaches Beispiel, um zu testen, ob Memcached ausgeführt wird:

</dev/tcp/localhost/11211 && echo Port open || echo Port closed

Hier ist ein weiterer Test, um festzustellen, ob auf eine bestimmte Website zugegriffen werden kann:

$ echo "HEAD / HTTP/1.0" > /dev/tcp/example.com/80 && echo Connection successful.
Connection successful.

Weitere Informationen finden Sie unter: Advanced Bash-Scripting Guide: Kapitel 29. /devund/proc .

Verwandte Themen : Testen Sie, ob ein Port auf einem Remote-System (ohne Telnet) bei SuperUser erreichbar ist.

Weitere Beispiele finden Sie unter: Öffnen eines TCP / UDP-Sockets in einer Bash-Shell (Artikel).

Kenorb
quelle
1
Wow, das ist Genie! Ich weiß nicht, dass dies nur mit Bash möglich ist. So praktisch für Leute wie mich, die nur Git Bash unter Windows installiert haben und keinen anderen Dienst installieren möchten.
Dotslashlu