จะทราบได้อย่างไรว่าโปรแกรมใดบ้างที่รับฟังพอร์ตที่กำหนด


377

ฉันสงสัยว่าโปรแกรมกำลังฟังพอร์ต8000บนเครื่องของฉัน

เมื่อฉันเรียกใช้คำสั่งต่อไปนี้ฉันได้รับข้อผิดพลาดนี้:

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

ถ้าฉันใช้พอร์ตอื่น ( 8000เป็นค่าเริ่มต้น) เว็บเซิร์ฟเวอร์ทำงานได้ดี

ถ้าฉันวิ่งwget localhost:8000จากบรรทัดคำสั่งมันจะกลับ404 Not Foundมา

ฉันสามารถทำอะไร (หรือมีเครื่องมืออะไรบ้าง) เพื่อค้นหาโปรแกรมที่กำลังฟังบนพอร์ต8000และจากที่นั่นโปรแกรมนั้นถูกกำหนดค่าไว้ที่ใด

คำตอบ:


314

เปิดเทอร์มินัลของคุณและพิมพ์เป็น

lsof -i :8000

คำสั่งนั้นจะแสดงรายการแอปพลิเคชันที่คุณใช้โดยพอร์ตนั้นด้วย PID (หากไม่มีการเรียกใช้ผลลัพธ์sudoเนื่องจากคุณอาจไม่ได้รับอนุญาตให้ดำเนินการบางอย่าง)

ตัวอย่างเช่นด้วยพอร์ต 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)

และพอร์ต 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)

หวังว่าจะช่วย


2
สิ่งนี้ยังใช้งานได้กับ OSX สำหรับสิ่งที่คุ้มค่า .....
2014

2
การเพิ่ม-s TCP:LISTENจำกัด ผลลัพธ์ให้กับซ็อกเก็ตการฟังจริงและกระบวนการ
jhermann

1
หากคุณค้นหาพอร์ต 8000 จะส่งคืนPID 1889หรือไม่ วัด
CodyBugstein

ใช่มีบริการกับ PID 1889 ที่ใช้พอร์ต 8881 ฉันไม่มีอะไรเลยหรือ
rɑːdʒɑ

1
@ แสดงตัวอย่างค้นหาพอร์ต 8881 คอลัมน์ PID มี ID กระบวนการและคอลัมน์ NAME มีพอร์ต
Freek de Bruijn

377

คุณสามารถใช้ netstat เพื่อดูว่ากระบวนการใดกำลังรับฟังพอร์ตใด

คุณสามารถใช้คำสั่งนี้เพื่อให้รายละเอียดทั้งหมด:

sudo netstat -peanut

ถ้าคุณจำเป็นต้องรู้ว่าตัวใดที่กำลังฟังบนพอร์ต 8000 คุณสามารถใช้สิ่งนี้:

sudo netstat -peanut | grep ":8000 "

ไม่มีกระบวนการที่สามารถซ่อนได้จาก netstat


117
netstat -peanutจำง่ายกว่าnetstat -taupen!
Douglas B. Staple

9
สิ่งที่ดี ! - เพิ่งแก้ไขคำตอบเพื่อสะท้อนความคิดเห็นของคุณ ขอขอบคุณ.
แอนทอนโรดริเกซ

2
'fuser -k 8000 / tcp' เพื่อปล่อยพอร์ตนั้น
Jay Modi

3
หากอยู่ในคอลัมน์ "PID / ชื่อโปรแกรม" คุณเห็นเครื่องหมายขีดคั่นแทนชื่อกระบวนการคุณลืมเพิ่ม "sudo"
v.shashenko

3
ดังนั้นมันจึงเป็นถั่วลิสงเอ๊ะ
รัสเซีย

172

ในการอธิบายคำตอบโดย @ 33833 คุณสามารถรับข้อมูลโดยละเอียดตัวอย่างเช่น:

$ 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

ฉันเห็นได้ว่าปลาหมึกเป็นกระบวนการ แต่มันเป็นเรื่องจริงที่ฉันsquid-deb-proxyจะจับพอร์ต

อีกตัวอย่างที่ดีของแอพ 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

คุณสามารถดูได้ในlsof(LiSt Open Files) ว่าเป็นจาวาซึ่งมีประโยชน์น้อยกว่า เรียกใช้psคำสั่งด้วย PID ที่เราเห็นได้ทันทีว่าเป็น CrashPlan


9
ในคำสั่งเดียว:lsof -t -i :8000 | xargs ps -fp
เบร็ท Y

8
ฉันต้องนำหน้าsudo แต่หลังจากนั้นก็ใช้งานได้สำหรับฉัน ขอบคุณ
Dwayne Crooks

4
หมายเหตุ: หากsudoคุณไม่ได้รับข้อผิดพลาดคุณจะไม่ได้รับการตอบสนองใด ๆ
Frank Nocke

13

ลองssจากiproute2แพ็คเกจ:

ss -nlp | grep 8000

5
ssss -nlp '( sport = :8000 )'นอกจากนี้ยังมีความสามารถในการกรองของตัวเอง:
GnP

6

อีกวิธีที่ใช้socklistจากprocinfoแพ็คเกจ:

man socklist

DESCRIPTION
socklistเป็นสคริปต์ Perl ที่ให้รายการของซ็อกเก็ตที่เปิดอยู่ทั้งหมด, ประเภทการแจกแจง, พอร์ต, inode, uid, pid, fd และโปรแกรมที่เป็นของมัน

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

คุณสามารถใช้ nmap

สิ่งสำคัญคือต้องรู้ว่าพอร์ตใดที่เปิดอยู่ในพีซีของคุณซึ่งไม่เพียง แต่มีประโยชน์สำหรับ Linux เท่านั้น แต่ยังมีระบบปฏิบัติการอื่น ๆ ด้วย Linux มีเครื่องมือมากมายที่จะตรวจสอบว่าพอร์ตใดเปิดอยู่โดยทั่วไปคือ nmap ซึ่งเป็น เครื่องมือบรรทัดคำสั่ง แต่ยังมี Graphical frontEnd อยู่หากคุณต้องการวิธีนี้ 1

เพื่อติดตั้งเพียงกดCtrl+ Alt+ Tบนแป้นพิมพ์เพื่อเปิด Terminal เมื่อเปิดขึ้นให้เรียกใช้คำสั่งด้านล่าง:

sudo apt-get install nmap

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ nmap และโปรแกรมอรรถประโยชน์อื่น ๆ ไปที่นี่

1ที่มา: garron.me


nmap จะบอกคุณว่าพอร์ตเปิดอยู่เท่านั้นไม่ใช่กระบวนการที่เปิดขึ้นมา
Andrew Burns

1
ฉันคลิกไปยังแหล่งที่มาของคุณเพื่ออ่าน[nmap] tries to guess which service is listening on each port, but it can make mistakesก่อนที่มันจะแนะนำวิธีการที่แท้จริงในการค้นหากระบวนการที่เป็นเจ้าของซ็อกเก็ต
GnP

@gnp นอกจากนี้คุณยังอาจต้องการที่จะดูที่นี้
มิทช์

@ Mitch ฉันทำ OP จำเป็นต้องทราบ PID ที่แน่นอนของกระบวนการในระบบท้องถิ่น Nmap ไม่ใช่เครื่องมือที่ถูกต้องที่นี่ไม่ใช่แม้แต่กับการตรวจสอบบริการและรุ่น ไม่ว่าจะจับคู่รายการในฐานข้อมูล nmaps ซึ่งยังช่วยให้ OP ในที่มืดว่ากระบวนการใดที่จะฆ่าหรือกำหนดค่าใหม่หรือไม่และ OP จะมีลายนิ้วมือที่ดีและลิงก์ไปยัง insecure.org
GnP
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.