Wie kann ich anhand eines Bash-Skripts schnell herausfinden, ob ein Port 445
auf einem Server geöffnet ist / lauscht.
Ich habe ein paar Optionen ausprobiert, aber ich möchte etwas schnell:
1. lsof -i :445
(Dauert Sekunden)
2. netstat -an |grep 445 |grep LISTEN
(Dauert Sekunden)
3. telnet
(es gibt nicht)
4. nmap
, netcat
sind auf dem Server nicht verfügbar
Es wird schön sein, einen Weg zu kennen, der nicht zuerst aufzählt und danach greift.
netstat -lnt
(mit-t
und ohne-a
) beschränkt die Ausgabe nur auf abhörende TCP-Verbindungen. Es kann sich etwas beschleunigen. Sie können-4
IPv4 nur hinzufügen, wenn Sie IPv6 nicht benötigen.netstat -an | grep PORTNUMBER | grep -i listen
Wenn die Ausgabe leer ist, wird der Port nicht verwendet.lsof
es für Sie langsam ist, aber normalerweise ist es die beste der von Ihnen aufgelisteten Lösungen. Ihrenetstat
Lösung ist nicht sehr zuverlässig (Sie können sie bei jeder Verwendung erratengrep
; sie gibt ohnehin true zurück, wenn jemand z. B. 4450 zuhört).telnet
undnetcat
tatsächlich versuchen, eine Verbindung herzustellen, die möglicherweise nicht immer das ist, was Sie wollen.Antworten:
Eine Überraschung, die ich kürzlich herausgefunden habe, ist, dass Bash TCP-Verbindungen nativ als Dateideskriptoren unterstützt . Benutzen:
Ich verwende 6 als Dateideskriptor, weil 0,1,2 stdin, stdout und stderr sind. 5 wird manchmal von Bash für untergeordnete Prozesse verwendet , daher sollten 3,4,6,7,8 und 9 sicher sein.
So testen Sie den Kommentar auf einem lokalen Server in einem Skript:
Versuchen Sie, eine Verbindung per Loopback herzustellen, um festzustellen, ob jemand zuhört. Wenn dies fehlschlägt, ist der Port geschlossen oder wir haben keinen Zugriff. Schließen Sie anschließend die Verbindung.
Ändern Sie dies für Ihren Anwendungsfall, z. B. das Senden einer E-Mail, das Beenden des Skripts bei einem Fehler oder das Starten des erforderlichen Dienstes.
quelle
/dev/tcp/IP/PORT
Baums kompiliert wurdeHier gibt es eine sehr kurze Beschreibung mit "schnelle Antwort": Wie kann ich testen, ob der Remote-TCP-Port über das Shell-Skript geöffnet ist?
Ich benutze es mit 127.0.0.1 als "entfernte" Adresse.
Dies gibt "0" zurück, wenn der Port geöffnet ist, und "1", wenn der Port geschlossen ist
z.B
quelle
Sie können netstat auf diese Weise verwenden, um viel schnellere Ergebnisse zu erzielen:
Unter Linux:
Auf dem Mac:
Dadurch wird eine Liste der Prozesse ausgegeben, die den Port überwachen (in diesem Beispiel 445), oder es wird nichts ausgegeben, wenn der Port frei ist.
quelle
netstat -lnt | awk '$6 == "LISTEN" && $4 ~ ".445"'
awk '$6 == "LISTEN" && $4 ~ "80$"'
. Anstatt nach dem Punkt vor der Portnummer mit zu suchen\.80
, habe ich verwendet80$
. Ansonsten stimmte dies auch mit IP-Adressen überein, die.80
Ports enthalten, die mit80
solchen beginnen, wie z8000
.Sie können dafür netcat verwenden.
stellt eine Verbindung zum Server her und schließt die Verbindung direkt wieder. Wenn netcat keine Verbindung herstellen kann, wird ein Exit-Code ungleich Null zurückgegeben. Der Exit-Code wird in der Variablen $? Gespeichert. Als Beispiel,
gibt nur dann 0 zurück, wenn netcat erfolgreich eine Verbindung zum Port herstellen konnte.
quelle
nc
hat das-z
Flag für diesen Zweck, für das keine Eingabe erforderlich ist/dev/null
. Es gibt bereits eine Antwort mit der-z
Flagge oben.Basierend auf der Antwort von Spencer Rathbun mit bash:
quelle
: &>/dev/null </dev/tcp/127.0.0.1/$PORT
Sie sind in / proc / net / tcp aufgeführt.
Es ist die zweite Spalte nach dem ":" in hex:
Ich denke also, einer von denen
:50
in der dritten Spalte muss Stackoverflow sein: o)Blick in
man 5 proc
für mehr Details. und das mit sed usw. auseinander zu nehmen, bleibt als Übung für den sanften Leser ...quelle
2ms ist schnell genug?
Fügen Sie den Doppelpunkt hinzu und dies funktioniert unter Linux
quelle
ss
ist sogar etwas schneller alsnc
.l
ist zum Hören ,4
ist für IPv4;sport
steht für (natürlich) Quellport . Der obige Befehl setzt einen empfangenden TCP-Port voraus (t
Option): Verwenden Sie dieu
Option für UDPs oder keine für beide Protokolle. Mehr Infos zuss
wie immer bei Nixcraft . HINWEIS:ss
Filter funktionieren hier nicht, ich weiß nicht warum (bash 4.3.11, SS-Dienstprogramm, iproute2-ss131122), müssen mit grep gehen .ss
Befehl keinen Exit-Code zurückgibt, der seine Feststellung widerspiegelt. Es wird immer 0 Exit-Code zurückgegeben.| grep LISTEN
?State Recv-Q Send-Q Local Address:Port Peer Address:Port
und jetzt? Was bedeutet das?Hier ist eine, die sowohl für Mac als auch für Linux funktioniert:
quelle
[\\.\:]
.Wobei 8000 die Portnummer ist. Wenn der Port frei ist, wird ein Server gestartet, den Sie problemlos schließen können. Wenn dies nicht der Fall ist, wird ein Fehler ausgegeben:
quelle
Ich wollte überprüfen, ob auf einem unserer Linux-Testserver ein Port geöffnet ist. Ich konnte dies tun, indem ich versuchte, eine Verbindung mit Telnet von meinem Entwicklungscomputer zum Testserver herzustellen. Versuchen Sie auf Ihrem Entwicklercomputer Folgendes auszuführen:
In diesem Beispiel möchte ich überprüfen, ob Port 8080 auf Host test2.host.com geöffnet ist
quelle
tcping ist ein großartiges Tool mit einem sehr geringen Overhead. Es hat auch ein Timeout-Argument, um es schneller zu machen:
quelle
Sie können auch den Befehl netcat verwenden
oder
-z - setzt nc so, dass es einfach nach lauschenden Dämonen sucht, ohne tatsächlich Daten an sie zu senden.
-v - aktiviert den ausführlichen Modus.
quelle
nmap
ist das richtige Werkzeug. Einfach benutzennmap example.com -p 80
Sie können es vom lokalen oder Remote-Server verwenden. Außerdem können Sie feststellen, ob eine Firewall den Zugriff blockiert.
quelle
Wenn Sie iptables verwenden, versuchen Sie:
oder
quelle