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
comm
es 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. seq
produce una secuencia ordenada de números de $FROM
a $TO
. El resultado se canaliza comm
como el primer archivo que usa la sustitución del proceso .
El segundo archivo es la lista ordenada de puertos, que obtenemos al llamar al ss
comando (con el -t
significado de puertos TCP, que -a
significa todo - establecido y escuchando - y -n
numérico - no intente resolver, digamos, 22
a ssh
). Luego seleccionamos solo la cuarta columna con awk
, que contiene la dirección local y el puerto. Usamos cut
dividir la dirección y el puerto con el :
delimitador y mantener solo el último ( -f2
). ss
también genera un encabezado, que eliminamos haciendo grep
ping para secuencias de números no vacías que no son más largas que 5. Luego cumplimos con comm
el requisito al sort
ingresar numéricamente ( -n
) y eliminar los duplicados con uniq
.
Ahora tenemos una lista ordenada de los puertos abiertos, que podemos shuf
FLE 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
-t
con el -u
de ss
conseguir los puertos UDP libres en su lugar.
- suelte
shuf
si no está interesado en tomar un puerto aleatorio