netstat -lat
da la lista completa de escuchando y establecido puertos
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 cualquier cosa que no esté en netstat -lat
es un puerto sin usar.
El siguiente script bash hará un escaneo simple de tcp puertos y hacerle saber cuáles están abiertos y cuáles están cerrados :
#!/bin/bash
IP=$1
first_port=$2
last_port=$3
function scanner
{
for ((port=$first_port; port<=$last_port; port++))
do
(echo >/dev/tcp/$IP/$port)> /dev/null 2>&1 && echo $port open || echo "$port closed"
done
}
scanner
Si lo guarda como portscan.sh entonces 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 al 135
Ruby 2.x (una sola línea):
ruby -e 'require "socket"; puts Addrinfo.tcp("", 0).bind {|s| s.local_address.ip_port }'
En mi máquina en este momento que imprimió:
42644
Una invocación posterior impresa:
36168
Esta técnica hace que el usuario actual solicite un puerto no utilizado (vinculado 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 se debe el crédito: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?
Script bash corto 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 usados. Esta es una solución rápida y sucia que tiene un sesgo hacia los puertos más grandes:
CHECK="do while"
while [[ ! -z $CHECK ]]; do
PORT=$(( ( RANDOM % 60000 ) + 1025 ))
CHECK=$(sudo netstat -ap | grep $PORT)
done
echo $PORT