¿Cómo saber qué programa está escuchando en un puerto determinado?

378

Sospecho que un programa está escuchando en el puerto 8000de mi máquina.

Cuando ejecuto el siguiente comando, aparece este error:

> python -m SimpleHTTPServer
# Lots of python error
socket.error: [Errno 98] Address already in use

Si uso otro puerto ( 8000es el predeterminado), el servidor web funciona bien.

Si corro wget localhost:8000desde la línea de comando, vuelve 404 Not Found.

¿Qué puedo hacer (o qué herramientas están disponibles) para encontrar qué programa está escuchando en el puerto 8000y desde allí dónde está configurado ese programa?

yansal
fuente

Respuestas:

316

Abra su terminal y escriba como

lsof -i :8000

ese comando le mostrará la aplicación utilizada por ese puerto con PID. (Si no se ejecutan resultados sudoya que es posible que no tenga permiso para ciertos procesos).

Por ejemplo, con el puerto 8000 ( python3 -m http.server):

$ lsof -i :8000
COMMAND  PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
python3 3269 user    3u  IPv4 1783216      0t0  TCP *:8000 (LISTEN)

Y puerto 22 (SSH):

$ sudo lsof -i :22
COMMAND  PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
sshd     998 root    3u  IPv4 1442116      0t0  TCP *:ssh (LISTEN)
sshd     998 root    4u  IPv6 1442118      0t0  TCP *:ssh (LISTEN)

Espero que ayude.

rɑːdʒɑ
fuente
2
Esto también funciona en OSX por lo que vale .....
reevesy
2
Agregar -s TCP:LISTENrestringe el resultado al socket de escucha real y su proceso.
jhermann
1
Si busca el puerto 8000, PID 1889¿ regresa ? wat
CodyBugstein 01 de
Sí, hay servicio con PID 1889 usando el puerto 8881. ¿Me falta algo?
rɑːdʒɑ
1
@Imray, el ejemplo busca el puerto 8881. La columna PID contiene los ID de proceso y la columna NOMBRE contiene los puertos.
Freek de Bruijn
377

Puede usar netstat para ver qué proceso está escuchando en qué puerto.

Puede usar este comando para tener un detalle completo:

sudo netstat -peanut

si necesita saber exactamente cuál está escuchando en el puerto 8000, puede usar esto:

sudo netstat -peanut | grep ":8000 "

No hay ningún proceso que pueda esconderse de netstat.

Antoine Rodriguez
fuente
117
netstat -peanutes más fácil de recordar que netstat -taupen!
Douglas B. Staple el
99
Bueno uno! - Solo edité la respuesta para reflejar su comentario. Gracias.
Antoine Rodriguez
2
'fuser -k 8000 / tcp' para liberar ese puerto
Jay Modi
3
si en la columna "PID / Nombre del programa" ve guiones en lugar de un nombre de proceso, olvidó agregar "sudo"
v.shashenko
3
así que son cacahuetes eh
prusswan
172

Para exponer la respuesta por @ 33833, puede obtener información muy detallada, por ejemplo:

$ lsof -i :8000
COMMAND  PID  USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
squid3  1289 proxy   15u  IPv6 14810490      0t0  TCP *:8000 (LISTEN)

$ ps -fp 1289
UID        PID  PPID  C STIME TTY          TIME CMD
proxy     1289     1  0 09:48 ?        00:00:00 /usr/sbin/squid3 -N -f /etc/squid-deb-proxy/squid-deb-proxy.conf

Puedo ver que el calamar es el proceso, pero en realidad es mi el squid-deb-proxyque está tomando el puerto.

Otro buen ejemplo de una aplicación de Java:

$ lsof -i :4242
COMMAND  PID USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
java    3075 root   86u  IPv4    12019      0t0  TCP *:4242 (LISTEN)

$ ps -fp 3075
UID        PID  PPID  C STIME TTY          TIME CMD
root      3075     1 15 May24 ?        3-16:07:25 /usr/local/crashplan/jre/bin/java -Dfile.encoding=UTF-8 -Dapp=CrashPlanService -DappBaseName=CrashPl

Puede ver en lsof(LiSt Open Files) que es java, lo que no es útil. Ejecutando el pscomando con el PID podemos ver de inmediato que es CrashPlan.

Andrew Burns
fuente
99
En un comando:lsof -t -i :8000 | xargs ps -fp
Brett Y
8
Tuve que poner un prefijo sudo pero después de eso funcionó para mí. Gracias.
Dwayne Crooks
44
nota: sin sudoque no reciba un error, simplemente no obtendrá nada como respuesta.
Frank Nocke
13

Probar ssdesde el iproute2paquete:

ss -nlp | grep 8000
korjjj
fuente
55
sstambién tiene sus propias capacidades de filtrado: ss -nlp '( sport = :8000 )'.
GnP
6

Otra forma de usar socklistdesde el procinfopaquete:

man socklist

DESCRIPTION
socklistes un script de Perl que le brinda una lista de todos los sockets abiertos, enumerando los tipos, port, inode, uid, pid, fd y el programa al que pertenece.

sudo socklist

type  port      inode     uid    pid   fd  name
tcp     53      28749       0   1721    5  dnsmasq
tcp    631      29190       0   2433   11  cupsd
tcp  42376      82230    1000   1345   84  firefox
tcp  49048      71686    1000   1345   67  firefox
tcp  41248      81672    1000   1345  119  firefox
tcp  54676      84558    1000   1345   73  firefox
udp  56107      66258       0   3268   20  dhclient
udp  40804      17857     107    679   14  avahi-daemon
udp     53      28748       0   1721    4  dnsmasq
udp     68      67427       0   3268    6  dhclient
udp    631      19692       0    765    8  cups-browsed
udp   5353      17855     107    679   12  avahi-daemon
user.dz
fuente
2

Puedes usar nmap.

Es realmente importante saber qué puertos están abiertos en su PC, esto no solo es útil para Linux, sino también para otros sistemas operativos, Linux tiene muchas herramientas para verificar qué puertos están abiertos, el más común es nmap, que es un herramienta de línea de comando, pero también existe un FrontEnd gráfico si lo prefiere de esa manera. 1

para instalarlo, simplemente presione Ctrl+ Alt+ Ten su teclado para abrir Terminal. Cuando se abra, ejecute el siguiente comando:

sudo apt-get install nmap

Para obtener más información sobre nmap y otras utilidades, vaya aquí

1 Fuente: garron.me

Mitch
fuente
nmap solo le dirá QUE un puerto está abierto, no qué proceso lo abrió.
Andrew Burns
1
Hice clic en su fuente para leer [nmap] tries to guess which service is listening on each port, but it can make mistakesjusto antes de que sugiera un método real para averiguar qué proceso posee el socket.
GnP
@gnp También es posible que desee echar un vistazo a esto .
Mitch
@Mitch lo hice. El OP necesita saber el PID exacto de un proceso en el sistema local. Nmap no es la herramienta correcta aquí, ni siquiera con el servicio y la detección de versiones. O coincidirá con un elemento en la base de datos nmaps, que aún le permite a OP en la oscuridad qué proceso matar o reconfigurar, o no lo hará y OP tendrá una buena huella digital y un enlace a insecure.org
GnP