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
comm
es 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. seq
produce una secuencia ordenada de números de $FROM
a $TO
. El resultado se ordena alfabéticamente (en lugar de numéricamente) y se canaliza comm
como el primer archivo usando 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, del cual nos deshacemos 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 de sort
in sin duplicados -u
.
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 | 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
-t
con el -u
de ss
conseguir los puertos UDP libres en su lugar.
- reemplace
shuf
con sort -n
si prefiere obtener puertos disponibles ordenados numéricamente en lugar de al azar
-n
a 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.