Làm thế nào để biết chương trình nào đang nghe trên một cổng nhất định?


377

Tôi nghi ngờ một chương trình đang nghe trên cổng 8000trên máy của tôi.

Khi tôi chạy lệnh sau, tôi gặp lỗi này:

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

Nếu tôi sử dụng một cổng khác ( 8000là mặc định), máy chủ web sẽ chạy tốt.

Nếu tôi chạy wget localhost:8000từ dòng lệnh, nó sẽ trả về 404 Not Found.

Tôi có thể làm gì (hoặc công cụ nào khả dụng) để tìm chương trình nào đang nghe trên cổng 8000và từ đó chương trình đó được cấu hình ở đâu?

Câu trả lời:


314

Mở terminal của bạn và gõ như

lsof -i :8000

lệnh đó sẽ liệt kê cho bạn ứng dụng được sử dụng bởi cổng đó với PID. (Nếu không có kết quả nào chạy qua sudovì bạn có thể không có quyền đối với một số quy trình nhất định.)

Ví dụ: với cổng 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)

Và cổng 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)

Mong rằng sẽ giúp.


2
Điều này cũng hoạt động trên OSX với giá trị của nó .....
thiệu lại vào

2
Việc thêm -s TCP:LISTENhạn chế kết quả vào ổ cắm nghe thực tế và quy trình của nó.
jhermann

1
Nếu bạn tìm kiếm cổng 8000 thì nó trả về PID 1889? wat
CodyBugstein

Có, có dịch vụ với PID 1889 sử dụng cổng 8881. Tôi có thiếu gì không?
rdʒɑ

1
@Imray ví dụ tìm kiếm cổng 8881. Cột PID chứa ID tiến trình và cột NAME chứa các cổng.
Freek de Bruijn

377

Bạn có thể sử dụng netstat để xem quá trình nào đang lắng nghe trên cổng nào.

Bạn có thể sử dụng lệnh này để có một chi tiết đầy đủ:

sudo netstat -peanut

nếu bạn cần biết chính xác cái nào đang nghe trên cổng 8000, bạn có thể sử dụng cái này:

sudo netstat -peanut | grep ":8000 "

Không có quá trình có thể ẩn từ netstat.


117
netstat -peanutdễ nhớ hơn netstat -taupen!
Douglas B. Staple

9
Tốt một! - Chỉ cần chỉnh sửa câu trả lời để phản ánh bình luận của bạn. Cảm ơn bạn.
Antoine Rodriguez

2
'fuser -k 8000 / tcp' để giải phóng cổng đó
Jay Modi

3
nếu trong cột "PID / Tên chương trình" bạn thấy dấu gạch ngang thay vì tên quy trình, bạn đã quên thêm "sudo"
v.shashenko

3
Vì vậy, đó là đậu phộng eh
prusswan

172

Để giải thích câu trả lời của @ 33833, bạn có thể lấy một số thông tin rất chi tiết, ví dụ:

$ 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

Tôi có thể thấy ngay đó là mực là quá trình, nhưng thực tế là tôi squid-deb-proxyđang chiếm cảng.

Một ví dụ khác về ứng dụng 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

Bạn có thể thấy trong lsof(LiSt Open Files) rằng đó là java, ít hữu ích hơn. Chạy pslệnh với PID chúng ta có thể thấy ngay đó là CrashPlan.


9
Trong một lệnh:lsof -t -i :8000 | xargs ps -fp
Brett Y

8
Tôi đã phải tiền tố sudo nhưng sau đó nó làm việc cho tôi. Cảm ơn.
Dwayne Crooks

4
lưu ý: không có sudobạn sẽ không gặp lỗi, đơn giản bạn sẽ không nhận được phản hồi.
Frank Nocke

13

Thử sstừ iproute2gói:

ss -nlp | grep 8000

5
sscũng có khả năng lọc riêng của nó : ss -nlp '( sport = :8000 )'.
GnP

6

Một cách khác sử dụng socklisttừ procinfogói:

man socklist

MÔ TẢ
socklistlà một tập lệnh Perl cung cấp cho bạn một danh sách tất cả các ổ cắm mở, liệt kê các loại, cổng, inode, uid, pid, fd và chương trình mà nó thuộc về.

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

2

Bạn có thể sử dụng nmap.

Điều thực sự quan trọng là phải biết cổng nào được mở trong PC của bạn, điều này không chỉ hữu ích cho Linux mà còn cho các hệ điều hành khác, Linux có rất nhiều công cụ để kiểm tra cổng nào đang mở, phổ biến nhất là nmap là công cụ dòng lệnh, nhưng cũng tồn tại một mặt trận đồ họa cho nó nếu bạn thích theo cách đó. 1

để cài đặt nó, chỉ cần nhấn Ctrl+ Alt+ Ttrên bàn phím để mở Terminal. Khi nó mở, chạy lệnh bên dưới:

sudo apt-get install nmap

Để biết thêm thông tin về nmap và các tiện ích khác, hãy truy cập vào đây

1 Nguồn: garron.me


nmap sẽ chỉ cho bạn biết RATNG một cổng được mở chứ không phải quá trình nào đã mở.
Andrew Burns

1
Tôi đã nhấp qua nguồn của bạn để đọc [nmap] tries to guess which service is listening on each port, but it can make mistakesngay trước khi nó gợi ý một phương pháp thực tế để tìm ra quy trình nào sở hữu ổ cắm.
GnP

@gnp Bạn cũng có thể muốn xem cái này .
Mitch

@Mitch tôi đã làm. OP cần biết chính xác PID của một quy trình trên hệ thống cục bộ. Nmap không phải là công cụ phù hợp ở đây, ngay cả với phát hiện dịch vụ và phiên bản. Hoặc nó sẽ khớp với một mục trên cơ sở dữ liệu nmaps, điều này vẫn cho phép OP trong bóng tối như quá trình giết hoặc cấu hình lại, hoặc nó sẽ không có dấu vân tay đẹp và liên kết đến insecure.org
GnP
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.