ใครกำลังฟังพอร์ต TCP ที่ระบุบน Mac OS X


1381

บน Linux ฉันสามารถใช้netstat -pntl | grep $PORTหรือfuser -n tcp $PORTเพื่อค้นหาว่าโพรเซส (PID) ใดกำลังฟังบนพอร์ต TCP ที่ระบุ ฉันจะรับข้อมูลเดียวกันบน Mac OS X ได้อย่างไร


27
ขออภัยnetstat -p tcp | grep $PORTไม่แสดง PID เนื่องจาก netstat บน Mac OS X ไม่สามารถแสดง PID ได้
pts

12
netstat -anvแสดงพอร์ตบน Mac OS X (แหล่งที่มา: วิธีการแก้ปัญหาด้านล่างโดย @SeanHamiliton)
Curtis Yallop

คำตอบ:


2048

บน macOS High Sierra และใหม่กว่าใช้คำสั่งนี้:

lsof -nP -iTCP:$PORT | grep LISTEN

หรือเพื่อดูเฉพาะ IPv4:

lsof -nP -i4TCP:$PORT | grep LISTEN

สำหรับรุ่นเก่าใช้หนึ่งในแบบฟอร์มต่อไปนี้:

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

ทดแทน$PORTด้วยหมายเลขพอร์ตหรือรายการหมายเลขพอร์ตที่คั่นด้วยเครื่องหมายจุลภาค

เตรียมsudo(ตามด้วยช่องว่าง) หากคุณต้องการข้อมูลเกี่ยวกับพอร์ตด้านล่าง # 1024

-nธงสำหรับการแสดงที่อยู่ IP แทนชื่อโฮสต์ สิ่งนี้ทำให้คำสั่งดำเนินการเร็วขึ้นมากเนื่องจากการค้นหา DNS เพื่อให้ได้ชื่อโฮสต์อาจช้า (หลายวินาทีหรือหนึ่งนาทีสำหรับโฮสต์จำนวนมาก)

-Pธงสำหรับการแสดงหมายเลขพอร์ตดิบแทนชื่อเช่นการแก้ไขhttp, ftpหรือชื่อบริการลึกลับมากขึ้นชอบ,dpservesocalia

ดูความคิดเห็นสำหรับตัวเลือกเพิ่มเติม

เพื่อความสมบูรณ์เพราะใช้บ่อยพร้อมกัน:

ในการฆ่า PID:

kill -9 <PID>
# kill -9 60401

153
นำหน้าด้วยsudoเพื่อดูกระบวนการที่คุณไม่ได้เป็นเจ้าของ
Gordon Davisson

30
ในสิงโตทำงานกับการเปลี่ยนแปลงsudo lsof -i TCP:$PORT | grep LISTEN
dhaval

58
ใน Mountain Lion คุณไม่ต้องการgrep:sudo lsof -iTCP:$PORT -sTCP:LISTEN
Siu Ching Pong - Asuka Kenji -

16
หลังจากการค้นหาจำนวนมากสิ่งนี้ดีที่สุด ผู้ที่ต้องการคัดลอกคำสั่งโดยตรงควรแทนที่ $ PORT ด้วยหมายเลขพอร์ตจริงหรือกำหนดตัวแปร PORT และสำหรับพอร์ตหลายพอร์ตเช่น: export PORT = 8080,4433; lsof -n -i4TCP: $ PORT
siddhusingh

2
หนึ่งไม่จำเป็นต้อง sudo ถ้าพอร์ตในการตรวจสอบอยู่เหนือ 1024
stigkj

626

ตั้งแต่ Snow Leopard (10.6), สูงสุดถึง Mojave (10.14) และ Catalina (10,15) , macOS ทุกรุ่นรองรับสิ่งนี้:

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

ส่วนตัวฉันท้ายด้วยฟังก์ชันง่าย ๆ นี้ในของฉัน~/.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
}

listeningคำสั่งจากนั้นให้รายชื่อของกระบวนการที่ฟังในบางพอร์ตและlistening smthgreps นี้สำหรับรูปแบบบางอย่าง

มีนี้ก็ค่อนข้างง่ายที่จะถามเกี่ยวกับขั้นตอนโดยเฉพาะอย่างยิ่งเช่นหรือพอร์ตเช่นlistening dropboxlistening 22

lsofคำสั่งมีตัวเลือกพิเศษสำหรับถามเกี่ยวกับพอร์ต, โพรโทคอล, โพรเซส ฯลฯ แต่โดยส่วนตัวแล้วฉันพบฟังก์ชั่นด้านบนมีประโยชน์มากกว่าเพราะฉันไม่จำเป็นต้องจำตัวเลือกระดับต่ำทั้งหมดเหล่านี้ lsofเป็นเครื่องมือที่ทรงพลัง แต่น่าเสียดายที่ไม่สะดวกสบายในการใช้งาน


7
สิ่งนี้เกิดขึ้นในดอทฟิลของฉัน ฉันค้นหาทุก ๆ สองสามเดือนและตอบคำถามนี้เสมอ
danemacmillan

1
ฉันรู้สึกว่าคำตอบนี้ควรได้รับการยอมรับอย่างที่ OP บอกว่าเขาทำ-pntlซึ่งจะแสดงรายการบริการทั้งหมด คำตอบที่ยอมรับจะขอให้ระบุหมายเลขพอร์ตหนึ่งพอร์ตหรือมากกว่านั้นซึ่งไม่เหมือนกันจากระยะไกล
seeafish

440

คุณยังสามารถใช้:

sudo lsof -i -n -P | grep TCP

งานนี้ใน Mavericks


3
-iตัวเลือกที่จะทำให้มันเร็วขึ้นอย่างมีนัยสำคัญ 0.02 วินาทีกับ 2 วินาที ในใบสมัครของฉันสิ่งนี้สร้างความแตกต่างอย่างมาก
Eric Boehs

ค่าสถานะเฉพาะเหล่านั้นทำอะไร -i, -n, -P ฉันไม่สามารถหาที่ใดที่พวกเขาหมายถึงอย่างแน่นอน
Chad Watkins

sudo lsof -i -n -P | grep TCP | grep $ PORT - ฉันสร้างนามแฝงด้วยคำสั่งนี้
alyn000r

ฉันขอแนะนำให้เพิ่ม "| grep $ PORT" หรือ "| grep LISTEN"
KC Baltz

ที่ดี! ยังใช้งานได้กับซ้อม
Gefilte Fish

291

อัปเดตมกราคม 2559

แปลกใจจริงๆไม่มีใครแนะนำ:

lsof -i :PORT_NUMBER

เพื่อรับข้อมูลพื้นฐานที่จำเป็น ตัวอย่างเช่นการตรวจสอบพอร์ต 1337:

lsof -i :1337

รูปแบบอื่น ๆ ขึ้นอยู่กับสถานการณ์:

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

คุณสามารถสร้างสิ่งนี้เพื่อดึง PID เองได้อย่างง่ายดาย ตัวอย่างเช่น:

lsof -t -i :1337

ซึ่งเทียบเท่า (ในผลลัพธ์) ของคำสั่งนี้:

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

ภาพประกอบด่วน:

ป้อนคำอธิบายรูปภาพที่นี่

เพื่อความสมบูรณ์เพราะใช้บ่อยพร้อมกัน:

ในการฆ่า PID:

kill -9 <PID>
# kill -9 60401

หรือเป็นหนึ่งซับ:

kill -9 $(lsof -t -i :1337)

2
คำสั่งนี้ยังแสดง PID ที่ไม่ใช่ผู้ฟังและคำถามที่ถามอย่างชัดเจนสำหรับผู้ฟังเท่านั้น
pts

3
lsof -t -i :1338นอกจากนี้คุณยังสามารถเรียกใช้ -tจะส่งคืนรหัสกระบวนการดังนั้นคุณจะไม่ต้อง awk / head
KFunk

ไม่มีอะไรทำงานยกเว้นkill -9 $(lsof -t -i :5000)เมื่อ el capitan
goksel

มันเยี่ยมมาก ฉันชอบที่จะรู้ว่ามีอะไรก่อนที่ฉันจะฆ่ามันดังนั้น (ตามนี้) ฉันเพิ่งเพิ่ม bashrc ของฉัน: whatsonport() { ps -ef | grep `lsof -t -i :$1` }ดังนั้น:⇒ whatsonport 3000 --> 501 14866 14865 0 6:07AM ttys006 0:01.73 node .
Sigfried

1
ขอบคุณlsof -i :PORT_NUMBERทำงานให้ฉัน
marika.daboja


48

สำหรับพอร์ต LISTEN, ESTABLISHED และ CLOSED

sudo lsof -n -i -P | grep TCP

สำหรับพอร์ต LISTEN เท่านั้น

sudo lsof -n -i -P | grep LISTEN

สำหรับพอร์ต LISTEN เฉพาะเช่น: พอร์ต 80

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

หรือถ้าคุณต้องการสรุปย่อ [ไม่อธิบายบริการ / แอพ] ให้ไปที่ NETSTAT ด้านที่ดีที่นี่คือไม่จำเป็นต้อง sudo

netstat -a -n | grep 'LISTEN '

อธิบายรายการที่ใช้:

-nระงับชื่อโฮสต์

-iสำหรับโปรโตคอล IPv4 และ IPv6

-Pละเว้นชื่อพอร์ต

- [over netstat] สำหรับซ็อกเก็ตทั้งหมด

-n [over netstat] ไม่แก้ไขชื่อแสดงที่อยู่เครือข่ายเป็นตัวเลข

ทดสอบกับHigh Sierra 10.13.3 และMojave 10.14.3

  • ไวยากรณ์ล่าสุดnetstatทำงานบน linux ด้วย

คำอธิบายรายละเอียดมีประโยชน์มากสำหรับผู้เริ่มต้นอย่างฉัน ขอบคุณ @PYK
Tomaz Wang

46

บน OS X คุณสามารถใช้ตัวเลือก -v สำหรับ netstat เพื่อให้ pid ที่เกี่ยวข้อง

พิมพ์:

netstat -anv | grep [.]PORT

ผลลัพธ์จะเป็นดังนี้:

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

PID คือหมายเลขก่อนคอลัมน์สุดท้าย 3105 สำหรับกรณีนี้


คุณต้องเพิ่มgrep LISTENเพื่อแสดงผู้ฟังเท่านั้น
pts

3
นี่คือสิ่งที่ฉันต้องการ! lsofไม่พบพอร์ต แต่netstatแสดงว่ามันเปิดอยู่ -vเป็นซอสลับที่ฉันขาด
Aaron McMillin

32

บน MacOS นี่เป็นวิธีที่ง่ายที่จะได้รับกระบวนการ ID ที่ฟังบนพอร์ตเฉพาะที่มีnetstat ตัวอย่างนี้ค้นหากระบวนการที่ให้บริการเนื้อหาบนพอร์ต 80:

ค้นหาเซิร์ฟเวอร์ที่ทำงานบนพอร์ต 80

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

ตัวอย่างผลลัพธ์

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

ที่สองจากคอลัมน์สุดท้ายคือ PID ในข้างต้นก็เป็น715

ตัวเลือก

-a - แสดงพอร์ตทั้งหมดรวมถึงพอร์ตที่ใช้โดยเซิร์ฟเวอร์

-n- แสดงหมายเลขไม่ต้องค้นหาชื่อ ทำให้คำสั่งเร็วขึ้นมาก

-v - เอาต์พุต verbose เพื่อรับ ID กระบวนการ

-w- คำค้นหา มิฉะนั้นคำสั่งจะส่งคืนข้อมูลสำหรับพอร์ต 8000 และ 8001 ไม่ใช่แค่ "80"

LISTEN - ให้ข้อมูลสำหรับพอร์ตในโหมด LISTEN เท่านั้นเช่นเซิร์ฟเวอร์


2
แฟ
ล็ก

18

ในเวอร์ชัน macOS ล่าสุดคุณสามารถใช้คำสั่งนี้:

lsof -nP -i4TCP:$PORT | grep LISTEN

หากคุณพบว่ามันยากที่จะจำได้บางทีคุณควรสร้างbashฟังก์ชั่นและส่งออกด้วยชื่อที่เป็นมิตรกว่านี้

vi ~/.bash_profile

จากนั้นเพิ่มบรรทัดต่อไปนี้ลงในไฟล์นั้นและบันทึก

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

ตอนนี้คุณสามารถพิมพ์listening_on 80ใน terminal 80ของคุณและดูกระบวนการที่ฟังพอร์ต


13

บน Snow Leopard (OS X 10.6.8) ให้เรียกใช้อัตราผลตอบแทน 'man lsof':

lsof -i 4 -a

(รายการคู่มือจริงคือ 'lsof -i 4 -a -p 1234')

คำตอบก่อนหน้านี้ใช้ไม่ได้กับ Snow Leopard แต่ฉันพยายามใช้ 'netstat -nlp' จนกระทั่งฉันเห็นการใช้ 'lsof' ในคำตอบโดย pts


10

ฉันเป็นผู้ชาย Linux ในลินุกซ์มันง่ายมากnetstat -ltpnๆ กับตัวอักษรเหล่านั้น แต่ใน Mac OS X netstat -an | grep LISTENนั้นมีมนุษยธรรมมากที่สุด คนอื่น ๆ น่าเกลียดมากและจำยากมากเมื่อแก้ไขปัญหา


2
คำถามที่ถามอย่างชัดเจนสำหรับพอร์ต TCP ที่เฉพาะเจาะจงและคำสั่งของคุณแสดงฟังในพอร์ตทั้งหมด
pts

7
lsof -n -i | awk '{ print $1,$9; }' | sort -u

สิ่งนี้แสดงว่าใครกำลังทำอะไรอยู่ ลบ -n เพื่อดูชื่อโฮสต์ (ช้าลงเล็กน้อย)


1
คำตอบของคุณไม่เลว แต่เป็นคำถามที่มีคำตอบที่ได้รับการโหวตสูงมากและเป็นคำตอบที่ได้รับการยอมรับเมื่อหลายปีก่อน ในอนาคตพยายามเน้นคำถามล่าสุดโดยเฉพาะคำถามที่ยังไม่ได้รับคำตอบ

คำสั่งนี้แสดงพอร์ตที่ไม่ใช่ TCP เช่นกันและไม่ฟังเช่นกันหรือไม่ คำถามนี้ถามผู้ฟังบนพอร์ต TCP เท่านั้น
pts

ตาม 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: ดังนั้นมันจึงแสดงผู้ฟังที่ไม่ใช่เช่นกันดังนั้นจึงไม่ตอบคำถาม
pts

เพิ่ม-sTCP:LISTENเข้าlsof
Misha Tavkhelidze


1

ฉันสร้างสคริปต์เล็ก ๆ เพื่อดูว่าใครกำลังฟังอยู่ที่ไหน แต่ยังแสดงการเชื่อมต่อที่สร้างไว้แล้วและประเทศใดด้วย ทำงานบน 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)

สิ่งนี้อาจเป็นประโยชน์ในการตรวจสอบว่าคุณเชื่อมต่อกับเกาหลีเหนือหรือไม่! ;-)


0

นี่เป็นวิธีที่ดีใน macOS High Sierra:

netstat -an |grep -i listen

ถูกต้องแล้ว! คำตอบที่ได้รับการยอมรับเป็นวิธีที่ถูกต้อง ... netstat บน mac os x ไม่แสดง pid to port mapping
tr4nc3


0

สำหรับ macOS ฉันใช้สองคำสั่งร่วมกันเพื่อแสดงข้อมูลเกี่ยวกับกระบวนการฟังบนเครื่องและกระบวนการเชื่อมต่อกับเซิร์ฟเวอร์ระยะไกล กล่าวอีกนัยหนึ่งคือการตรวจสอบพอร์ตการฟังและการเชื่อมต่อปัจจุบัน (TCP) บนโฮสต์คุณสามารถใช้คำสั่งสองคำสั่งต่อไปนี้พร้อมกันได้

1. netstat -p tcp -p udp 

2. lsof -n -i4TCP -i4UDP 

คิดว่าฉันจะเพิ่มการป้อนข้อมูลของฉันหวังว่ามันจะช่วยคนได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.