ฉันจะแสดงรายการพอร์ตเครือข่ายเปิดของฉันด้วย netstat ได้อย่างไร


205

ฉันต้องการแสดงรายการพอร์ตเครือข่ายเปิดของฉันใน Terminal ด้วยคำสั่งในตัว อย่างที่ฉันรู้netstatคือคำสั่งที่ใช้ แต่ฉันพยายามดิ้นรนเพื่อให้ได้ข้อมูลที่เป็นประโยชน์ออกมา

ฉันจะแสดงรายการพอร์ตที่เปิดอยู่ได้netstatอย่างไร มีค่าสถานะเฉพาะใดบ้างที่ช่วยฉันในกรณีนี้

คำตอบ:


308
netstat -ap tcp | grep -i "listen"

Achive Internet connections (including servers)
Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)   
tcp4       0      0  localhost.25035        *.*                    LISTEN
sudo lsof -PiTCP -sTCP:LISTEN

COMMAND     PID      USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
GitHub      850 grgarside   6u   IPv4 0x23c345381d089301      0t0  TCP localhost:25035 (LISTEN)

2
ขอบคุณ! อย่างไรก็ตามเอาต์พุตค่อนข้างอ่านยาก แต่lsofก็ค่อนข้างดีกว่าขอบคุณ
Jonas

12
sudo lsof ...คุณจำเป็นต้องใช้ หากไม่มี sudo lsof จะเห็นเฉพาะกระบวนการที่คุณเป็นเจ้าของเท่านั้นดังนั้นจะไม่แสดงพอร์ตใด ๆ ที่เปิดโดยกระบวนการของระบบ นอกจากนี้คุณยังสามารถข้ามคำสั่ง grep ได้ด้วยการบอก lsof ว่าคุณต้องการเห็นพอร์ตในสถานะ LISTEN ด้วยsudo lsof -PiTCP -sTCP:LISTENเท่านั้น
Gordon Davisson

1
→ grgarside: ระวังผลกระทบจากgrep -i "listen"ภายใน 2 ตัวอย่าง
แดน

1
ด้วย GNU netstatคุณสามารถเลือกรายการ pid ของกระบวนการที่เปิดแต่ละพอร์ต มีวิธีใดบ้างที่จะทำให้เกิดพฤติกรรมดังกล่าวกับ BSD netstatเช่นกัน?
คริส

2
ฉันเพิ่งทำไป-vปรากฎว่าธงเปิดอยู่ pid จะอยู่ในคอลัมน์ที่สองถึงครั้งสุดท้าย
คริส

64

บางทีคุณสามารถใช้ lsof:

lsof -Pn -i4

-i4 หมายถึงแสดงเฉพาะที่อยู่ ipv4 และพอร์ต -P และ -n การส่งออกอย่างรวดเร็ว

เอาท์พุทแบบนี้

  lsof -Pn -i4 | grep LISTEN
QQPlatfor 22767 xxxx   15u  IPv4 0x36c2bfa04e49385d      0t0  TCP *:49969 (LISTEN)
GoAgentX  33377 xxxx    4u  IPv4 0x36c2bfa06e68b12d      0t0  TCP *:56154 (LISTEN)
GoAgentX  33377 xxxx   20u  IPv4 0x36c2bfa04e492f8d      0t0  TCP 127.0.0.1:56155 (LISTEN)

2
คำสั่งนี้ทำอะไร
nohillside

3
lsofแสดงรายการไฟล์ที่เปิด ซ็อกเก็ตเครือข่ายนับเป็นไฟล์เพื่อให้แต่ละซ็อกเก็ตเครือข่ายเปิด (ทั้งการฟังหรืออย่างแข็งขันในการใช้งาน) lsofจะได้รับการระบุไว้ใน
Craig Trader

มันยังแสดงรหัสกระบวนการ (netstat ไม่)
lib

1
lsof -Pn -i6สำหรับ IPV6
Jared Burrows

2
อย่างน้อยหนึ่งเครื่องของฉันคำตอบนี้ใช้เวลา 0.1 วินาทีในขณะที่ @ grgarside คือ 28+ วินาที ความแตกต่างคือ-i4สวิตช์เพื่อดูที่อยู่ IPv4 เท่านั้น
Davor Cubranic เมื่อ

8

วิธีที่ง่ายที่สุดคือการใช้netstat:

$ netstat -ap tcp
Active Internet connections (including servers)
Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)    
tcp4       0      0  10.0.2.23.58792        17.172.233.109.5223    ESTABLISHED
tcp4      87      0  my_iMac__at_home.55481 stackoverflow.co.http  ESTABLISHED
tcp4     116      0  my_iMac__at_home.55478 stackoverflow.co.http  ESTABLISHED
tcp4      58      0  my_iMac__at_home.63452 stackoverflow.co.http  ESTABLISHED
tcp4      87      0  my_iMac__at_home.63429 stackoverflow.co.http  ESTABLISHED
tcp4       0      0  localhost.63173        localhost.773          ESTABLISHED
tcp4       0      0  localhost.773          localhost.63173        ESTABLISHED
tcp4       0      0  localhost.63173        *.*                    LISTEN     
tcp4       0      0  localhost.63172        *.*                    LISTEN     
tcp4       0      0  localhost.ipp          *.*                    LISTEN     
tcp6       0      0  localhost.ipp          *.*                    LISTEN     

... โดยไม่ต้องเพิ่มการกรองใด ๆ เพื่อให้ได้รับส่วนหัวที่ถูกต้องและเพื่อดูเซิร์ฟเวอร์ทั้งสองฟังและการเชื่อมต่อที่จัดตั้งขึ้นแล้วในทั้งสองทิศทาง ในตัวอย่างนี้บรรทัดที่ 1 แสดงการเชื่อมโยงจาก Mac ของฉันไปทาง 17.172.233.109ซึ่งอีก:

whois 17.172.233.109

สอนฉันมันตั้งอยู่ที่แอปเปิ้ล


6

ก่อนอื่นฉันไม่ใช่ผู้เชี่ยวชาญ BSD แต่อย่าง OP ฉันต้องการคร่าวๆของการเรียกใช้สิ่งต่อไปนี้ในกล่อง * nix หรือใกล้เคียง:

netstat -tulpn

ฉันอ่านคำถาม / คำตอบอื่น ๆ ที่เสนอ lsof * และ netstat * บน MacOS และฉันยังต้องการบางสิ่งที่มีขนาดกะทัดรัดยิ่งขึ้น ดังนั้นนี่คือสิ่งที่ฉันรวบรวมไว้อย่างรวดเร็ว:

netstat -Watnlv | grep LISTEN | awk '{"ps -o comm= -p " $9 | getline procname;colred="\033[01;31m";colclr="\033[0m"; print cred "proto: " colclr $1 colred " | addr.port: " colclr $4 colred " | pid: " colclr $9 colred " | name: " colclr procname;  }' | column -t -s "|"

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

macnst (){
    netstat -Watnlv | grep LISTEN | awk '{"ps -o comm= -p " $9 | getline procname;colred="\033[01;31m";colclr="\033[0m"; print colred "proto: " colclr $1 colred " | addr.port: " colclr $4 colred " | pid: " colclr $9 colred " | name: " colclr procname;  }' | column -t -s "|"
}

ฉันมีฟังก์ชันอำนวยความสะดวกเล็ก ๆ เหล่านี้ในไฟล์ที่ฉันมาจาก ~ / .bash_profile หรือ ~ / .zshrc กำลังเพิ่มลงในคอลเล็กชัน มันน่าสนใจที่จะเห็นโอกาสอื่น ๆ ที่จะทำให้ nicer / slimmer นี้ดีขึ้น

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

> macns
proto: tcp4     addr.port: 127.0.0.1.9999     pid: 70078    name:  /Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/bin/java
proto: tcp46    addr.port: *.35729            pid: 70078    name:  /Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/bin/java
proto: tcp46    addr.port: *.62087            pid: 70078    name:  /Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/bin/java
proto: tcp46    addr.port: *.62070            pid: 70078    name:  /Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/bin/java
proto: tcp46    addr.port: *.62085            pid: 70078    name:  /Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/bin/java
proto: tcp4     addr.port: *.61993            pid: 70043    name:  /Applications/IntelliJ IDEA.app/Contents/MacOS/idea
proto: tcp46    addr.port: *.61992            pid: 70065    name:  /Applications/IntelliJ IDEA.app/Contents/jdk/Contents/Home/jre/bin/java
proto: tcp4     addr.port: 127.0.0.1.42329    pid: 70065    name:  /Applications/IntelliJ IDEA.app/Contents/jdk/Contents/Home/jre/bin/java
proto: tcp4     addr.port: 127.0.0.1.61983    pid: 70043    name:  /Applications/IntelliJ IDEA.app/Contents/jdk/Contents/Home/jre/bin/java
proto: tcp4     addr.port: 127.0.0.1.63342    pid: 70043    name:  /Applications/IntelliJ IDEA.app/Contents/jdk/Contents/Home/jre/bin/java
proto: tcp4     addr.port: 127.0.0.1.6942     pid: 70043    name:  /Applications/IntelliJ IDEA.app/Contents/jdk/Contents/Home/jre/bin/java
proto: tcp4     addr.port: 127.0.0.1.3075     pid: 67931    name:  /Applications/electerm.app/Contents/Frameworks/electerm Helper.app/Contents/MacOS/electerm Helper
proto: tcp6     addr.port: *.58640            pid: 320      name:  /usr/libexec/rapportd
proto: tcp4     addr.port: *.58640            pid: 320      name:  /usr/libexec/rapportd
proto: tcp4     addr.port: 127.0.0.1.9770     pid: 71       name:  /Applications/Pritunl.app/Contents/Resources/pritunl-service

กรุณาอย่าโพสต์ gif ของบอทเทอร์มินัลวางข้อความที่นี่ในรูปแบบเป็นรหัส มันเป็นเรื่องยากที่จะคัดลอกและต้องอ่านถ้าคุณต้องการแบบอักษรขนาดใหญ่
Mark

รูปภาพไม่ใช่ gif เป็นเพียงหน้าจอที่แสดงผลลัพธ์ หากคุณคลิกผ่านคุณจะเห็นว่าเป็น PNG โฮสต์บน imgur .. แต่นั่นเป็นสิ่งที่ฉันคาดเดาจาก StackExchange อย่างไรก็ตามหากคุณกำลังมองหาภาพหน้าจอที่แตกต่างกันฉันสามารถคว้าอีกครั้ง
kroolk

ตกลงในความคิดเห็นของฉันแทนที่ GIF โดยภาพหน้าจอมันไม่สำคัญว่ารูปแบบใด ประเด็นคือควรเป็นข้อความ
Mark

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