Frage Test, ob ein Port auf einem Remote-System erreichbar ist (ohne Telnet)


Früher haben wir gebraucht telnet um festzustellen, ob ein Port auf einem Remote-Host geöffnet war: telnet hostname port würde versuchen, eine Verbindung zu einem beliebigen Port auf einem Host herzustellen und Ihnen Zugriff auf den Raw-TCP-Stream zu geben.

Heutzutage ist auf den Systemen, auf denen ich arbeite, kein Telnet installiert (aus Sicherheitsgründen), und alle ausgehenden Verbindungen zu allen Hosts sind standardmäßig blockiert. Im Laufe der Zeit verliert man leicht den Überblick, welche Ports für welche Hosts offen sind.

Gibt es eine andere Möglichkeit zu testen, ob ein Port auf einem Remote-System geöffnet ist - unter Verwendung eines Linux-Systems mit einer begrenzten Anzahl von installierten Paketen und telnet ist nicht verfügbar?


251
2017-07-19 16:54


Ursprung


Verbunden: Überprüfen Sie den Status eines Ports auf dem Remote-Host bei SO - kenorb


Antworten:


Bash konnte zugreifen TCP und UDP Häfen für eine Weile. Von der man-Seite:

/dev/tcp/host/port
    If host is a valid hostname or Internet address, and port is an integer port number
    or service name, bash attempts to open a TCP connection to the corresponding socket.
/dev/udp/host/port
    If host is a valid hostname or Internet address, and port is an integer port number
    or service name, bash attempts to open a UDP connection to the corresponding socket.

Also könntest du so etwas verwenden:

xenon-lornix:~> cat < /dev/tcp/127.0.0.1/22
SSH-2.0-OpenSSH_6.2p2 Debian-6
^C pressed here

Taa Daa!


215
2017-07-22 10:37



Dies scheint auch zu funktionieren MinGW. Zum Beispiel eine Fernbedienung VNC Der Server unter 192.168.2.100 antwortet mit "RFB 003.008" mit "cat </dev/tcp/192.168.2.100/5900". - Peter Mortensen
Bei nicht geöffneten Ports wurde die Zeit jedoch nach 22 Sekunden überschritten (anprobiert) Ubuntu 14.04 (Trusty Tahr) für einen Remote-Server). Interessanterweise ist die Timeout - Periode viel kürzer als die für nc (siehe Thnees Antwort). - Peter Mortensen
@lornix, ok, aber in diesem Fall muss ich dasselbe Ergebnis mit nc ohne die Option -z erhalten, aber es funktioniert immer noch nicht: # nc -v -w5 127.0.0.1 18080 Verbindung zu 127.0.0.1 18080 port [tcp / *] gelungen! # cat </dev/tcp/127.0.0.1/18080 Hängt einfach ohne Ergebnis. Ich möchte nur verstehen, wann ich die Option "/ dev / tcp / host / port" verwenden kann - Alexandr
@Alexandr ... eigentlich "hängt ohne Ergebnis" ist ziemlich viel zu erwarten. Katze wartet auf Eingabe. nc verfügt über zusätzliche Smart-Funktionen, mit denen No-Data-Daten erkannt werden können und keine Versuche mehr unternommen werden. Katze ist nicht ganz so schlau. Versuchen cat < /dev/tcp/localhost/22, sollten Sie Ihren sshd-Header bekommen. Offensichtlich wartet Ihr Prozess auf Port 18080 auf etwas, bevor etwas gesendet wird. Hafen 22 (ssh) grüßt dich mit seiner Version und was nicht. Versuch es! - lornix
@lornix, vielen Dank für die Erklärung! Jetzt ist die Einschränkung klar. Ich denke, mit nc sollte eine bevorzugte Möglichkeit sein, Ports zu überprüfen. - Alexandr


Schön und ausführlich! Von den Manpages.
Einzelner Port:

nc -zv 127.0.0.1 80

Mehrere Ports:

nc -zv 127.0.0.1 22 80 8080

Reichweite der Ports:

nc -zv 127.0.0.1 20-30

295
2017-12-03 21:34



Scheint die beste Antwort zu sein, danke. ;-) - lpapp
Dies wurde beim Anprobieren gehängt Ubuntu 14.04 (Trusty Tahr) für einen Remote-Server (gleiches LAN) für geschlossene Ports (Timeout nach 127 Sekunden) - daher in Skripten nicht sehr geeignet. Es funktionierte jedoch für einen Dienst, der einen offenen Port hatte. Die Option "-w2" könnte die Lösung sein. - Peter Mortensen
Verwenden Sie die Option -u für UDP-Ports. - Efren
In Version 6.4 wird ncat -z nicht erkannt. Ich konnte auf z verzichten - smishra
Sie können mehrere Bereiche prüfen mit: nc -zv 127.0.0.1 22,80,8080,20-30,443-446 (nc Version: 1.107-4). - bobbel


Netcat ist ein nützliches Werkzeug:

nc 127.0.0.1 123 &> /dev/null; echo $?

Wird ausgegeben 0 wenn Port 123 offen ist und 1 wenn es geschlossen ist.


96
2017-07-19 18:07



Dies ist eine viel elegantere und skriptfähigere Antwort als meine eigene. Es ist bedauerlich für mich, dass die sicherheitsbewussten Systemadministratoren sich zurückgehalten haben telnet auch zurückgehalten nc (obwohl - seltsam - nicht curl oder wget). - Steve HHH
Ja das ist völlig willkürlich und albern. - thnee
Lassen Sie die FOR Aussagen beginnen! - Chad Harrison
Dies wurde beim Anprobieren gehängt Ubuntu 14.04 (Trusty Tahr) für einen Remote-Server (gleiches LAN) für geschlossene Ports (Timeout nach ca. 127 Sekunden) - daher in Skripten nicht sehr geeignet. Es funktionierte jedoch für einen Dienst, der einen offenen Port hatte und 0 zurückgab. Die Verwendung der Option "-w2" könnte die Lösung sein. - Peter Mortensen
Ich denke -G 2 wäre besser für TCP-Timeout - A B


Die einfachste Methode, ohne ein anderes Werkzeug, wie z socat, ist wie in @ lornix's Antwort oben beschrieben. Dies ist nur ein konkretes Beispiel dafür, wie man das Pseudogerät nutzen könnte /dev/tcp/... in Bash, wenn Sie beispielsweise testen wollten, ob ein anderer Server über die Befehlszeile auf einen bestimmten Port zugreifen konnte.

Beispiele

Angenommen, ich habe einen Host in meinem Netzwerk namens skinner.

$ (echo > /dev/tcp/skinner/22) >/dev/null 2>&1 \
    && echo "It's up" || echo "It's down"
It's up

$ (echo > /dev/tcp/skinner/222) >/dev/null 2>&1 && \
    echo "It's up" || echo "It's down"
It's down

Der Grund, warum Sie die echo > /dev/... in Klammern wie folgt, (echo > /dev/...) Wenn Sie dies nicht tun, werden Sie bei Tests fehlgeschlagener Verbindungen diese Arten von Nachrichten angezeigt bekommen.

$ (echo > /dev/tcp/skinner/223) && echo hi
bash: connect: Connection refused
bash: /dev/tcp/skinner/223: Connection refused

Diese können nicht einfach umgeleitet werden /dev/null seit sie von dem Versuch kommen, Daten auf das Gerät zu schreiben /dev/tcp. Wir erfassen also alle diese Ausgaben innerhalb eines Unterbefehls, d. H. (...cmds...) und Umleitung der Ausgabe des Unterbefehls.


48
2017-09-02 17:59



Das ist ausgezeichnet. Ich wünschte, es würde an die Spitze gewählt werden. Ich lese nur so weit unten auf der Seite, weil ich versehentlich gescrollt habe, bevor ich es geschlossen habe. - Still.Tony
@ Okuma.Tony - ja, das ist immer ein Problem mit Q, die viele Antworten haben 8-). Danke für das Feedback, es ist sehr zu schätzen. - slm


ich habe das gefunden curl kann die Arbeit in ähnlicher Weise erledigen telnet, und curl wird Ihnen sogar sagen, welches Protokoll der Hörer erwartet.

Erstellen Sie einen HTTP-URI aus dem Hostnamen und dem Port als erstes Argument curl. Ob curl kann eine Verbindung herstellen, wird ein Protokollkonflikt melden und beenden (wenn der Listener kein Webdienst ist). Ob curl kann nicht verbinden, es wird Timeout.

Zum Beispiel ist Port 5672 auf dem Host 10.0.0.99 entweder geschlossen oder durch eine Firewall blockiert:

$ curl http://10.0.0.99:5672
curl: (7) couldn't connect to host

Von einem anderen System kann jedoch Port 5672 auf dem Host 10.0.0.99 erreicht werden und es scheint, dass ein AMQP-Listener ausgeführt wird.

$ curl http://10.0.0.99:5672
curl: (56) Failure when receiving data from the peer
AMQP

Es ist wichtig, zwischen den verschiedenen Nachrichten zu unterscheiden: Der erste Fehler war, weil curl konnte keine Verbindung zum Port herstellen. Der zweite Fehler ist jedoch ein Erfolgstest curl erwartet einen HTTP-Listener anstelle eines AMQP-Listeners.


35
2017-07-19 17:05



Wenn Curl nicht verfügbar ist, könnte wget sein. wget -qS -O- http://ip.add.re.ss:port sollte das gleiche tun. - Michael Kjörling
Dies funktioniert sogar mit einem Hostnamen, z. curl myhost:22. - 에이바
Dies kann falsch sein. Ich habe einen Tomcat-Dienst ausgeführt, aber 404 Fehler bekommen. # curl -k 192.168.194.4:6443 <html> <head> <title> Apache Tomcat / 7.0.34 - Fehlerbericht </ title> <style> <! - H1 --- HR {color: # 525D76;} -> </ style> </ head> <body> <h1> HTTP-Status 404 - / </ h1> <HR size = "1" noshade = "noshade"> <p> <b> Geben Sie </ b> Statusbericht </ p> <p> ein <b> Nachricht </ b> <u> / </ u> </ p> <p> <b> Beschreibung </ b> <u> Die angeforderte Ressource ist nicht verfügbar. </ u> </ p> < HR-Größe = "1" noshade = "noshade"> <h3> Apache Tomcat / 7.0.34 </ h3> </ body> </ html> - Mohammad Shahid Siddiqui
Sieh mein Post mit ähnlichem Ansatz. - kenorb


[admin@automation-server 1.2.2]# nc -v -z -w2 192.168.193.173 6443
nc: connect to 192.168.193.173 port 6443 (tcp) failed: Connection refused

[admin@automation-server 1.2.2]# nc -v -z -w2 192.168.194.4 6443
Connection to 192.168.194.4 6443 port [tcp/sun-sr-https] succeeded!

Hoffe es löst dein Problem :)


8
2018-06-02 06:27



Ja, das ist besser - Zeitlimit für geschlossene Ports. - Peter Mortensen
Verwendet dies immer TCP oder gibt es eine Möglichkeit, UDP zu überprüfen? - kmoe


Hier ist One-Liner:

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

mit Bash Syntax erklärt in @lornix Antwort.

Für weitere Informationen, überprüfen Sie: Advanced Bash-Scripting Guide: Kapitel 29. /dev und /proc.


7
2018-03-16 11:21





Ich habe einen ganzen Tag gekämpft, weil keine dieser Antworten für mich zu funktionieren schien. Das Problem ist, dass die neueste Version von nc hat nicht mehr die -z Flag, während der direkte Zugriff über TCP (wie nach @lornix und @slm) fehlschlägt, wenn der Host nicht erreichbar ist. Ich habe schließlich gefunden diese Seite, wo ich endlich nicht eins gefunden habe zwei Arbeitsbeispiele:

  1. nc -w1 127.0.0.1 22 </dev/null

    (das -w Flag kümmert sich um die Zeitüberschreitung, und die </dev/null ersetzt die -z Flagge)

  2. timeout 1 bash -c '(echo > /dev/tcp/127.0.0.1/22) >/dev/null 2>&1'

    (das timeout Befehl kümmert sich um das Timeout, und der Rest ist von @slm)

Dann benutze einfach && und / oder || (oder auch $?) um das Ergebnis zu extrahieren. Hoffentlich wird jemand diese Information nützlich finden.


5
2018-05-31 08:45





Es sollte nicht auf Ihrer Box verfügbar sein, aber versuchen Sie es mit nmap.


2
2017-07-19 17:01



nmap ist ein gutes Werkzeug, aber auf diesen Systemen nicht verfügbar. Anstatt herunterzuladen nmap, kompiliere es, installiere es in mein Home-Verzeichnis und kopiere es dann auf alle anderen Systeme. Ich hatte gehofft, einen Weg zu finden, die vorhandenen Tools zu verwenden, die in den meisten Linux-Installationen verfügbar sind. - Steve HHH


Kombiniert man die Antworten von @kenorb und @Azukikuru, könnte man Port open / closed / firewalled testen.

timeout 1 bash -c '</dev/tcp/127.0.0.1/22 && echo Port is open || echo Port is closed' || echo Connection timeout

Ein weiterer Ansatz mit Curl zum Erreichen eines beliebigen Ports

curl telnet://127.0.0.1:22

0
2017-08-10 12:20