Estoy buscando un comando o script que devuelva un puerto no utilizado en mi sistema ubuntu linux. He buscado en internet y lo único que encuentro es sobre el puerto usado / Listen con el comando nestat. Aparentemente, algo con el comando netstat funcionará, pero no sé qué exactamente. ¿Alguna idea de cómo?
Gracias.
linux
command-line
port
usuario2429082
fuente
fuente
Respuestas:
netstat -lat
da la lista completa de puertos de escucha y establecidos .Cuando un puerto no está en ninguno de esos estados, no existe para el sistema, por lo que no encontrará un comando que muestre la lista de puertos no utilizados.
Tenga en cuenta que hay 65535 puertos, por lo que todo lo que no
netstat -lat
está encendido es un puerto no utilizado.El siguiente script bash hará un escaneo simple de los puertos tcp y le informará cuáles están abiertos y cuáles están cerrados :
Si lo guarda como portscan.sh , debe ejecutarse como ./portscan.sh IP first_port last_port , por ejemplo:
./portscan 127.0.0.1 20 135
escaneará el equipo local desde los puertos 20 a 135fuente
Ruby 2.x (una línea):
ruby -e 'require "socket"; puts Addrinfo.tcp("", 0).bind {|s| s.local_address.ip_port }'
En mi máquina ahora mismo que impreso:
Una invocación posterior impresa:
Esta técnica hace que el usuario actual solicite un puerto no utilizado (enlace al puerto "0") y luego imprime el número de puerto que proporcionó el sistema operativo. Y dado que el usuario actual es el que pregunta, los puertos por debajo de 1024 no se devolverán (a menos que el usuario actual = root).
Crédito donde el crédito es debido: esta solución proviene de un comentario de Franklin Yu en unix.stackexchange.com ¿Cuál es la forma más fácil de encontrar un puerto local no utilizado?
fuente
Secuencia de comandos de bash corta que genera aleatoriamente un número entre 1025 y 60000 y se repite hasta que ese número no se encuentra en la lista de puertos utilizados. Esta es una solución rápida y sucia que tiene un sesgo hacia puertos más grandes:
fuente
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):
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í sobrecomm
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 canalizacomm
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
assh
). Luego seleccionamos solo la cuarta columna conawk
, que contiene la dirección local y el puerto. Usamoscut
dividir la dirección y el puerto con el:
delimitador y mantener solo el último (-f2
).ss
también genera un encabezado, que eliminamos haciendogrep
ping para secuencias de números no vacías que no son más largas que 5. Luego cumplimos concomm
el requisito alsort
ingresar numéricamente (-n
) y eliminar los duplicados conuniq
.Ahora tenemos una lista ordenada de los puertos abiertos, que podemos
shuf
FLE a continuación, apoderarse de los primeros"$HOWMANY"
que tienenhead -n
.Ejemplo
Tome los tres puertos abiertos aleatorios en el rango privado (49152-65535)
podría volver por ejemplo
Notas
-t
con el-u
dess
conseguir los puertos UDP libres en su lugar.shuf
si no está interesado en tomar un puerto aleatoriofuente
Necesitaba encontrar solo un puerto aleatorio no utilizado y no imprimir una lista de ellos. Aquí está mi solución bash.
Y úsalo comprándolo
fuente
Quizás otra solución basada en la lista de puertos usados:
El
netstat
comando genera una lista de todos los puertos abiertos. Elsed
comando extrae los números de puerto, que están en uso ysort
/uniq
construct devuelve una lista uniq de puertos abiertos. El segundo paso es generar una lista de números de puerto que comiencen en 1 y terminen en 1000 (puertos reservados) y una lista adicional de todos los números de puerto que comiencen en 1 hasta 65535. La lista final contiene todos los puertos disponibles solo una vez y losuniq -u
extraerá . Por último,shuf -n 1
seleccionará un puerto aleatorio de la lista completa de puertos disponibles. Sin embargo, habrá una condición de carrera, antes de poder reservar el puerto.fuente
Necesitaba encontrar el siguiente puerto abierto a partir de un número de puerto; Aquí está mi intento de usar la solución de @Taras.
fuente
Si 54321 es su puerto, ejecute:
Algunas variaciones del uso de netstat se pueden encontrar aquí .
fuente