Woher wissen Sie, welches Programm auf einem bestimmten Port empfangsbereit ist?

377

Ich vermute, dass ein Programm den Port 8000meines Computers abhört.

Wenn ich den folgenden Befehl ausführe, wird dieser Fehler angezeigt:

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

Wenn ich einen anderen Port verwende ( 8000Standardeinstellung), funktioniert der Webserver einwandfrei.

Wenn ich wget localhost:8000von der Kommandozeile aus starte, kehrt es zurück 404 Not Found.

Was kann ich tun (oder welche Tools sind verfügbar), um herauszufinden, welches Programm auf dem Port empfangsbereit 8000ist und von wo aus dieses Programm konfiguriert wurde?

yansal
quelle

Antworten:

314

Öffnen Sie Ihr Terminal und geben Sie als

lsof -i :8000

Dieser Befehl listet Ihnen die Anwendung auf, die von diesem Port mit PID verwendet wird. (Wenn keine Ergebnisse angezeigt werden, sudoda Sie möglicherweise keine Berechtigung für bestimmte Prozesse haben.)

Zum Beispiel mit 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)

Und 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)

Ich hoffe, das hilft.

rɑːdʒɑ
quelle
2
Dies funktioniert auch auf OSX für das, was es wert ist .....
Reevesy
2
Das Hinzufügen -s TCP:LISTENschränkt das Ergebnis auf die tatsächliche Hörbuchse und deren Prozess ein.
jhermann
1
Wenn Sie nach Port 8000 suchen, wird dieser zurückgegeben PID 1889? wat
CodyBugstein
Ja, es gibt einen Dienst mit PID 1889 über Port 8881. Fehlt mir etwas?
5.
1
@Im Beispiel wird nach Port 8881 gesucht. Die PID-Spalte enthält die Prozess-IDs und die NAME-Spalte enthält die Ports.
Freek de Bruijn
377

Mit netstat können Sie feststellen, welcher Prozess welchen Port überwacht.

Mit diesem Befehl können Sie alle Details anzeigen:

sudo netstat -peanut

Wenn Sie genau wissen müssen, welcher Port 8000 abhört, können Sie dies verwenden:

sudo netstat -peanut | grep ":8000 "

Es gibt keinen Prozess, der sich vor netstat verstecken kann.

Antoine Rodriguez
quelle
117
netstat -peanutist leichter zu merken als netstat -taupen!
Douglas B. Staple
9
Guter! - Bearbeiten Sie einfach die Antwort, um Ihren Kommentar widerzuspiegeln. Danke.
Antoine Rodriguez
2
'fuser -k 8000 / tcp', um diesen Port freizugeben
Jay Modi
3
Wenn Sie in der Spalte "PID / Programmname" Striche anstelle eines Prozessnamens sehen, haben Sie vergessen, "sudo"
v.shashenko
3
so ist es Erdnüsse eh
prusswan
172

Um die Antwort von @ 33833 zu erläutern, können Sie einige sehr detaillierte Informationen erhalten, zum Beispiel:

$ 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

Ich kann genau dort sehen, dass Tintenfisch der Prozess ist, aber es ist tatsächlich mein squid-deb-proxy, der den Hafen einnimmt .

Ein weiteres gutes Beispiel für eine Java-App:

$ 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

Sie können in lsof(LiSt Open Files) sehen, dass es sich um Java handelt, was weniger als hilfreich ist. psWenn wir den Befehl mit der PID ausführen, können wir sofort erkennen, dass es sich um CrashPlan handelt.

Andrew Burns
quelle
9
Mit einem Befehl:lsof -t -i :8000 | xargs ps -fp
Brett Y
8
Ich musste das Präfix eingeben, sudo aber danach funktionierte es für mich. Vielen Dank.
Dwayne Crooks
4
Hinweis: Ohne dass sudoSie keinen Fehler erhalten, erhalten Sie einfach nichts als Antwort.
Frank Nocke
13

Probieren Sie ssaus dem iproute2Paket:

ss -nlp | grep 8000
korjjj
quelle
5
sshat auch seine eigenen Filterfunktionen: ss -nlp '( sport = :8000 )'.
GnP
6

Eine andere Möglichkeit, socklistfrom procinfopackage zu verwenden:

man socklist

DESCRIPTION
socklistist ein Perl-Skript, das eine Liste aller offenen Sockets enthält, in der Typen, Port, Inode, UID, PID, FD und das Programm aufgelistet sind, zu dem es gehört.

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
quelle
2

Sie können nmap verwenden.

Es ist wirklich wichtig zu wissen, welche Ports in Ihrem PC offen sind. Dies ist nicht nur für Linux nützlich, sondern auch für andere Betriebssysteme. Linux verfügt über eine Vielzahl von Tools, um zu überprüfen, welche Ports offen sind Kommandozeilen-Tool, aber es gibt auch ein grafisches Frontend dafür, wenn Sie dies vorziehen. 1

Um es zu installieren, drücken Sie einfach Ctrl+ Alt+ Tauf Ihrer Tastatur, um das Terminal zu öffnen. Führen Sie beim Öffnen den folgenden Befehl aus:

sudo apt-get install nmap

Weitere Informationen zu nmap und anderen Dienstprogrammen finden Sie hier

1 Quelle: garron.me

Mitch
quelle
nmap sagt Ihnen nur, dass ein Port offen ist, nicht welcher Prozess ihn geöffnet hat.
Andrew Burns
1
Ich habe mich zu Ihrer Quelle durchgeklickt, um sie zu lesen, [nmap] tries to guess which service is listening on each port, but it can make mistakesbevor sie eine tatsächliche Methode vorschlägt, um herauszufinden, welchem ​​Prozess der Socket gehört.
GnP
@gnp Vielleicht möchten Sie auch einen Blick auf Dies werfen .
Mitch
@Mitch habe ich getan. Das OP muss die genaue PID eines Prozesses auf dem lokalen System kennen. Nmap ist hier nicht das richtige Tool, auch nicht mit Service- und Versionserkennung. Entweder stimmt es mit einem Eintrag in der nmaps-Datenbank überein, bei dem OP immer noch nicht weiß, welcher Prozess beendet oder neu konfiguriert werden soll, oder es stimmt nicht, und OP hat einen schönen Fingerabdruck und einen Link zu insecure.org
GnP