Liệt kê các cổng mà quá trình PID đang lắng nghe (tốt nhất là sử dụng các công cụ iproute2)?


68

Tôi đang tìm cách liệt kê tất cả các cổng mà một PID hiện đang nghe.

Làm thế nào bạn muốn giới thiệu tôi có được loại dữ liệu này về một quá trình?


Thật kỳ lạ, sskhông có bộ lọc nào trên PID ngoại trừ các socket netlink.
poige

Câu trả lời:


56

Bạn có thể sử dụng sstừ gói iproute2 (tương tự netstat):

ss -l -p -n | grep "pid=1234,"

hoặc (đối với phiên bản iproute2 cũ hơn):

ss -l -p -n | grep ",1234,"

Thay thế 1234 bằng PID của chương trình.


3
Cũng có -uhoặc chỉ -tcho udb hoặc tcp. : +1: Và tất cả những thứ này có thể được xếp chồng lên nhau như vậy : ss -tlnp, Và để loại bỏ đầu ra chiều rộng lấp đầy, điều mà tôi thấy khó chịu, bạn có thể đặt ống dù là mèo hoặc ít hơn hoặc w / e:ss -tlnp | cat
ThorSummoner

1
Tôi đã có thói quen ss -nlp | cat, đại khái là, chỉ cho tôi các quy trình nghe (-l), số cổng của họ (-n) và thông tin quy trình của họ (-p) và không cố gắng khớp đầu ra với vỏ của tôi | cat( hoặc ít hơn hoặc bất cứ điều gì). Chỉ mất hai năm để tôi quen với điều đó: D
ThorSummoner

Không làm việc cho tôi (trên Debian 9). Ở đó bạn cần grep cho ", pid = 1234,"
ofrommel

@ofrommel cảm ơn vì gợi ý - Tôi đã điều chỉnh câu trả lời.
jofel

Ngoài ra, điều này chỉ hoạt động với quyền root :)
ofrommel 30/11/18

56

Tôi không biết một cách sử dụng iproute2các công cụ. Nhưng như một cách giải quyết, bạn có thể thử cái này.

lsof -Pan -p PID -i

sẽ cung cấp cho bạn thông tin bạn đang tìm kiếm.


Đầu ra

lsof -Pan -p 27808 -i
COMMAND   PID   USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
httpd   27808 apache    5u  IPv6 112811294      0t0  TCP *:80 (LISTEN)
httpd   27808 apache    7u  IPv6 112811298      0t0  TCP *:8443 (LISTEN)
httpd   27808 apache    9u  IPv6 112811303      0t0  TCP *:443 (LISTEN)

Tôi đã nhận được lệnh này từ đây nhưng không chắc chắn về liên kết chính xác vì tôi có tất cả chúng được ghi chú trong sổ ghi chép. Nhưng bạn có thể kiểm tra từ đó là tốt.


13

Bạn có thể sử dụng netstatcho điều này để tìm ra pid của mỗi quá trình nghe.

netstat - In kết nối mạng, bảng định tuyến, thống kê giao diện, kết nối giả trang và thành viên multicast

-a, --all Hiển thị cả ổ cắm nghe và không nghe (đối với TCP, điều này có nghĩa là ổ cắm được thiết lập). Với tùy chọn --interfaces, hiển thị các giao diện không được đánh dấu

--numeric, -n Hiển thị địa chỉ số thay vì cố gắng xác định tên máy chủ, cổng hoặc tên người dùng tượng trưng.

-p, --program Hiển thị PID và tên của chương trình mà mỗi socket thuộc về.

Đây là một ví dụ:

# netstat -anp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      1507/rpcbind
tcp        0      0 0.0.0.0:51188               0.0.0.0:*                   LISTEN      1651/rpc.statd
tcp        0      0 0.0.0.0:1013                0.0.0.0:*                   LISTEN      1680/ypbind
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1975/sshd
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      1763/cupsd
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      2081/master
tcp        0      0 127.0.0.1:27017             0.0.0.0:*                   LISTEN      2119/mongod
tcp        0     48 172.16.33.73:22             172.16.127.110:51850        ESTABLISHED 25473/sshd
tcp        0      0 172.16.33.73:22             172.16.127.110:51214        ESTABLISHED 24699/sshd
tcp        0      0 :::111                      :::*                        LISTEN      1507/rpcbind
tcp        0      0 :::9200                     :::*                        LISTEN      1994/java
tcp        0      0 :::9300                     :::*                        LISTEN      1994/java
tcp        0      0 :::22                       :::*                        LISTEN      1975/sshd
tcp        0      0 ::1:631                     :::*                        LISTEN      1763/cupsd
tcp        0      0 ::1:25                      :::*                        LISTEN      2081/master
tcp        0      0 :::59162                    :::*                        LISTEN      1651/rpc.statd

1
Cảm ơn bạn mặc dù tôi đã được thông báo rằng netstatđã bị từ chối bởi các công cụ iproute2 và tôi đang tìm cách tránh nó.
ThorSummoner

12

Câu trả lời của @ jofel cho bạn thấy công cụ thích hợp để sử dụng ss, đây là phần thay thế cho các công cụ mạng khác trong iproute2.

Các lệnh không dùng nữa và tương đương iproute2 của chúng như sau:

deprecated      replacement(s)
==========      ==============
- arp           ip n (ip neighbor)
- ifconfig      ip a (ip addr), ip link, ip -s (ip -stats)
- iptunnel      ip tunnel
- iwconfig      iw
- nameif        ip link, ifrename
- netstat       ss, ip route (for netstat-r), ip -s link (for netstat -i), 
                ip maddr (for netstat-g)

- route         ip r (ip route)

Danh sách cơ bản cũng có ở đây trên Wikipedia: http://en.wikipedia.org/wiki/Iproute2 .

Người giới thiệu


1

Một phương pháp khác lsofnếu bạn không biết về PID, nhưng chỉ tên của Chương trình:

lsof -Pa -p $(pgrep [programName]) -i

không hoạt động với lsof4,89 trên Ubuntu 16.04
palik

1
Đó sẽ là trường hợp nếu chương trình đã sinh ra nhiều tiến trình. Trong trường hợp đó, bạn sẽ cần chỉ định PID cụ thể khi chạy lệnh lsof tôi đã đưa ra. pgrep <program name>sau đó chọn PID bạn cần cho lệnh trên. thay thế $(pgrep [programName])với PID #
cryptoboy

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.