Ai đang nghe trên một cổng TCP nhất định trên Mac OS X?


1382

Trên Linux, tôi có thể sử dụng netstat -pntl | grep $PORThoặc fuser -n tcp $PORTđể tìm hiểu quá trình (PID) đang lắng nghe trên cổng TCP được chỉ định. Làm cách nào để có được thông tin tương tự trên Mac OS X?


27
Xin lỗi, netstat -p tcp | grep $PORTkhông hiển thị các PID vì netstat trên Mac OS X không thể hiển thị các PID.
pts

12
netstat -anvhiển thị cổng trên Mac OS X (nguồn: giải pháp bên dưới bởi @Sean Hamiliton)
Curtis Yallop

Câu trả lời:


2049

Trên macOS High Sierra trở lên, hãy sử dụng lệnh này:

lsof -nP -iTCP:$PORT | grep LISTEN

hoặc chỉ xem IPv4:

lsof -nP -i4TCP:$PORT | grep LISTEN

Trên các phiên bản cũ hơn, sử dụng một trong các hình thức sau:

lsof -nP -iTCP:$PORT | grep LISTEN
lsof -nP -i:$PORT | grep LISTEN

Thay thế $PORTbằng số cổng hoặc danh sách số cổng được phân tách bằng dấu phẩy.

Chuẩn bị sudo(theo sau là khoảng trắng) nếu bạn cần thông tin về các cổng bên dưới # 1024.

Các -nlá cờ là để hiển thị địa chỉ IP thay vì tên máy chủ. Điều này làm cho lệnh thực thi nhanh hơn nhiều, vì việc tra cứu DNS để lấy tên máy chủ có thể bị chậm (vài giây hoặc một phút đối với nhiều máy chủ).

Các -Plá cờ là để hiển thị số liệu cổng thay vì tên giải quyết như http, ftphoặc tên dịch vụ bí ẩn khác như dpserve, socalia.

Xem các bình luận để có thêm lựa chọn.

Để hoàn thiện, vì thường xuyên được sử dụng cùng nhau:

Để tiêu diệt PID:

kill -9 <PID>
# kill -9 60401

154
Tiền tố này sudođể xem các quá trình bạn không sở hữu.
Gordon Davisson

30
về sư tử, đã làm việc với một sự thay đổisudo lsof -i TCP:$PORT | grep LISTEN
dhaval

58
Trên Mountain Lion, bạn không cần grep:sudo lsof -iTCP:$PORT -sTCP:LISTEN
Siu Ching Pong -Asuka Kenji-

16
Sau rất nhiều tìm kiếm, cái này là tốt nhất. những người trực tiếp muốn sao chép lệnh nên thay thế $ PORT bằng số cổng thực tế hoặc xác định PORT biến và điều đó cũng cho nhiều cổng như: export PORT = 8080,4433; lsof -n -i4TCP: $ PORT
siddhusingh

2
Người ta không cần sudo nếu cổng để điều tra cao hơn 1024.
stigkj

626

Kể từ Snow Leopard (10.6), cho đến Mojave (10.14) và Catalina (10,15) , mọi phiên bản macOS đều hỗ trợ điều này:

sudo lsof -iTCP -sTCP:LISTEN -n -P

Cá nhân tôi đã kết thúc với chức năng đơn giản này trong ~/.bash_profile:

listening() {
    if [ $# -eq 0 ]; then
        sudo lsof -iTCP -sTCP:LISTEN -n -P
    elif [ $# -eq 1 ]; then
        sudo lsof -iTCP -sTCP:LISTEN -n -P | grep -i --color $1
    else
        echo "Usage: listening [pattern]"
    fi
}

Sau đó, listeninglệnh cung cấp cho bạn một danh sách các quá trình lắng nghe trên một số cổng và listening smthgreps này cho một số mẫu.

Có điều này, thật dễ dàng để hỏi về quá trình cụ thể, ví dụ listening dropbox, hoặc cổng, ví dụ listening 22.

lsoflệnh có một số tùy chọn chuyên biệt để hỏi về cổng, giao thức, quy trình, v.v. nhưng cá nhân tôi đã tìm thấy chức năng trên tiện dụng hơn nhiều, vì tôi không cần phải nhớ tất cả các tùy chọn cấp thấp này. lsoflà một công cụ khá mạnh mẽ, nhưng tiếc là không thoải mái để sử dụng.


7
Điều này đang diễn ra trong dotfiles của tôi. Tôi tìm kiếm vài tháng một lần và luôn tìm thấy câu trả lời này.
danemacmillan

1
Tôi cảm thấy điều này nên được chấp nhận câu trả lời như OP nói, anh ấy -pntlsẽ liệt kê tất cả các dịch vụ. Câu trả lời được chấp nhận yêu cầu một hoặc nhiều số cổng được chỉ định, không giống nhau.
seeafish

440

Bạn cũng có thể dùng:

sudo lsof -i -n -P | grep TCP

Điều này hoạt động trong Mavericks.


3
Các -itùy chọn làm cho nó nhanh hơn đáng kể. 0,02 giây so với 2 giây. Trong ứng dụng của tôi, điều này làm cho khá khác biệt.
Eric Boehs

những lá cờ cụ thể đó làm gì -i, -n, -P. Tôi không thể tìm thấy bất cứ nơi nào ý nghĩa chính xác của chúng
Chad Watkins

sudo lsof -i -n -P | grep TCP | grep $ PORT - Tôi đã tạo một bí danh với lệnh này
alyn000r

Tôi sẽ đề nghị thêm "| grep $ PORT" hoặc "| grep LISTEN"
KC Baltz

Tuyệt quá! Hoạt động trên Mojave.
Cá Gefilte

291

Cập nhật tháng 1 năm 2016

Thực sự ngạc nhiên không ai đề nghị:

lsof -i :PORT_NUMBER

để có được thông tin cơ bản cần thiết. Chẳng hạn, kiểm tra trên cổng 1337:

lsof -i :1337

Các biến thể khác, tùy thuộc vào hoàn cảnh:

sudo lsof -i :1337
lsof -i tcp:1337

Bạn có thể dễ dàng xây dựng dựa trên điều này để giải nén chính nó. Ví dụ:

lsof -t -i :1337

cũng tương đương (kết quả) với lệnh này:

lsof -i :1337 | awk '{ print $2; }' | head -n 2 | grep -v PID

Minh họa nhanh:

nhập mô tả hình ảnh ở đây

Để hoàn thiện, vì thường xuyên được sử dụng cùng nhau:

Để tiêu diệt PID:

kill -9 <PID>
# kill -9 60401

hoặc như một lớp lót:

kill -9 $(lsof -t -i :1337)

2
Lệnh này cũng hiển thị các bộ lọc không nghe, và các câu hỏi chỉ được hỏi rõ ràng cho người nghe.
pts

3
Bạn cũng có thể chạy lsof -t -i :1338. -tsẽ trả về id tiến trình, vì vậy bạn sẽ không phải awk / head.
KFunk

Không có gì hoạt động ngoại trừ kill -9 $(lsof -t -i :5000)el capitan
goksel

Điều đó thật tuyệt. Tôi muốn biết những gì ở đó trước khi tôi giết nó, vì vậy (dựa trên điều này) Tôi chỉ cần thêm vào bashrc của mình: whatsonport() { ps -ef | grep `lsof -t -i :$1` }vì vậy:⇒ whatsonport 3000 --> 501 14866 14865 0 6:07AM ttys006 0:01.73 node .
Sigfried

1
Cảm ơn, lsof -i :PORT_NUMBERđã làm một công việc cho tôi.
marika.daboja


48

Đối với các cổng LISTEN, THÀNH LẬP và ĐÓNG

sudo lsof -n -i -P | grep TCP

Chỉ dành cho các cổng LISTEN

sudo lsof -n -i -P | grep LISTEN

Đối với một cổng LISTEN cụ thể, ví dụ: cổng 80

sudo lsof -n -i -P | grep ':80 (LISTEN)'

Hoặc nếu bạn chỉ muốn một bản tóm tắt nhỏ gọn [không có dịch vụ / ứng dụng nào được mô tả], hãy truy cập NETSTAT. Mặt tốt ở đây là, không cần sudo

netstat -a -n | grep 'LISTEN '

Giải thích các mục được sử dụng:

-n đàn áp tên máy chủ

-i cho các giao thức IPv4 và IPv6

-P bỏ qua tên cổng

-a [trên netstat] cho tất cả các ổ cắm

-n [trên netstat] không giải quyết tên, hiển thị địa chỉ mạng dưới dạng số

Đã thử nghiệm trên High Sierra 10.13.3 và Mojave 10.14.3

  • cú pháp cuối cùng netstat cũng hoạt động trên linux

Các giải thích chi tiết thực sự rất hữu ích cho những người mới bắt đầu như tôi. cảm ơn @PYK
Tomaz Wang

46

trên OS X, bạn có thể sử dụng tùy chọn -v cho netstat để cung cấp pid liên quan.

kiểu:

netstat -anv | grep [.]PORT

đầu ra sẽ như thế này:

tcp46      0      0  *.8080                 *.*                    LISTEN      131072 131072   3105      0

PID là số trước cột cuối cùng, 3105 cho trường hợp này


Bạn cũng cần thêm grep LISTENđể hiển thị người nghe mà thôi.
pts

3
Đây là những gì tôi cần! lsofkhông thể tìm thấy cảng. nhưng netstatcho thấy nó đã mở. -vlà nước sốt bí mật tôi thiếu.
Aaron McMillin

32

Trên macOS, đây là một cách dễ dàng để có được ID tiến trình đang nghe trên một cổng cụ thể với netstat . Ví dụ này tìm kiếm một quy trình phục vụ nội dung trên cổng 80:

tìm máy chủ chạy trên cổng 80

netstat -anv | egrep -w [.]80.*LISTEN

đầu ra mẫu

tcp4  0 0  *.80       *.*    LISTEN      131072 131072    715      0

Cột thứ 2 từ cột cuối cùng là PID. Ở trên, đó là 715 .

tùy chọn

-a - hiển thị tất cả các cổng, bao gồm cả các cổng được sử dụng bởi máy chủ

-n- hiển thị số, không tìm kiếm tên. Điều này làm cho lệnh nhanh hơn rất nhiều

-v - đầu ra dài dòng, để có được ID quá trình

-w- Tìm kiếm từ. Nếu không, lệnh sẽ trả về thông tin cho các cổng 8000 và 8001, không chỉ là "80"

LISTEN - chỉ cung cấp thông tin cho các cổng ở chế độ LISTEN, tức là máy chủ


2
cờ -v đã tạo ra nó
user9869932

18

Trên phiên bản macOS mới nhất, bạn có thể sử dụng lệnh này:

lsof -nP -i4TCP:$PORT | grep LISTEN

Nếu bạn thấy khó nhớ thì có lẽ bạn nên tạo một bashhàm và xuất nó với một tên thân thiện hơn như vậy

vi ~/.bash_profile

và sau đó thêm các dòng sau vào tập tin đó và lưu nó.

function listening_on() {
    lsof -nP -i4TCP:"$1" | grep LISTEN
}

Bây giờ bạn có thể nhập listening_on 80vào Terminal của bạn và xem quá trình nào đang lắng nghe trên cổng 80.


13

Trên Snow Leopard (OS X 10.6.8), chạy 'man lsof' mang lại:

lsof -i 4 -a

(nhập thủ công thực tế là 'lsof -i 4 -a -p 1234')

Các câu trả lời trước không hoạt động trên Snow Leopard, nhưng tôi đã cố gắng sử dụng 'netstat -nlp' cho đến khi tôi thấy việc sử dụng 'lsof' trong câu trả lời của pts.


10

Tôi là một anh chàng Linux. Trong Linux, cực kỳ dễ dàng với netstat -ltpnhoặc bất kỳ sự kết hợp nào của các chữ cái đó. Nhưng trong Mac OS X netstat -an | grep LISTENlà nhân văn nhất. Những người khác rất xấu và rất khó nhớ khi xử lý sự cố.


2
Câu hỏi yêu cầu rõ ràng về một cổng TCP cụ thể và các lệnh của bạn hiển thị trình nghe trên tất cả các cổng.
pts

7
lsof -n -i | awk '{ print $1,$9; }' | sort -u

Điều này hiển thị những người đang làm gì. Xóa -n để xem tên máy chủ (chậm hơn một chút).


1
Câu trả lời của bạn không tệ, nhưng đó là một câu hỏi với một số câu trả lời được đánh giá cao và một câu trả lời được chấp nhận, từ nhiều năm trước. Trong tương lai, hãy cố gắng tập trung vào những câu hỏi gần đây hơn, đặc biệt là những câu hỏi chưa được trả lời.

Lệnh này có hiển thị cả các cổng không phải TCP và cả người không nghe không? Câu hỏi chỉ yêu cầu người nghe trên các cổng TCP.
pts

Theo trang nam lsof (8): If no address is specified, this option [-i] selects the listing of all Internet and x.25 (HP-UX) network files.
Misha Tavkhelidze

@Misha Tavkhelidze: Vì vậy, nó cũng hiển thị những người không nghe, vì vậy nó không trả lời câu hỏi.
pts

Thêm -sTCP:LISTENvàolsof
Misha Tavkhelidze

3

Điều này đã làm những gì tôi cần.

ps -eaf | grep `lsof -t -i:$PORT`

1

Tôi đã tạo một kịch bản nhỏ để xem không chỉ ai đang nghe ở đâu mà còn hiển thị các kết nối đã được thiết lập và các quốc gia nào. Hoạt động trên OSX Siera

#!/bin/bash
printf "\nchecking established connections\n\n"
for i in $(sudo lsof -i -n -P | grep TCP | grep ESTABLISHED | grep -v IPv6 | 
grep -v 127.0.0.1 | cut -d ">" -f2 | cut -d " " -f1 | cut -d ":" -f1); do
    printf "$i : " & curl freegeoip.net/xml/$i -s -S | grep CountryName | 
cut -d ">" -f2 | cut -d"<" -f1
done

printf "\ndisplaying listening ports\n\n"

sudo lsof -i -n -P | grep TCP | grep LISTEN | cut -d " " -f 1,32-35

#EOF

Sample output
checking established connections

107.178.244.155 : United States
17.188.136.186 : United States
17.252.76.19 : United States
17.252.76.19 : United States
17.188.136.186 : United States
5.45.62.118 : Netherlands
40.101.42.66 : Ireland
151.101.1.69 : United States
173.194.69.188 : United States
104.25.170.11 : United States
5.45.62.49 : Netherlands
198.252.206.25 : United States
151.101.1.69 : United States
34.198.53.220 : United States
198.252.206.25 : United States
151.101.129.69 : United States
91.225.248.133 : Ireland
216.58.212.234 : United States

displaying listening ports

mysqld TCP *:3306 (LISTEN)
com.avast TCP 127.0.0.1:12080 (LISTEN)
com.avast TCP [::1]:12080 (LISTEN)
com.avast TCP 127.0.0.1:12110 (LISTEN)
com.avast TCP [::1]:12110 (LISTEN)
com.avast TCP 127.0.0.1:12143 (LISTEN)
com.avast TCP [::1]:12143 (LISTEN)
com.avast TCP 127.0.0.1:12995 (LISTEN)
com.avast [::1]:12995 (LISTEN)
com.avast 127.0.0.1:12993 (LISTEN)
com.avast [::1]:12993 (LISTEN)
Google TCP 127.0.0.1:34013 (LISTEN)

Điều này có thể hữu ích để kiểm tra xem bạn có kết nối với phía bắc Hàn Quốc không! ;-)


0

Đây là một cách hay trên macOS High Sierra:

netstat -an |grep -i listen

Điều đó hoàn toàn đúng! Câu trả lời được chấp nhận thực sự là đúng cách ... netstat trên mac os x không hiển thị pid cho ánh xạ cổng.
tr4nc3


0

Đối với macOS, tôi sử dụng hai lệnh cùng nhau để hiển thị thông tin về các quy trình nghe trên máy và xử lý kết nối với các máy chủ từ xa. Nói cách khác, để kiểm tra các cổng nghe và các kết nối (TCP) hiện tại trên máy chủ, bạn có thể sử dụng hai lệnh sau với nhau

1. netstat -p tcp -p udp 

2. lsof -n -i4TCP -i4UDP 

Nghĩ rằng tôi sẽ thêm đầu vào của mình, hy vọng nó có thể giúp được ai đó.

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.