it-swarm.com.de

Effizient testen, ob ein Port unter Linux geöffnet ist?

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, möchte aber schnell etwas:
1. lsof -i :445 (dauert Sekunden)
2. netstat -an |grep 445 |grep LISTEN (dauert Sekunden)
3. telnet (es kommt nicht zurück)
4. nmap, netcat sind auf dem Server nicht verfügbar

Es wird schön sein, einen Weg zu kennen, der nicht zuerst aufgezählt wird und danach greift.

189
Aman Jain

Eine Überraschung, die ich kürzlich herausgefunden habe, ist, dass Bash von Haus aus TCP-Verbindungen als Dateideskriptoren unterstützt. Benutzen:

exec 6<>/dev/tcp/ip.addr.of.server/445
echo -e "GET / HTTP/1.0\n" >&6
cat <&6

Ich benutze 6 als Dateideskriptor, da 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, ob ein lokaler Server in einem Skript empfangsbereit ist:

exec 6<>/dev/tcp/127.0.0.1/445 || echo "No one is listening!"
exec 6>&- # close output connection
exec 6<&- # close input connection

Versuchen Sie, eine Loopback-Verbindung 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.

153
Spencer Rathbun

Es gibt hier eine sehr kurze mit "schneller Antwort": Wie teste ich, ob der entfernte TCP -Port vom Shell-Skript aus geöffnet ist?

$ nc -z <Host> <port>; echo $?

Ich benutze es mit 127.0.0.1 als "Remote" -Adresse.

103
user2187128

Sie können netstat auf diese Weise für viel schnellere Ergebnisse verwenden:

nter Linux:

netstat -lnt | awk '$6 == "LISTEN" && $4 ~ /\.445$/'

Auf Mac:

netstat -anp tcp | awk '$6 == "LISTEN" && $4 ~ /\.445$/'

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.

89
anubhava

Sie können dafür netcat verwenden.

nc ip port < /dev/null

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 ist in der Variablen $? Gespeichert. Als Beispiel,

nc ip port < /dev/null; echo $?

gibt nur dann 0 zurück, wenn sich netcat erfolgreich mit dem Port verbinden konnte.

37
Tony

sie sind in/proc/net/tcp aufgelistet.

es ist die zweite Spalte nach dem ":" in hex:

> cat /proc/net/tcp
  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode                                                     
   0: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 10863 1 ffff88020c785400 99 0 0 10 -1                     
   1: 0100007F:0277 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 7983 1 ffff88020eb7b3c0 99 0 0 10 -1                      
   2: 0500010A:948F 0900010A:2328 01 00000000:00000000 02:00000576 00000000  1000        0 10562454 2 ffff88010040f7c0 22 3 30 5 3                   
   3: 0500010A:E077 5F2F7D4A:0050 01 00000000:00000000 02:00000176 00000000  1000        0 10701021 2 ffff880100474080 41 3 22 10 -1                 
   4: 0500010A:8773 16EC97D1:0050 01 00000000:00000000 02:00000BDC 00000000  1000        0 10700849 2 ffff880104335440 57 3 18 10 -1                 
   5: 0500010A:8772 16EC97D1:0050 01 00000000:00000000 02:00000BF5 00000000  1000        0 10698952 2 ffff88010040e440 46 3 0 10 -1                  
   6: 0500010A:DD2C 0900010A:0016 01 00000000:00000000 02:0006E764 00000000  1000        0 9562907 2 ffff880104334740 22 3 30 5 4                    
   7: 0500010A:AAA4 6A717D4A:0050 08 00000000:00000001 02:00000929 00000000  1000        0 10696677 2 ffff880106cc77c0 45 3 0 10 -1  

also denke ich, dass einer dieser :50 in der dritten Spalte Stackoverflow sein muss: o)

weitere Einzelheiten finden Sie in man 5 proc. und das mit sed etc auseinander zu nehmen ist eine übung für den sanften leser ...

15
andrew cooke

Basierend auf der Antwort von Spencer Rathbun mit bash:

true &>/dev/null </dev/tcp/127.0.0.1/$PORT && echo open || echo closed
14
user1338062
ss -tl4 '( sport = :22 )'

2ms ist schnell genug?

Fügen Sie den Doppelpunkt hinzu und das funktioniert unter Linux

11
leucos

Hier ist eine, die sowohl für Mac als auch für Linux funktioniert:

netstat -aln | awk '$6 == "LISTEN" && $4 ~ "[\\.\:]445$"'
6
Artur Bodera

Ich wollte überprüfen, ob auf einem unserer Linux-Testserver ein Port offen ist. Ich konnte dies tun, indem ich versuchte, eine Verbindung mit Telnet von meinem Entwicklercomputer zum Testserver herzustellen. Auf Ihrem Dev-Rechner versuchen Sie Folgendes auszuführen:

$ telnet test2.Host.com 8080
Trying 05.066.137.184...
Connected to test2.Host.com

In diesem Beispiel möchte ich überprüfen, ob Port 808 auf Host test2.Host.com offen ist

5
razvang
nc -l 8000

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:

nc: Address already in use
5
Jose Enrique

tcping ist ein großartiges Tool mit sehr geringem Overhead. Es hat auch ein Timeout-Argument, um es schneller zu machen:

[[email protected]_f831dfb3 ~]# tcping 10.86.151.175 22 -t 1
10.86.151.175 port 22 open.
[[email protected]_f831dfb3 ~]# tcping 10.86.150.194 22 -t 1
10.86.150.194 port 22 user timeout.
[[email protected]_f831dfb3 ~]# tcping 1.1.1.1 22 -t 1
1.1.1.1 port 22 closed.
1
Payam

Sie können auch den Befehl netcat verwenden

[location of netcat]/netcat -zv [ip] [port]

oder

nc -zv [ip] [port]

-z - Legt fest, dass nc einfach nach hörenden Daemons sucht, ohne tatsächlich Daten an sie zu senden.
- v - Aktiviert den ausführlichen Modus.

0
Saurabh