Bagaimana cara mengetahui program apa yang sedang mendengarkan pada port yang diberikan?

377

Saya menduga suatu program sedang mendengarkan pada port 8000di mesin saya.

Ketika saya menjalankan perintah berikut, saya mendapatkan kesalahan ini:

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

Jika saya menggunakan port lain ( 8000default), server web berjalan dengan baik.

Jika saya lari wget localhost:8000dari baris perintah, ia kembali 404 Not Found.

Apa yang bisa saya lakukan (atau alat apa yang tersedia) untuk menemukan program apa yang sedang mendengarkan pada port 8000, dan dari situlah program itu dikonfigurasi?

Yansal
sumber

Jawaban:

314

Buka terminal Anda dan ketikkan sebagai

lsof -i :8000

perintah itu akan mencantumkan aplikasi yang digunakan oleh port tersebut dengan PID. (Jika tidak ada hasil yang dijalankan sudokarena Anda mungkin tidak memiliki izin untuk proses tertentu.)

Misalnya, dengan 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)

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

Semoga itu bisa membantu.

rɑːdʒɑ
sumber
2
Ini juga berfungsi pada OSX untuk apa nilainya .....
reevesy
2
Menambahkan -s TCP:LISTENmembatasi hasil ke soket pendengaran yang sebenarnya dan prosesnya.
jhermann
1
Jika Anda mencari port 8000, ia kembali PID 1889? wat
CodyBugstein
Ya, ada layanan dengan PID 1889 menggunakan port 8881. apakah saya kehilangan sesuatu?
rɑːdʒɑ
1
@Iray contoh pencarian untuk port 8881. Kolom PID berisi ID proses dan kolom NAME berisi port.
Freek de Bruijn
377

Anda dapat menggunakan netstat untuk melihat proses mana yang mendengarkan port mana.

Anda dapat menggunakan perintah ini untuk memiliki detail lengkap:

sudo netstat -peanut

jika Anda perlu tahu persis mana yang sedang mendengarkan pada port 8000 Anda dapat menggunakan ini:

sudo netstat -peanut | grep ":8000 "

Tidak ada proses yang bisa bersembunyi dari netstat.

Antoine Rodriguez
sumber
117
netstat -peanutlebih mudah diingat daripada netstat -taupen!
Douglas B. Staple
9
Bagus - Hanya mengedit jawaban untuk mencerminkan komentar Anda. Terima kasih.
Antoine Rodriguez
2
'fuser -k 8000 / tcp' untuk membebaskan port itu
Jay Modi
3
jika dalam kolom "PID / Nama program" Anda melihat tanda hubung alih-alih nama proses, Anda lupa menambahkan "sudo"
v.shashenko
3
jadi itu kacang eh
prusswan
172

Untuk menjelaskan jawaban dengan @ 33833 Anda bisa mendapatkan info yang sangat rinci, misalnya:

$ 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

Saya dapat melihat di sana bahwa cumi-cumi adalah prosesnya, tetapi sebenarnya cumi saya squid-deb-proxyyang mengambil port.

Contoh bagus lain dari aplikasi 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

Anda dapat melihat lsof(LiSt Open Files) bahwa itu adalah java, yang kurang bermanfaat. Menjalankan psperintah dengan PID kita dapat langsung melihat bahwa itu adalah CrashPlan.

Andrew Burns
sumber
9
Dalam satu perintah:lsof -t -i :8000 | xargs ps -fp
Brett Y
8
Saya harus awalan sudo tetapi setelah itu berhasil untuk saya. Terima kasih.
Dwayne Crooks
4
catatan: tanpa sudoAnda tidak akan mendapatkan kesalahan, Anda tidak akan mendapat apa-apa sebagai tanggapan.
Frank Nocke
13

Coba ssdari iproute2paket:

ss -nlp | grep 8000
korjjj
sumber
5
ssjuga memiliki kemampuan filtering sendiri: ss -nlp '( sport = :8000 )'.
GnP
6

Cara lain menggunakan socklistdari procinfopaket:

man socklist

DESCRIPTION
socklistadalah skrip Perl yang memberi Anda daftar semua soket terbuka, jenis penghitungan, port, inode, uid, pid, fd, dan program yang menjadi tempatnya.

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

Anda dapat menggunakan nmap.

Sangat penting untuk mengetahui port mana yang terbuka di PC Anda, ini tidak hanya berguna untuk Linux, tetapi juga untuk sistem operasi lain, Linux memiliki banyak alat untuk memeriksa port mana yang terbuka, yang paling umum adalah nmap yang merupakan alat baris perintah, tetapi juga ada frontEnd grafis untuk itu jika Anda lebih suka itu. 1

untuk menginstalnya, cukup tekan Ctrl+ Alt+ Tdi keyboard Anda untuk membuka Terminal. Ketika terbuka, jalankan perintah di bawah ini:

sudo apt-get install nmap

Untuk informasi lebih lanjut tentang nmap, dan utilitas lain, buka Di Sini

1 Sumber: garron.me

Mitch
sumber
nmap hanya akan memberi tahu Anda BAHWA port terbuka, bukan proses mana yang membukanya.
Andrew Burns
1
Saya mengklik ke sumber Anda untuk membaca [nmap] tries to guess which service is listening on each port, but it can make mistakestepat sebelum menyarankan metode yang sebenarnya untuk mengetahui proses mana yang memiliki soket.
GnP
@gnp Anda mungkin juga ingin melihat ini .
Mitch
@Mitch saya lakukan. OP perlu mengetahui PID yang tepat dari suatu proses pada sistem lokal. Nmap bukan alat yang tepat di sini, bahkan dengan deteksi layanan dan versi. Entah itu akan cocok dengan item pada database nmaps, yang masih memungkinkan OP dalam gelap untuk proses apa untuk membunuh atau mengkonfigurasi ulang, atau tidak akan dan OP akan memiliki sidik jari yang bagus dan tautan ke insecure.org
GnP