¿Hay algún comando de línea de comando o alguna otra forma de encontrar y enumerar los números de puerto ocupados y libres en mi máquina Linux?
¿Hay algún comando de línea de comando o alguna otra forma de encontrar y enumerar los números de puerto ocupados y libres en mi máquina Linux?
Respuestas:
El comando
netstat -antu
mostrará todos los puertos tcp y udp en uso. La salida se verá más o menos así:
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:59753 0.0.0.0:* LISTEN
El número después de los dos puntos en el campo Dirección local muestra el puerto en uso. Si el estado es "ESCUCHAR" significa un puerto que está utilizando para las conexiones entrantes. Si la dirección IP en elLocal Address
campo es 0.0.0.0
, significa que las conexiones entrantes serán aceptadas en cualquier dirección IP asignada a una interfaz, lo que significa que las conexiones se originan fuera de su máquina.
Si decía localhost
o 127.0.0.1
solo aceptaría conexiones de su máquina.
Además, si agrega el -p
parámetro y lo ejecuta como root, mostrará el proceso que abrió el puerto:
$ sudo netstat -antup
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:59753 0.0.0.0:* LISTEN 860/rpc.statd
Todo lo que no se muestre como en uso es gratuito, sin embargo, los usuarios (cuentas sin privilegios) solo pueden abrir puertos superiores a 1023.
-antu
se puede escribir como -tuna
🐟
Una forma buena y confiable de verificar los puertos abiertos es usar ss
(reemplazo para los obsoletos netstat
), es utilizable en un script sin requerir privilegios elevados (es decirsudo
).
Uso: opción -l
para escuchar puertos, opción -n
para omitir la resolución DNS y el filtro en el puerto de origen NN
: src :NN
(reemplácelo NN
por el puerto que desea monitorear). Para más opciones, veaman ss
ss -ln src :NN
Ejemplos:
[user@server ~]# ss -ln src :80
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:80 *:*
[user@server ~]# ss -ln src :81
State Recv-Q Send-Q Local Address:Port Peer Address:Port
Y en un script, usando grep, podemos probar si la salida contiene el puerto que solicitamos. Ejemplo con el puerto 80 en uso (ver arriba):
myport=80
# count the number of occurrences of port $myport in output: 1= in use; 0 = not in use
result=$(ss -ln src :$myport | grep -Ec -e "\<$myport\>")
if [ "$result" -eq 1 ]; then
echo "Port $myport is in use (result == $result) "
else
echo "Port $myport is NOT in use (result == $result) "
fi
# output:
Port 80 is in use (result == 1)
Ejemplo con el puerto 81 no en uso (ver arriba)
myport=81
result=$(ss -ln src :$myport | grep -Ec -e "\<$myport\>")
if [ "$result" -eq 1 ]; then
echo "Port $myport is in use (result == $result) "
else
echo "Port $myport is NOT in use (result == $result) "
fi
# output:
Port 81 is NOT in use (result == 0)
De otra manera:
telnet localhost <PORT_NUMBER>
Si el puerto está libre, recibirá un error. Si el puerto está en uso, Telnet se conectará.
(encontrado en http://www.unix.com/unix-for-dummies-questions-and-answers/8456-how-know-whether-particular-port-number-free-not.html )