แอปพลิเคชันใดที่พอร์ตใช้งานอยู่ [ซ้ำกัน]


11

คำถามนี้มีคำตอบอยู่ที่นี่แล้ว:

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

ฉันต้องการรับภาพรวมว่าพอร์ตใดที่แอปพลิเคชันสร้างขึ้น

ฉันจะทำสิ่งนี้ได้อย่างไร

คำตอบ:


17

คุณสามารถใช้ได้ netstat สำหรับสิ่งนี้. ดูตัวอย่าง (ฉันโลภสำหรับ ssh ):

netstat -putan | grep ssh
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1725/sshd
tcp        0      0 1.2.3.4:45734           1.2.3.5:22              ESTABLISHED 2491/ssh
tcp6       0      0 :::22                   :::*                    LISTEN      1725/sshd

คำอธิบาย:

ฉันมักจะใช้พารามิเตอร์ -putan (เพราะมันง่ายต่อการจดจำ)

  • -p: แสดง PID ของแอปพลิเคชัน / กระบวนการ
  • -u: แสดงพอร์ต udp / การเชื่อมต่อ
  • -t: แสดงพอร์ต tcp / การเชื่อมต่อ
  • -a: แสดงทั้งซ็อกเก็ตการฟังและไม่ฟัง
  • -n: เอาต์พุตที่เป็นตัวเลข (ห้ามทำการค้นหา DNS สำหรับชื่อโฮสต์ ฯลฯ )

ในผลลัพธ์ข้างต้นคุณจะเห็นว่ามีกระบวนการ ssh daemon ( sshd ) ด้วย PID 1725 ฟังที่พอร์ต 22 บนอินเทอร์เฟซเครือข่ายทั้งหมด ( 0.0.0.0 ) นอกจากนี้ยังมีกระบวนการไคลเอนต์ ssh (PID 2491 ) เชื่อมต่อกับที่อยู่ IP 1.2.3.5 ที่หมายเลขพอร์ต 22ที่อยู่ IP ของฉันคือ 1.2.3.4 และพอร์ตภายนอกของฉันคือ 45734. คุณเห็นว่าการเชื่อมต่อได้รับการจัดตั้ง ดังนั้นฉันเข้าสู่ระบบผ่าน ssh.


การเชื่อมต่อ TCP ที่สร้างไว้แล้วบนพอร์ต 22 ไม่ได้บ่งชี้ถึงการพิสูจน์ตัวตนสำเร็จ ต้องสร้าง TCP ก่อนการพิสูจน์ตัวตนในทิศทางใดทิศทางหนึ่งสามารถเกิดขึ้นได้
Puddingfox

@Puddingfox ใช่จริงเราควรพูดว่า "ฉันเชื่อมต่อกับพอร์ตนั้น" แต่เพื่อความเข้าใจฉันพูดว่า "ฉันลงชื่อเข้าใช้" เพราะเป็นตัวอย่าง
chaos

1
ฮิฮิ... `-putan' ฉันถูกล่อลวงให้แก้ไขข้อผิดพลาดการสะกดคำเล็กน้อย)
James Mertz

เหตุใดจึงต้องใช้โปรแกรมอรรถประโยชน์ที่ล้าสมัยเมื่อมีรุ่นใหม่ ss -lntp เป็นยูทิลิตี้ที่มีให้โดย iproute2 ชุด
MariusMatutiae

7

เครื่องมืออีกอย่างที่สามารถทำได้คือ lsof:

# lsof -i -a -p 1981
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    1981 root    3u  IPv4    917      0t0  TCP host.example.com:ssh (LISTEN)
# lsof -i -a -p 1981 -n
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    1981 root    3u  IPv4    917      0t0  TCP 10.1.2.3:ssh (LISTEN)
# lsof -i -a -p 1981 -n -P
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    1981 root    3u  IPv4    917      0t0  TCP 10.1.2.3:22 (LISTEN)
#

ตัวเลือกที่ใช้มีดังนี้:

  • -i เพื่อพิมพ์พอร์ตอินเทอร์เน็ตที่เปิดโดยกระบวนการ
  • -a เพื่อทำให้ตัวเลือกทั้งหมดเป็น AND-ed
  • -p 1981 เพื่อแสดงผลลัพธ์สำหรับกระบวนการ 1981
  • -n เพื่อยับยั้งการค้นหาชื่อโฮสต์และแสดง IP แทน
  • -P เพื่อยับยั้งการค้นหาบริการและแสดงหมายเลขพอร์ตแทน

lsof มีข้อดีที่คุณสามารถระบุกระบวนการในการตรวจสอบแทนที่จะต้อง grep ออกจากผลลัพธ์ที่มีขนาดใหญ่กว่า netstat มีความน่าเชื่อถือมากขึ้นในระบบแม้ว่า lsof กำลังกลายเป็นมาตรฐานมากกว่าที่เคยเป็น


ฉันต้องการเรียกใช้คำสั่งนี้ก่อนที่จะเปิดแอปพลิเคชันที่ฉันต้องการตรวจสอบ แต่ฉันสามารถสร้างแอปพลิเคชัน pid ใดที่จะได้รับก่อนเริ่มต้น
Baz

@Baz หากคุณต้องการตรวจสอบแอปพลิเคชันในขณะที่เริ่มทำงาน (เช่นก่อนที่คุณจะรู้ว่าเป็น PID) คุณควรลอง strace ทางออกที่ @ olivecoder แนะนำ
gowenfawr


3

เรามีคำตอบที่ดีอยู่แล้ว แต่พวกเขาเท่านั้นที่แสดงรายการพอร์ตที่เปิดในขณะที่คำสั่งทำงาน

strace เป็นเครื่องมือที่เหมาะสมในการตรวจสอบการเชื่อมต่อที่เปิดระหว่างอายุการใช้งานของแอปพลิเคชัน:

strace -e socket,connect,close -f -o hipchat.strace.txt hipchat

ผลลัพธ์จะแสดงข้อมูลเพิ่มเติมเช่นคำขอ UDP และเปิด แต่ปิดการเชื่อมต่อ


0

ss -a4 | less

ฉันสมมติว่าคุณกำลังพูดเกี่ยวกับ IPv4 ... ถ้าไม่คุณสามารถแทนที่ 4 ในคำสั่งนำหน้าด้วย 6 พารามิเตอร์ -a คือแสดงพอร์ตทั้งหมด คุณสามารถเพิ่ม -n ให้กับพารามิเตอร์ได้หากคุณไม่ต้องการแก้ไขชื่อในจอแสดงผล

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