One-liner
Eu montei um belo one-liner que serve rapidamente a esse objetivo, permitindo pegar um número arbitrário de portas em um intervalo arbitrário (aqui está dividido em 4 linhas para facilitar a leitura):
comm -23 \
<(seq "$FROM" "$TO" | sort) \
<(ss -tan | awk '{print $4}' | cut -d':' -f2 | grep '[0-9]\{1,5\}' | sort -u) \
| shuf | head -n "$HOWMANY"
Linha por linha
commé um utilitário que compara linhas em dois arquivos que devem aparecer classificados em ordem alfabética. Ele produz três colunas: linhas que aparecem apenas no primeiro arquivo, linhas que aparecem apenas no segundo arquivo e linhas comuns. Ao especificar -23, suprimimos as últimas colunas e mantemos apenas a primeira. Podemos usar isso para obter a diferença de dois conjuntos, expressos como uma sequência de linhas de texto. Eu aprendi sobre comm aqui .
O primeiro arquivo é o intervalo de portas que podemos selecionar. seqproduz uma sequência classificada de números de $FROMa $TO. O resultado é classificado em ordem alfabética (em vez de numericamente) e canalizado para commo primeiro arquivo usando a substituição do processo .
O segundo arquivo é a lista ordenada de portas, que obtemos chamando o sscomando (com -tas portas TCP intencionados, -aque significa que todos - estabelecida e ouvir - e -nnumérico - não tentar resolver, por exemplo, 22a ssh). Em seguida, escolhemos apenas a quarta coluna com awk, que contém o endereço local e a porta. Usamos cutpara dividir endereço e porta com o :delimitador e manter apenas o último ( -f2). ssTambém produzimos um cabeçalho, do qual nos livramos do grepping para seqüências não vazias de números que não são maiores que 5. Em seguida, cumprimos commo requisito de sorting sem duplicatas -u.
Agora temos uma lista ordenada de portas abertas, que podemos shuffle para, em seguida, pegar o primeiro "$HOWMANY"aqueles com head -n.
Exemplo
Pegue as três portas abertas aleatórias no intervalo privado (49152-65535)
comm -23 <(seq 49152 65535 | sort) <(ss -tan | awk '{print $4}' | cut -d':' -f2 | grep "[0-9]\{1,5\}" | sort -u) | shuf | head -n 3
poderia retornar por exemplo
54930
57937
51399
Notas
- mudar
-tcom -uno sspara obter as portas UDP gratuitos vez.
- substitua
shufpor sort -nse você preferir obter as portas disponíveis ordenadas numericamente em vez de aleatoriamente
-nao netstat e a um grep mais seletivo). A maneira de fazer isso é tentar abrir uma porta no modo que você precisar e tentar outra se ela não estiver disponível.