Comment savoir quel programme écoute sur un port donné?

377

Je soupçonne qu'un programme écoute sur le port 8000de ma machine.

Lorsque j'exécute la commande suivante, j'obtiens cette erreur:

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

Si j'utilise un autre port ( 8000par défaut), le serveur Web fonctionne correctement.

Si je cours wget localhost:8000depuis la ligne de commande, cela retourne 404 Not Found.

Que puis-je faire (ou quels outils sont disponibles) pour trouver quel programme écoute sur le port 8000, et à partir de là où ce programme est configuré?

Yansal
la source

Réponses:

314

Ouvrez votre terminal et tapez comme

lsof -i :8000

cette commande vous listera l'application utilisée par ce port avec PID. (Si aucun résultat n'est passé via sudocar vous pourriez ne pas avoir l'autorisation de certains processus.)

Par exemple, avec le port 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)

Et le port 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)

J'espère que ça t'as aidé.

rɑːdʒɑ
la source
2
Cela fonctionne également sur OSX pour ce que sa vaut .....
reevesy
2
L'ajout -s TCP:LISTENlimite le résultat au socket d'écoute réel et à son processus.
Jhermann
1
Si vous recherchez le port 8000, il revient PID 1889? wat
CodyBugstein
Oui, il existe un service avec le PID 1889 utilisant le port 8881. me manque-t-il?
Rɑːdʒɑ
1
@Imray L'exemple recherche le port 8881. La colonne PID contient les ID de processus et la colonne NOM contient les ports.
Freek de Bruijn
377

Vous pouvez utiliser netstat pour voir quel processus écoute sur quel port.

Vous pouvez utiliser cette commande pour avoir un détail complet:

sudo netstat -peanut

si vous avez besoin de savoir exactement lequel écoute sur le port 8000, vous pouvez utiliser ceci:

sudo netstat -peanut | grep ":8000 "

Aucun processus ne peut se cacher de netstat.

Antoine Rodriguez
la source
117
netstat -peanutest plus facile à retenir que netstat -taupen!
Douglas B. Staple
9
Bon un! - Je viens de modifier la réponse afin de refléter votre commentaire. Je vous remercie.
Antoine Rodriguez
2
«fuser -k 8000 / tcp 'pour libérer ce port
Jay Modi
3
Si, dans la colonne "Nom du programme / PID", vous voyez des tirets au lieu d'un nom de processus, vous avez oublié d'ajouter "sudo"
v.shashenko
3
donc c'est des cacahuètes hein
Prusswan 22/0217
172

Pour expliquer la réponse de @ 33833, vous pouvez obtenir des informations très détaillées, par exemple:

$ 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

Je peux voir ici que le calmar est le processus, mais c’est en fait le mien squid-deb-proxyqui prend le port.

Un autre bon exemple d'application 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

Vous pouvez voir dans lsof(LiSt Open Files) qu'il s'agit de Java, ce qui est moins qu'utile. En exécutant la pscommande avec le PID, nous pouvons voir immédiatement qu’il s’agit de CrashPlan.

Andrew Burns
la source
9
En une commande:lsof -t -i :8000 | xargs ps -fp
Brett Y
8
Je devais préfixer sudo mais après cela cela a fonctionné pour moi. Merci.
Dwayne Crooks
4
remarque: sans sudoerreur, vous n'obtiendrez rien en réponse.
Frank Nocke
13

Essayez ssde iproute2package:

ss -nlp | grep 8000
korjjj
la source
5
ssa aussi ses propres capacités de filtrage: ss -nlp '( sport = :8000 )'.
GnP
6

Une autre façon à l' aide socklistdu procinfopackage:

man socklist

DESCRIPTION
socklistest un script Perl qui vous donne une liste de tous les sockets ouverts, énumérant les types, port, inode, uid, pid, fd et le programme auquel il appartient.

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
utilisateur.dz
la source
2

Vous pouvez utiliser nmap.

Il est vraiment important de savoir quels ports sont ouverts sur votre PC, ce qui est utile non seulement pour Linux, mais également pour les autres systèmes d'exploitation, Linux dispose de nombreux outils pour vérifier quels ports sont ouverts, le plus courant étant nmap qui est outil de ligne de commande, mais existe également un frontEnd graphique si vous préférez de cette façon. 1

pour l'installer, appuyez simplement sur Ctrl+ Alt+ Tsur votre clavier pour ouvrir Terminal. Quand il s'ouvre, lancez la commande ci-dessous:

sudo apt-get install nmap

Pour plus d'informations sur nmap et d'autres utilitaires, cliquez ici.

1 Source: garron.me

Mitch
la source
nmap vous dira seulement QU'un port est ouvert, pas quel processus l'a ouvert.
Andrew Burns
1
J'ai cliqué sur votre source pour la lire [nmap] tries to guess which service is listening on each port, but it can make mistakesjuste avant de suggérer une méthode réelle pour savoir quel processus est propriétaire du socket.
GnP
@ GNP Vous pouvez également vouloir jeter un oeil à This .
Mitch
@Mitch je l'ai fait. Le PO a besoin de connaître le PID exact d'un processus sur le système local. Nmap n’est pas le bon outil ici, pas même avec la détection de service et de version. Soit il correspond à un élément de la base de données nmaps, ce qui permet toujours à OP de savoir quel processus tuer ou reconfigurer, ou ce ne sera pas le cas et OP aura une belle empreinte digitale et un lien vers
insecure.org