Ich würde gerne Netcat verwenden, um zu testen, ob einige Ports lauschen oder nicht, aber da der Befehl auf Maschinen ausgeführt wird, deren Sprachen nicht Englisch sind, ist es keine gute Idee, grep
die Ausgabe auf dem Wort zu basieren LISTENING
(auf einem deutschen PC habe ich beispielsweise das Wort gesehen ABHOREN
).
Ich habe versucht, mir die Manpages für Netcat anzusehen, kann dafür aber keine Lösung finden. Daher habe ich mich gefragt, ob es jemals jemandem gelungen ist, den Status des Ports in ein numerisches Format statt in eine Zeichenfolge zu übersetzen.
Dank im Voraus :)
Antwort1
Wenn Sie LISTENING sagen, gehe ich davon aus, dass Sie das tatsächlich wollen netstat
(nicht netcat
). Die meisten modernen Systeme verstehen netstat -lnt
which listet nur LISTENING-TCP-Sockets auf, sonst nichts. Vorsicht bei minimalen RHEL7-Installationen, da gibt es kein netstat – es wird zugunsten von ss
(dieselben Flags, ss -lnt
aber leicht unterschiedliches Ausgabeformat) verworfen.
Im Allgemeinen besteht die Antwort darin, das Gebietsschema in der Umgebung richtig einzustellen, sodass alle Prozesse auf Englisch (oder besser C) mit Ihnen kommunizieren.
Antwort2
Sie können die Sprache für Netcat exportieren, bevor Sie es ausführen (oder sogar für Ihr gesamtes Skript):
LANG=C netcat ...
Antwort3
netstat
Sie können den Kernel auch direkt fragen. Seine Informationen stammen von /proc/net/tcp
und /proc/net/tcp6
. Beide Dateien sind gleich formatiert und sindleicht(hüstel) schwerer zu lesen als die netstat
Ausgabe, aber sprachunabhängig
Dies ist eine gehackte und leicht maskierte Beispielausgabe:
$ cat /proc/net/tcp
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
0: 00000000:0385 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 5126 1 f4807080 100 0 0 10 -1
1: 00000000:2328 00000000:0000 0A 00000000:00000000 00:00000000 00000000 113 0 5264 1 f62ff540 100 0 0 10 -1
2: 00000000:008B 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 4535 1 f5bf1540 100 0 0 10 -1
9: 0200000A:08AE xxxxxxxx:D512 01 00000030:00000000 01:00000018 00000000 0 0 759198 4 f63e95c0 24 4 3 10 19
10: 0200000A:0D9B xxxxxxxx:7582 01 00000000:00000000 00:00000000 00000000 113 0 634192 1 f63e90c0 21 4 22 5 3
Die Schlüsselfelder, die Sie sehen, sind das Hex-Feld nach der :
Unterseite local_address
(Lokaler Port) und der st
Spalte (Status).
Die Statusspalten werden in den Kernelquellen referenziert./include/net/tcp_states.h
, aber hilfreicherweise hat jemand die Frage auf StackExchange gestellt:https://stackoverflow.com/questions/5992211/list-of-possible-internal-socket-statuses-from-proc
Der Vollständigkeit halber werde ich es hier noch einmal wiederholen:
enum {
TCP_ESTABLISHED = 1,
TCP_SYN_SENT,
TCP_SYN_RECV,
TCP_FIN_WAIT1,
TCP_FIN_WAIT2,
TCP_TIME_WAIT,
TCP_CLOSE,
TCP_CLOSE_WAIT,
TCP_LAST_ACK,
TCP_LISTEN,
TCP_CLOSING, /* Now a valid state */
TCP_MAX_STATES /* Leave at the end! */
};
Wie in einem der Kommentare steht, handelt es sich hierbei um enum
einen Status, der fortlaufend ab 1 nummeriert ist. Meistens sucht man nach 0A
(LISTENING) und 01
(ESTABLISHED)
NB: Um herauszufinden, woher netstat diese Informationen bezog, habe ich ausgeführt strace -e open,write netstat -an
.
Hier finden Sie einen ausführlicheren Einblick in die Feldüberschriften:http://www.onlamp.com/pub/a/linux/2000/11/16/LinuxAdmin.html