Lo que creo que quieres hacer es obtener una lista de puertos de escucha y luego eliminarlos de cualquier otra conexión TCP, entonces todas esas conexiones saldrán. El comando ss (estado del socket) genera las columnas "Dirección local: puerto" y "Dirección par: puerto", necesitamos eliminar los puertos de escucha de la columna "Dirección local: puerto" y no la columna "Dirección par: puerto", de lo contrario, puede perder algunas conexiones salientes. Para lograr eso, estoy usando \s{2}+detrás de la cadena ": $ port" en el grep para que coincida con los espacios que existen detrás de la columna "Dirección local: puerto"; esa columna tiene dos o más espacios en blanco detrás, donde la "Dirección de pares: Puerto" tiene un espacio y luego una nueva línea (grrr ... debería tener una nueva línea, IMO,\s+\s{2}+.) Normalmente podría intentar usar la funcionalidad de filtrado de ss, como con ss -tn state established '(sport != :<port1> and sport !=:<port2>)' src <ip address>. Pero parece que hay un límite en cuanto al tiempo que puede durar esa cadena, se bombardeó en un sistema donde tenía muchos puertos de escucha. Así que estoy tratando de hacer lo mismo con grep. Creo que lo siguiente funcionará:
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"
Tenga en cuenta que esto depende de la versión de ss que esté usando, las versiones anteriores (como: ss utility, iproute2-ss111117) tienen un formato de salida diferente, por lo que es posible que deba usar $ 3 en lugar de $ 4 en awk. Tenga en cuenta también ss -tlny ss -tn state listeningle da una salida diferente, lo cual es un poco intuitivo para mí. YMMV.
Encontré una solución un poco más elegante que no requiere conocer la IP del host, ss -tn state established dst :*funciona bien, modifiqué las líneas de comando anteriores.