Ich denke, Sie möchten eine Liste der empfangsbereiten Ports abrufen und diese dann von allen anderen TCP-Verbindungen entfernen. Das sind dann alle ausgehenden Verbindungen. Der Befehl ss (Socket-Status) gibt die Spalten "Local Address: Port" und "Peer Address: Port" aus. Wir müssen die empfangsbereiten Ports aus der Spalte "Local Address: Port" und nicht aus der Spalte "Peer Address: Port" entfernen. Andernfalls verpassen Sie möglicherweise einige ausgehende Verbindungen. Um dies zu erreichen, verwende ich \s{2}+im grep die Zeichenfolge ": $ port", um die Leerzeichen zuzuordnen, die hinter der Spalte "Lokale Adresse: Port" vorhanden sind. Diese Spalte hat zwei oder mehr Leerzeichen dahinter, wobei die "Peer-Adresse: Port" ein Leerzeichen und dann eine neue Zeile (grrr ... sollte nur eine neue Zeile haben, IMO,\s+\s{2}+Normalerweise könnte ich versuchen, die Filterfunktionalität von ss zu verwenden, wie mit ss -tn state established '(sport != :<port1> and sport !=:<port2>)' src <ip address>. Aber es scheint eine Grenze für die Länge dieser Zeichenfolge zu geben, sie ist auf einem System ausgebombt, auf dem ich viele Abhörports hatte. Also versuche ich dasselbe mit grep zu machen. Ich glaube das folgende wird funktionieren:
FILTER=$(ss -tn state listening | gawk 'NR > 1 {n=split($3,A,":"); B[NR-1]=A[n]} END {for (i=1; i<length(B); i++) printf ":%s\\s{2}+|", B[i]; printf ":%s\\s{2}+", B[i]}')
ss -tn state established dst :* | grep -P -v "$FILTER"
Beachten Sie, dass dies von der Version von ss abhängt, die Sie verwenden. Ältere Versionen (wie z. B .: ss utility, iproute2-ss111117) haben ein anderes Ausgabeformat. Daher müssen Sie in awk möglicherweise $ 3 anstelle von $ 4 verwenden. Beachten Sie auch ss -tlnund ss -tn state listeninggibt Ihnen andere Ausgabe, die für mich ein wenig kontraintuitiv ist. YMMV.
Ich habe eine etwas elegantere Lösung gefunden, die keine Kenntnis der Host-IP erfordert. Sie ss -tn state established dst :*funktioniert gut. Ich habe die obigen Befehlszeilen geändert.