O que eu acho que você quer fazer é obter uma lista de portas de escuta e, em seguida, removê-las de quaisquer outras conexões TCP e, em seguida, serão todas as conexões de saída. O comando ss (status do soquete) emite as colunas "Local Address: Port" e "Peer Address: Port", precisamos remover as portas de escuta da coluna "Local Address: Port" e não a coluna "Peer Address: Port", caso contrário, você poderá perder algumas conexões de saída. Então, para conseguir isso, estou usando \s{2}+
por trás da string ": $ port" no grep para corresponder nos espaços que existem atrás da coluna "Local Address: Port"; essa coluna tem dois ou mais espaços em branco atrás dela, onde o "Peer Address: Port" tem um espaço e, em seguida, uma nova linha (grrr ... deve ter apenas uma nova linha, IMO, então eu poderia ter usado \s+
em vez de \s{2}+
.) Normalmente eu poderia tentar usar a funcionalidade de filtragem de ss, como com ss -tn state established '(sport != :<port1> and sport !=:<port2>)' src <ip address>
. Mas parece que há um limite de quanto tempo essa cadeia pode ser, ela foi bombardeada em um sistema em que eu tinha muitas portas de escuta. Então estou tentando fazer a mesma coisa com o grep. Eu acredito que o seguinte 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"
Observe que isso depende da versão do ss que você está usando, versões mais antigas (como: ss utilitário, iproute2-ss111117) tem um formato de saída diferente, então você pode ter que usar $ 3 em vez de $ 4 no awk. Observe também que ss -tln
e ss -tn state listening
fornecem uma saída diferente, o que é um pouco contra-intuitivo para mim. YMMV.
Eu encontrei uma solução um pouco mais elegante que não requer conhecer o IP do host, ss -tn state established dst :*
funciona bem, eu modifiquei as linhas de comando acima.