Xác định quá trình nào được ràng buộc với một cổng


90

Tôi biết rằng sử dụng lệnh:

lsof -i TCP 

(hoặc một số biến thể của tham số với lsof) Tôi có thể xác định quá trình nào được ràng buộc với một cổng cụ thể. Điều này rất hữu ích nếu tôi đang cố gắng bắt đầu một cái gì đó muốn liên kết với 8080 và một số người khác đã sử dụng cổng đó, nhưng tôi không biết gì.

Có một cách dễ dàng để làm điều này mà không cần sử dụng lsof? Tôi dành thời gian làm việc trên nhiều hệ thống và lsof thường không được cài đặt.

Câu trả lời:


112

netstat -lnpsẽ liệt kê tên pid và process process bên cạnh mỗi cổng nghe. Điều này sẽ hoạt động trong Linux, nhưng không phải tất cả những người khác (như AIX.) Thêm -tnếu bạn chỉ muốn TCP.

# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:24800           0.0.0.0:*               LISTEN      27899/synergys
tcp        0      0 0.0.0.0:8000            0.0.0.0:*               LISTEN      3361/python
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      2264/mysqld
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      22964/apache2
tcp        0      0 192.168.99.1:53         0.0.0.0:*               LISTEN      3389/named
tcp        0      0 192.168.88.1:53         0.0.0.0:*               LISTEN      3389/named

Vân vân.


Tuyệt thật, cảm ơn nhé. Có vẻ như nó hoạt động theo RHEL, nhưng không phải dưới Solaris (như bạn đã chỉ ra). Bất cứ ai cũng biết nếu có một cái gì đó tương tự cho Solaris?

netstat -pở trên là phiếu bầu của tôi cũng nhìn vào lsof.
Rich Homolka

Bên cạnh, đối với các cửa sổ, nó tương tự: netstat -aon | nhiều hơn
Jonathan

Còn đối với SCTP thì sao?
sudo

12

Trên AIX, netstat & rmsock có thể được sử dụng để xác định ràng buộc quy trình:

[root@aix] netstat -Ana|grep LISTEN|grep 80
f100070000280bb0 tcp4       0      0  *.37               *.*        LISTEN
f1000700025de3b0 tcp        0      0  *.80               *.*        LISTEN
f1000700002803b0 tcp4       0      0  *.111              *.*        LISTEN
f1000700021b33b0 tcp4       0      0  127.0.0.1.32780    *.*        LISTEN

# Port 80 maps to f1000700025de3b0 above, so we type:
[root@aix] rmsock f1000700025de3b0 tcpcb
The socket 0x25de008 is being held by process 499790 (java).

1
Cảm ơn vì điều đó! Tuy nhiên, có cách nào để chỉ hiển thị quá trình lắng nghe trên ổ cắm (thay vì sử dụng rmsock để loại bỏ nó)?
Olivier Dulac

2
@OlivierDulac: "Không giống như tên gọi của nó, rmsock không loại bỏ ổ cắm, nếu nó đang được sử dụng bởi một quy trình. Nó chỉ báo cáo quá trình giữ ổ cắm." ( ibm.com/developerworks/community/bloss/cgaix/entry/ triệt )
Vitor Py

@ vitor-braga: Ah thx! Tôi nghĩ rằng nó đã cố gắng nhưng chỉ nói quá trình nào sẽ xảy ra khi không thể loại bỏ nó. Rõ ràng nó thậm chí không cố gắng loại bỏ nó khi một quá trình giữ nó. Thật tuyệt! Cám ơn!
Olivier Dulac

8

Một công cụ khác có sẵn trên Linux là ss . Từ trang người đàn ông ss trên Fedora:

NAME
       ss - another utility to investigate sockets
SYNOPSIS
       ss [options] [ FILTER ]
DESCRIPTION
       ss is used to dump socket statistics. It allows showing information 
       similar to netstat. It can display more TCP and state informations  
       than other tools.

Ví dụ đầu ra bên dưới - cột cuối cùng hiển thị ràng buộc quy trình:

[root@box] ss -ap
State      Recv-Q Send-Q      Local Address:Port          Peer Address:Port
LISTEN     0      128                    :::http                    :::*        users:(("httpd",20891,4),("httpd",20894,4),("httpd",20895,4),("httpd",20896,4)
LISTEN     0      128             127.0.0.1:munin                    *:*        users:(("munin-node",1278,5))
LISTEN     0      128                    :::ssh                     :::*        users:(("sshd",1175,4))
LISTEN     0      128                     *:ssh                      *:*        users:(("sshd",1175,3))
LISTEN     0      10              127.0.0.1:smtp                     *:*        users:(("sendmail",1199,4))
LISTEN     0      128             127.0.0.1:x11-ssh-offset                  *:*        users:(("sshd",25734,8))
LISTEN     0      128                   ::1:x11-ssh-offset                 :::*        users:(("sshd",25734,7))

3

Đối với Solaris, bạn có thể sử dụng pfiles và sau đó grep bằng sockname:hoặc port:.

Một mẫu (từ đây ):

pfiles `ptree | awk '{print $1}'` | egrep '^[0-9]|port:'

2

Tôi đã từng phải đối mặt với việc cố gắng xác định quá trình nào đằng sau một cổng cụ thể (lần này là 8000). Tôi đã thử nhiều loại lsof và netstat, nhưng sau đó đã có cơ hội và thử nhấn cổng thông qua trình duyệt (ví dụ : http: // hostname: 8000 / ). Thật đáng ngạc nhiên, một màn hình giật gân chào đón tôi, và rõ ràng quá trình này là gì (đối với hồ sơ, đó là Splunk ).

Thêm một suy nghĩ: "ps -e -o pid, args" (YMMV) đôi khi có thể hiển thị số cổng trong danh sách đối số. Grep là bạn của bạn!


Trong cùng một hướng, bạn có thể telnet hostname 8000và xem nếu máy chủ in một biểu ngữ. Tuy nhiên, điều đó chủ yếu hữu ích khi máy chủ đang chạy trên một máy mà bạn không có quyền truy cập shell, và sau đó việc tìm ID tiến trình không liên quan.
Gilles
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.