Làm thế nào để biết cổng nào được lắng nghe bởi một số PID nhất định?


13

Tôi có một PID của quá trình nhất định lắng nghe một số cổng trên OS X của tôi và tôi cần biết (các) cổng nào được nghe theo quy trình này. Tôi làm nó như thế nào?

Tôi biết tôi có thể sử dụng lsofđể biết quá trình nào đang lắng nghe một số cổng, nhưng tôi cần thực hiện một thao tác nghịch đảo.

Cảm ơn bạn.

CẬP NHẬT

OS X sử dụng các tiện ích BSD, vì vậy tôi có BSD netstatchứ không phải Linux netstat. Linux netstat-ptùy chọn hiển thị PID, BSD netstatsử dụng -pđể chỉ định cổng và không có tùy chọn để hiển thị PID.


Bạn có nghĩa là bạn đang cố gắng tìm các cổng mà một quá trình đang lắng nghe? netstatcó thể làm điều này cho bạn. Bạn có thể greptrên PID nếu bạn muốn lọc đầu ra củanetstat
Centimane

cũng lsofsử dụng không phải là chỉ có một cách. bạn có thể làm một cái gì đó như lsof|grep ${PID}. cái này sẽ làm đổ tất cả mọi thứ và grepsẽ chọn các dòng có PID trong đó. Trong một trường hợp ngẫu nhiên, nó có thể liệt kê một dòng không liên quan, do số PID
trùng

@Dave, vâng, bạn theo tôi ngay. Mặc dù, như tôi có thể thấy, phiên bản BSD netstatkhông thể hiển thị các PID.
shau-kote

@MelBurslan nó không giống như một giải pháp gọn gàng. Hơn nữa, nó không nhanh - phải mất một chút thời gian trên MBP của tôi.
shau-kote

Câu trả lời:


13

Tôi đã tự mình tìm ra giải pháp bằng cách đọc sâu man lsof. (Có, RT * M vẫn giúp.) Cảm ơn @Gilles đã nhắm.

Đây là giải pháp: lsof -aPi -p 555 (555 là PID).

Giải trình:

  1. -p để chỉ định số PID;
  2. -i chỉ hiển thị các thiết bị mạng;
  3. -a đến AND hai điều kiện trên (nếu không chúng sẽ được OR);
  4. -P để hiển thị số cổng (thay vì tên cổng theo mặc định).

Ngoài ra, người ta có thể sử dụng lsof -aPi4 -p 555hoặc lsof -aPi6 -p 55chỉ cho địa chỉ IPv4 hoặc IP6.

Nếu đầu ra sẽ được phân tích cú pháp bởi một -Fntùy chọn chương trình khác có thể hữu ích. Với tùy chọn lsofnày sẽ tạo ra "đầu ra cho chương trình khác" thay vì đầu ra được định dạng đẹp. lsof -aPi4 -Fn -p 555sẽ xuất ra một cái gì đó như thế này:

p554
nlocalhost:4321

PS Tất cả đã được thử nghiệm trên OS X El Capitan của tôi, nhưng như tôi có thể thấy nó cũng hoạt động trên Linux.


6

lsofcung cấp thông tin về các tệp được mở bởi các quy trình, bao gồm các cổng mạng. Nó có sẵn trên hầu hết các hệ thống unix, bao gồm cả OSX .

Các Rosetta Stone cho Unix không liệt kê bất kỳ công cụ khác cho “quá trình trận đấu để tập tin hoặc cổng” trên OSX.

Để liệt kê các quá trình nghe trên cổng TCP, bạn có thể sử dụng

lsof -iTCP -sTCP:LISTEN

lsof -iUDPliệt kê các quy trình có ổ cắm UDP mở. lsof -iliệt kê tất cả các ổ cắm mạng mở (máy khách TCP, máy chủ TCP và các giao thức IP khác).


0

nếu bạn muốn biết cổng nào đang lắng nghe, bạn có thể sử dụng tùy chọn -p của netstat. Bạn cần phải là siêu người dùng:

$ sudo netstat -nlp | grep 80
tcp  0  0  0.0.0.0:80  0.0.0.0:*  LISTEN  125004/nginx

nếu bạn muốn biết thêm về nó hãy thử liên kết này


Đó là về GNU netstat, tôi có OS X và do đó sử dụng BSD netstat. Nó sử dụng -pđể chỉ định cổng TCP / IP, và nó không có tùy chọn để hiển thị PID.
shau-kote

0

Trên FreeBSD, bạn có thể sử dụng sockstatcho thông tin này. Tôi không chắc liệu OS X có hay không sockstat, vì tôi không có máy Mac.

Chẳng hạn, để xem tất cả các kết nối TCPv4:

sockstat -4


Alack, không có sockstatlệnh trên máy Mac của tôi. :(
shau-kote

0

Bạn có thể nối netstat với grep, awk và sed để hiển thị các cổng với các pids tương ứng của chúng trên Linux & Cygwin:

$ netstat -ano | grep LISTENING | grep -v ‘\[::\]’ | sort -n | uniq -c | awk ‘ {print $3 “\t” $6}’ | sed ‘s/.*://’

Thêm chi tiết

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.