One-liner
Eu criei um bom one-liner que serve rapidamente ao propósito, permitindo pegar um número arbitrário de portas em um intervalo arbitrário (aqui ele é 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 gera três colunas: linhas que aparecem apenas no primeiro arquivo, linhas que aparecem apenas no segundo e linhas comuns. Especificando -23 , suprimimos as últimas colunas e apenas mantemos a primeira. Podemos usar isso para obter a diferença de dois conjuntos, expressos como uma sequência de linhas de texto. Aprendi sobre comm aqui .
O primeiro arquivo é o intervalo de portas que podemos selecionar. seq produz uma sequência classificada de números de $FROM a $TO . O resultado é classificado em ordem alfabética (em vez de numericamente) e canalizado para comm como o primeiro arquivo usando substituição de processos .
O segundo arquivo é a lista classificada de portas, que obtemos chamando o comando ss (com -t significando portas TCP, -a significando todo - estabelecido e escutando - e -n numérico - don ' t tente resolver, digamos, 22 to ssh ). Em seguida, escolhemos apenas a quarta coluna com awk , que contém o endereço e a porta locais. Usamos cut para dividir endereço e porta com o delimitador : e manter apenas o último ( -f2 ). ss também gera um cabeçalho, pelo qual nos livramos de grep ping para sequências não vazias de números que não são maiores do que 5. Então, cumprimos a exigência de comm em sort ing sem duplicatas -u .
Agora, temos uma lista classificada de portas abertas, que podemos usar shuf para, em seguida, pegar as primeiras "$HOWMANY" 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
- altere
-t com -u em ss para obter portas UDP gratuitas.
- substitua
shuf por sort -n se preferir obter portas disponíveis numericamente ordenadas em vez de aleatoriamente