Früher haben wir geprüft telnet
, ob ein Port auf einem Remote-Host geöffnet war: Es wurde telnet hostname port
versucht, eine Verbindung zu einem beliebigen Port auf einem beliebigen Host herzustellen, und Sie haben Zugriff auf den rohen TCP-Stream.
In diesen Tagen ist auf den Systemen, auf denen ich arbeite, aus Sicherheitsgründen kein Telnet installiert, und alle ausgehenden Verbindungen zu allen Hosts werden standardmäßig blockiert. Mit der Zeit ist es leicht, den Überblick zu verlieren, welche Ports für welche Hosts geöffnet sind.
Gibt es eine andere Möglichkeit zu testen, ob ein Port auf einem Remote-System offen ist - unter Verwendung eines Linux-Systems mit einer begrenzten Anzahl installierter Pakete, telnet
das nicht verfügbar ist?
linux
networking
port
Steve HHH
quelle
quelle
brew install telnet
. Daher erwarte ich, dass Linux-Benutzer dasselbe mityum
und tun könnenapt-get
.Antworten:
Bash kann seit einiger Zeit auf TCP- und UDP- Ports zugreifen . Von der Manpage:
Sie könnten also so etwas verwenden:
Taa Daa!
quelle
cat < /dev/tcp/localhost/22
, Sie sollten Ihren sshd-Header erhalten. Offensichtlich wartet Ihr Prozess auf Port 18080 darauf, dass etwas eingeht, bevor Sie etwas senden. Port 22 ( ssh ) begrüßt Sie mit seiner Version und so weiter. Versuch es!Schön und ausführlich! Aus den Manpages.
Einzelner Port:
Mehrere Ports:
Reihe von Häfen:
quelle
nc -zv 127.0.0.1 22,80,8080,20-30,443-446
(nc Version: 1.107-4).Netcat ist ein nützliches Werkzeug:
nc 127.0.0.1 123 &> /dev/null; echo $?
Wird ausgegeben,
0
wenn Port 123 offen und1
geschlossen ist.quelle
telnet
auch vorenthalten habennc
(obwohl - seltsamerweise - nichtcurl
oderwget
).FOR
Aussagen beginnen!-G 2
wäre besser geeignet für TCP-TimeoutDie einfachste Methode, ohne ein anderes Tool wie z. B. zu verwenden
socat
, ist die in der obigen Antwort von @ lornix beschriebene. Dies ist nur ein Beispiel dafür, wie man das psuedo-Gerät/dev/tcp/...
in Bash verwenden würde, wenn man beispielsweise testen möchte, ob ein anderer Server einen bestimmten Port hat, auf den über die Befehlszeile zugegriffen werden kann.Beispiele
Angenommen, ich habe einen Host in meinem Netzwerk namens
skinner
.Der Grund, warum Sie die
echo > /dev/...
Klammern wie(echo > /dev/...)
folgt einschließen möchten , ist, dass Sie, wenn Sie dies nicht tun, bei Tests von Verbindungen, die inaktiv sind, diese Arten von Nachrichten angezeigt bekommen.Diese können nicht einfach umgeleitet werden,
/dev/null
da sie aus dem Versuch stammen, Daten auf das Gerät zu schreiben/dev/tcp
. Wir erfassen also die gesamte Ausgabe innerhalb eines Unterbefehls(...cmds...)
und leiten die Ausgabe des Unterbefehls um.quelle
Ich habe festgestellt, dass
curl
der Job möglicherweise auf ähnliche Weise erledigt wirdtelnet
, undcurl
Ihnen sogar sagen wird, welches Protokoll der Hörer erwartet.Erstellen Sie einen HTTP-URI aus dem Hostnamen und dem Port als erstes Argument für
curl
. Wenncurl
eine Verbindung hergestellt werden kann, wird ein Protokollkonflikt gemeldet und beendet (wenn der Listener kein Webdienst ist). Wenncurl
keine Verbindung hergestellt werden kann, tritt eine Zeitüberschreitung auf.Beispielsweise ist Port 5672 auf Host 10.0.0.99 entweder geschlossen oder von einer Firewall blockiert:
Von einem anderen System aus kann jedoch Port 5672 auf Host 10.0.0.99 erreicht werden, auf dem anscheinend ein AMQP-Listener ausgeführt wird.
Es ist wichtig, zwischen den verschiedenen Nachrichten zu unterscheiden: Der erste Fehler war, dass
curl
keine Verbindung zum Port hergestellt werden konnte. Der zweite Fehler ist ein Erfolgstest, obwohlcurl
ein HTTP-Listener anstelle eines AMQP-Listeners erwartet wird.quelle
wget -qS -O- http://ip.add.re.ss:port
sollte effektiv das gleiche tun.curl myhost:22
.Hoffe es löst dein Problem :)
quelle
Hier ist ein Einzeiler:
unter Verwendung der Bash-Syntax erklärt in @lornix Antwort .
Weitere Informationen finden Sie im Advanced Bash-Scripting Guide: Kapitel 29.
/dev
und/proc
.quelle
Ich kämpfte einen ganzen Tag lang, weil keine dieser Antworten für mich zu funktionieren schien. Das Problem ist, dass die neueste Version von
nc
das-z
Flag nicht mehr hat , während der direkte Zugriff über TCP (wie bei @lornix und @slm) fehlschlägt, wenn der Host nicht erreichbar ist. Ich fand schließlich diese Seite , auf der ich endlich nicht nur ein, sondern zwei Arbeitsbeispiele fand:nc -w1 127.0.0.1 22 </dev/null
(Das
-w
Flag kümmert sich um das Timeout und</dev/null
ersetzt das-z
Flag.)timeout 1 bash -c '(echo > /dev/tcp/127.0.0.1/22) >/dev/null 2>&1'
(Der
timeout
Befehl kümmert sich um das Timeout und der Rest kommt von @slm)Verwenden Sie dann einfach
&&
und / oder||
(oder sogar$?
), um das Ergebnis zu extrahieren. Hoffentlich findet jemand diese Informationen nützlich.quelle
Wenn Sie die Antworten von @kenorb und @Azukikuru kombinieren, können Sie Port offen / geschlossen / Firewall testen.
Ein weiterer Ansatz mit Curl zum Erreichen eines beliebigen Ports
quelle
Hier ist eine Funktion, die eine der Methoden auswählt, je nachdem, was auf Ihrem System installiert ist:
quelle
Es sollte nicht auf Ihrer Box verfügbar sein, aber versuchen Sie es mit
nmap
.quelle
nmap
ist ein gutes Werkzeug, aber auf diesen Systemen nicht verfügbar. Anstatt es herunterzuladennmap
, zu kompilieren, in mein Home-Verzeichnis zu installieren und dann auf alle anderen Systeme zu kopieren, hoffte ich, einen Weg zu finden, vorhandene Tools zu verwenden, die in den meisten Linux-Installationen verfügbar sind.als Referenz, um die Antwort von @peperunas zu erweitern:
Mit nmap können Sie Folgendes testen:
(Beispiel oben verwendet localhost zu Demonstrationszwecken)
quelle
Wenn Sie mehr als nur ein System testen müssen, können Sie für solche Aufgaben unser Testtool dda-serverspec ( https://github.com/DomainDrivenArchitecture/dda-serverspec-crate ) verwenden. Sie können Ihre Erwartungen definieren
und testen Sie diese Erwartung entweder gegen localhost oder gegen Remote-Hosts (Verbindung über ssh). Für Ferntests müssen Sie Ziele definieren:
Sie können den Test mit ausführen
java -jar dda-serverspec.jar --targets targets.edn serverspec.edn
Unter der Haube benutzen wir Netcat wie oben vorgeschlagen ...
quelle