Qui écoute sur un port TCP donné sur Mac OS X?

1382

Sous Linux, je peux utiliser netstat -pntl | grep $PORTou fuser -n tcp $PORTpour savoir quel processus (PID) écoute sur le port TCP spécifié. Comment obtenir les mêmes informations sur Mac OS X?

pts
la source
27
Désolé, netstat -p tcp | grep $PORTn'affiche pas les PID car netstat sur Mac OS X ne peut pas afficher les PID.
pts
12
netstat -anvaffiche le port sur Mac OS X (source: solution ci-dessous par @SeanHamiliton)
Curtis Yallop

Réponses:

2049

Sur macOS High Sierra et versions ultérieures, utilisez cette commande:

lsof -nP -iTCP:$PORT | grep LISTEN

ou pour voir simplement IPv4:

lsof -nP -i4TCP:$PORT | grep LISTEN

Sur les anciennes versions, utilisez l'un des formulaires suivants:

lsof -nP -iTCP:$PORT | grep LISTEN
lsof -nP -i:$PORT | grep LISTEN

Remplacez $PORTpar le numéro de port ou une liste de numéros de port séparés par des virgules.

Ajoutez un préfixe sudo(suivi d'un espace) si vous avez besoin d'informations sur les ports inférieurs à # 1024.

L' -nindicateur sert à afficher les adresses IP au lieu des noms d'hôte. Cela accélère l'exécution de la commande, car les recherches DNS pour obtenir les noms d'hôte peuvent être lentes (plusieurs secondes ou une minute pour de nombreux hôtes).

Le -Pdrapeau est pour l' affichage des numéros de ports bruts au lieu des noms résolus comme http, ftpou noms de services plus ésotériques comme dpserve, socalia.

Voir les commentaires pour plus d'options.

Pour être complet, car fréquemment utilisé ensemble:

Pour tuer le PID:

kill -9 <PID>
# kill -9 60401
pts
la source
154
Préfixez ceci avec sudopour voir les processus que vous ne possédez pas.
Gordon Davisson
30
sur lion, a travaillé avec un changementsudo lsof -i TCP:$PORT | grep LISTEN
dhaval
58
Sur Mountain Lion, vous n'avez pas besoin de grep:sudo lsof -iTCP:$PORT -sTCP:LISTEN
Siu Ching Pong -Asuka Kenji-
16
après tant de recherches, celle-ci est la meilleure. les personnes qui souhaitent directement copier la commande doivent remplacer $ PORT par le numéro de port réel ou définir la variable PORT et cela aussi pour plusieurs ports comme: export PORT = 8080,4433; lsof -n -i4TCP: $ PORT
siddhusingh
2
On n'a pas besoin de sudo si le port à enquêter est supérieur à 1024.
stigkj
626

Depuis Snow Leopard (10.6), jusqu'à Mojave (10.14) et Catalina (10,15) , chaque version de macOS prend en charge ceci:

sudo lsof -iTCP -sTCP:LISTEN -n -P

Personnellement, je me retrouve avec cette fonction simple dans mon ~/.bash_profile:

listening() {
    if [ $# -eq 0 ]; then
        sudo lsof -iTCP -sTCP:LISTEN -n -P
    elif [ $# -eq 1 ]; then
        sudo lsof -iTCP -sTCP:LISTEN -n -P | grep -i --color $1
    else
        echo "Usage: listening [pattern]"
    fi
}

Ensuite, la listeningcommande vous donne une liste des processus à l'écoute sur un port et le listening smthrecherche pour un modèle.

Ayant cela, il est assez facile de poser des questions sur un processus particulier, par exemple listening dropbox, ou un port, par exemple listening 22.

lsofLa commande a des options spécialisées pour poser des questions sur le port, le protocole, le processus, etc., mais personnellement, j'ai trouvé la fonction ci-dessus beaucoup plus pratique, car je n'ai pas besoin de me souvenir de toutes ces options de bas niveau. lsofest un outil assez puissant, mais malheureusement pas si confortable à utiliser.

Michał Kalinowski
la source
7
Cela se passe dans mes fichiers dot. Je recherche tous les quelques mois et tombe toujours sur cette réponse.
danemacmillan
1
Je pense que cette réponse devrait être acceptée comme OP l'a dit -pntl, ce qui énumérerait tous les services. La réponse acceptée demande qu'un ou plusieurs numéros de port soient spécifiés, ce qui n'est pas le même à distance.
seeafish
440

Vous pouvez aussi utiliser:

sudo lsof -i -n -P | grep TCP

Cela fonctionne dans Mavericks.

Rog182
la source
3
L' -ioption le rend beaucoup plus rapide. 0,02 seconde contre 2 secondes. Dans ma candidature, cela a fait toute la différence.
Eric Boehs
que font ces drapeaux spécifiques -i, -n, -P. Je ne trouve nulle part ce qu'ils signifient exactement
Chad Watkins
sudo lsof -i -n -P | grep TCP | grep $ PORT - J'ai créé un alias avec cette commande
alyn000r
Je suggère d'ajouter "| grep $ PORT" ou "| grep LISTEN"
KC Baltz
Génial! Fonctionne également sur Mojave.
Gefilte Fish
291

Mise à jour janvier 2016

Vraiment surpris, personne n'a suggéré:

lsof -i :PORT_NUMBER

pour obtenir les informations de base requises. Par exemple, vérification sur le port 1337:

lsof -i :1337

Autres variations, selon les circonstances:

sudo lsof -i :1337
lsof -i tcp:1337

Vous pouvez facilement en tirer parti pour extraire le PID lui-même. Par exemple:

lsof -t -i :1337

qui est également équivalente (en résultat) à cette commande:

lsof -i :1337 | awk '{ print $2; }' | head -n 2 | grep -v PID

Illustration rapide:

entrez la description de l'image ici

Pour être complet, car fréquemment utilisé ensemble:

Pour tuer le PID:

kill -9 <PID>
# kill -9 60401

ou comme une doublure:

kill -9 $(lsof -t -i :1337)
arcseldon
la source
2
Cette commande affiche également les PID non écouteurs et les questions explicitement posées aux écouteurs uniquement.
pts
3
Vous pouvez également courir lsof -t -i :1338. -trenverra l'ID du processus, vous n'aurez donc pas à awk / head.
KFunk
Rien n'a fonctionné sauf kill -9 $(lsof -t -i :5000)sur el capitan
goksel
C'est bien. Je préfère savoir ce qu'il y a avant de le tuer, alors (sur cette base) je viens d'ajouter à mon bashrc:, whatsonport() { ps -ef | grep `lsof -t -i :$1` }donc:⇒ whatsonport 3000 --> 501 14866 14865 0 6:07AM ttys006 0:01.73 node .
Sigfried
1
Merci, a lsof -i :PORT_NUMBERfait un travail pour moi.
marika.daboja
79

Cela fonctionne dans Mavericks (OSX 10.9.2).

sudo lsof -nP -iTCP:$PORT -sTCP:LISTEN
Charley Wu
la source
Je n'avais pas besoin de sudo le 10.10.
Sophistifunk
Yosemite travaillé (10.10.2)
Phillip Kamikaze
48

Pour les ports LISTEN, ESTABLISHED et CLOSED

sudo lsof -n -i -P | grep TCP

Pour les ports LISTEN uniquement

sudo lsof -n -i -P | grep LISTEN

Pour un port LISTEN spécifique, ex: port 80

sudo lsof -n -i -P | grep ':80 (LISTEN)'

Ou si vous voulez juste un résumé compact [aucun service / application décrit], allez par NETSTAT. Le bon côté ici, pas de sudo nécessaire

netstat -a -n | grep 'LISTEN '

Expliquer les éléments utilisés:

-n supprimer le nom d'hôte

-i pour les protocoles IPv4 et IPv6

-P omettre les noms de port

-a [sur netstat] pour toutes les sockets

-n [sur netstat] ne résout pas les noms, affiche les adresses réseau sous forme de nombres

Testé sur High Sierra 10.13.3 et Mojave 10.14.3

  • la dernière syntaxe netstat fonctionne aussi sur linux
PYK
la source
Les explications détaillées sont en fait très utiles pour les débutants comme moi. merci @PYK
Tomaz Wang
46

sous OS X, vous pouvez utiliser l'option -v pour netstat pour donner le pid associé.

type:

netstat -anv | grep [.]PORT

la sortie ressemblera à ceci:

tcp46      0      0  *.8080                 *.*                    LISTEN      131072 131072   3105      0

Le PID est le numéro avant la dernière colonne, 3105 pour ce cas

Sean Hamilton
la source
Vous devez également ajouter grep LISTENpour afficher uniquement les auditeurs.
pts
3
Voilà ce dont j'avais besoin! lsofn'a pas pu trouver le port. mais a netstatmontré qu'il était ouvert. -vétait la sauce secrète qui me manquait.
Aaron McMillin
32

Sur macOS, voici un moyen facile d'obtenir l'ID de processus qui écoute sur un port spécifique avec netstat . Cet exemple recherche un processus servant du contenu sur le port 80:

trouver le serveur en cours d'exécution sur le port 80

netstat -anv | egrep -w [.]80.*LISTEN

exemple de sortie

tcp4  0 0  *.80       *.*    LISTEN      131072 131072    715      0

La 2e de la dernière colonne est le PID. En haut, c'est 715 .

les options

-a - afficher tous les ports, y compris ceux utilisés par les serveurs

-n- montrez des nombres, ne cherchez pas de noms. Cela rend la commande beaucoup plus rapide

-v - sortie détaillée, pour obtenir les ID de processus

-w- rechercher des mots. Sinon, la commande renverra des informations pour les ports 8000 et 8001, pas seulement "80"

LISTEN - donner des informations uniquement pour les ports en mode LISTEN, c'est-à-dire les serveurs

johntellsall
la source
2
le drapeau -v l'a fait
user9869932
18

Sur la dernière version de macOS, vous pouvez utiliser cette commande:

lsof -nP -i4TCP:$PORT | grep LISTEN

Si vous avez du mal à vous en souvenir, vous devriez peut-être créer une bashfonction et l'exporter avec un nom plus convivial comme ça.

vi ~/.bash_profile

puis ajoutez les lignes suivantes à ce fichier et enregistrez-le.

function listening_on() {
    lsof -nP -i4TCP:"$1" | grep LISTEN
}

Vous pouvez maintenant saisir listening_on 80votre terminal et voir quel processus écoute sur le port 80.

arturgrigor
la source
13

Sur Snow Leopard (OS X 10.6.8), l'exécution de 'man lsof' donne:

lsof -i 4 -a

(la saisie manuelle réelle est 'lsof -i 4 -a -p 1234')

Les réponses précédentes ne fonctionnaient pas sur Snow Leopard, mais j'essayais d'utiliser 'netstat -nlp' jusqu'à ce que je vois l'utilisation de 'lsof' dans la réponse par pts.

Brent Self
la source
10

Je suis un gars Linux. Sous Linux, c'est extrêmement facile avec netstat -ltpnou toute combinaison de ces lettres. Mais sous Mac OS X, netstat -an | grep LISTENc'est le plus humain. D'autres sont très laids et très difficiles à retenir lors du dépannage.

edib
la source
2
La question demandait explicitement un port TCP spécifique et vos commandes affichent des écouteurs sur tous les ports.
pts
7
lsof -n -i | awk '{ print $1,$9; }' | sort -u

Cela montre qui fait quoi. Supprimez -n pour voir les noms d'hôte (un peu plus lentement).

Misha Tavkhelidze
la source
1
Votre réponse n'est pas mauvaise, mais elle porte sur une question avec plusieurs réponses très appréciées et acceptée depuis plusieurs années. À l'avenir, essayez de vous concentrer sur des questions plus récentes, en particulier celles qui n'ont pas encore reçu de réponse.
Cette commande affiche-t-elle également les ports non TCP et les non-écouteurs? La question demande explicitement des écouteurs sur les ports TCP uniquement.
pts
Selon la page de manuel lsof (8): If no address is specified, this option [-i] selects the listing of all Internet and x.25 (HP-UX) network files.
Misha Tavkhelidze
@Misha Tavkhelidze: Donc, il affiche également les non-auditeurs, donc il ne répond pas à la question.
pts
Ajouter -sTCP:LISTENàlsof
Misha Tavkhelidze
3

Cela a fait ce dont j'avais besoin.

ps -eaf | grep `lsof -t -i:$PORT`
Franc
la source
1

J'ai fait un petit script pour voir non seulement qui écoute où mais aussi pour afficher les connexions établies et vers quels pays. Fonctionne sur OSX Siera

#!/bin/bash
printf "\nchecking established connections\n\n"
for i in $(sudo lsof -i -n -P | grep TCP | grep ESTABLISHED | grep -v IPv6 | 
grep -v 127.0.0.1 | cut -d ">" -f2 | cut -d " " -f1 | cut -d ":" -f1); do
    printf "$i : " & curl freegeoip.net/xml/$i -s -S | grep CountryName | 
cut -d ">" -f2 | cut -d"<" -f1
done

printf "\ndisplaying listening ports\n\n"

sudo lsof -i -n -P | grep TCP | grep LISTEN | cut -d " " -f 1,32-35

#EOF

Sample output
checking established connections

107.178.244.155 : United States
17.188.136.186 : United States
17.252.76.19 : United States
17.252.76.19 : United States
17.188.136.186 : United States
5.45.62.118 : Netherlands
40.101.42.66 : Ireland
151.101.1.69 : United States
173.194.69.188 : United States
104.25.170.11 : United States
5.45.62.49 : Netherlands
198.252.206.25 : United States
151.101.1.69 : United States
34.198.53.220 : United States
198.252.206.25 : United States
151.101.129.69 : United States
91.225.248.133 : Ireland
216.58.212.234 : United States

displaying listening ports

mysqld TCP *:3306 (LISTEN)
com.avast TCP 127.0.0.1:12080 (LISTEN)
com.avast TCP [::1]:12080 (LISTEN)
com.avast TCP 127.0.0.1:12110 (LISTEN)
com.avast TCP [::1]:12110 (LISTEN)
com.avast TCP 127.0.0.1:12143 (LISTEN)
com.avast TCP [::1]:12143 (LISTEN)
com.avast TCP 127.0.0.1:12995 (LISTEN)
com.avast [::1]:12995 (LISTEN)
com.avast 127.0.0.1:12993 (LISTEN)
com.avast [::1]:12993 (LISTEN)
Google TCP 127.0.0.1:34013 (LISTEN)

Cela peut être utile pour vérifier si vous êtes connecté en Corée du Nord! ;-)

0x00
la source
0

C'est un bon moyen sur macOS High Sierra:

netstat -an |grep -i listen
tr4nc3
la source
C'est tout à fait ça! La réponse acceptée est en fait la bonne façon ... netstat sur mac os x n'affiche pas le mappage pid vers port.
tr4nc3
0

Inspiré par l'utilisateur Brent Self:

lsof -i 4 -a | grep LISTEN

Punnerud
la source
0

Pour macOS, j'utilise deux commandes ensemble pour afficher des informations sur les processus à l'écoute sur la machine et le processus de connexion aux serveurs distants. En d'autres termes, pour vérifier les ports d'écoute et les connexions actuelles (TCP) sur un hôte, vous pouvez utiliser ensemble les deux commandes suivantes

1. netstat -p tcp -p udp 

2. lsof -n -i4TCP -i4UDP 

Je pensais que j'ajouterais ma contribution, j'espère que cela peut finir par aider quelqu'un.

Boschko
la source