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") \
<(ss -tan | awk '{print $4}' | cut -d':' -f2 | grep '[0-9]\{1,5\}' | sort -n | uniq) \
| shuf | head -n "$HOWMANY"
Linea por linea
commes una utilidad que compara líneas ordenadas en dos archivos. 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 canaliza commcomo el primer archivo que usa 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, que eliminamos haciendo grepping para secuencias de números no vacías que no son más largas que 5. Luego cumplimos con commel requisito al sortingresar numéricamente ( -n) y eliminar los duplicados con uniq.
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) <(ss -tan | awk '{print $4}' | cut -d':' -f2 | grep "[0-9]\{1,5\}" | sort | uniq) | 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.
- suelte
shufsi no está interesado en tomar un puerto aleatorio