Un trazador de líneas
He reunido un buen one-liner que cumple rápidamente el propósito, lo que permite capturar un número arbitrario de puertos en un rango arbitrario (aquí se divide en 4 líneas para facilitar la lectura):
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"
Linea por linea
commes una utilidad que compara líneas en dos archivos que deben aparecer ordenadas alfabéticamente. Produce tres columnas: líneas que aparecen solo en el primer archivo, líneas que solo aparecen en el segundo y líneas comunes. Al especificar -23, suprimimos las últimas columnas y solo conservamos la primera. Podemos usar esto para obtener la diferencia de dos conjuntos, expresados como una secuencia de líneas de texto. Aprendí sobre comm aquí .
El primer archivo es el rango de puertos que podemos seleccionar. seqproduce una secuencia ordenada de números de $FROMa $TO. El resultado se ordena alfabéticamente (en lugar de numéricamente) y se canaliza commcomo el primer archivo usando la sustitución del proceso .
El segundo archivo es la lista ordenada de puertos, que obtenemos al llamar al sscomando (con el -tsignificado de puertos TCP, que -asignifica todo - establecido y escuchando - y -nnumérico - no intente resolver, digamos, 22a ssh). Luego seleccionamos solo la cuarta columna con awk, que contiene la dirección local y el puerto. Usamos cutdividir la dirección y el puerto con el :delimitador y mantener solo el último ( -f2). sstambién genera un encabezado, del cual nos deshacemos haciendo grepping para secuencias de números no vacías que no son más largas que 5. Luego cumplimos con commel requisito de sortin sin duplicados -u.
Ahora tenemos una lista ordenada de los puertos abiertos, que podemos shufFLE a continuación, apoderarse de los primeros "$HOWMANY"que tienen head -n.
Ejemplo
Tome los tres puertos abiertos aleatorios en el rango 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
podría volver por ejemplo
54930
57937
51399
Notas
- cambiar
-tcon el -ude ssconseguir los puertos UDP libres en su lugar.
- reemplace
shufcon sort -nsi prefiere obtener puertos disponibles ordenados numéricamente en lugar de al azar
-na netstat y a un grep más selectivo). La forma de hacerlo es intentar abrir un puerto en el modo que necesite y probar con otro si no está disponible.