Siapa yang mendengarkan pada port TCP yang diberikan pada Mac OS X?

1382

Di Linux, saya dapat menggunakan netstat -pntl | grep $PORTatau fuser -n tcp $PORTuntuk mengetahui proses (PID) mana yang mendengarkan pada port TCP yang ditentukan. Bagaimana saya mendapatkan informasi yang sama di Mac OS X?

Poin
sumber
27
Maaf, netstat -p tcp | grep $PORTtidak menampilkan PID karena netstat di Mac OS X tidak dapat menampilkan PID.
Poin
12
netstat -anvmenampilkan port pada Mac OS X (sumber: solusi di bawah ini oleh @SeanHamiliton)
Curtis Yallop

Jawaban:

2049

Di macOS High Sierra dan yang lebih baru, gunakan perintah ini:

lsof -nP -iTCP:$PORT | grep LISTEN

atau hanya melihat IPv4 saja:

lsof -nP -i4TCP:$PORT | grep LISTEN

Pada versi yang lebih lama, gunakan salah satu dari formulir berikut:

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

Pengganti $PORTdengan nomor port atau daftar nomor port yang dipisahkan koma.

Prepend sudo(diikuti oleh spasi) jika Anda memerlukan informasi tentang port di bawah # 1024.

The -nbendera untuk menampilkan alamat IP bukan nama host. Ini membuat perintah mengeksekusi lebih cepat, karena pencarian DNS untuk mendapatkan nama host bisa lambat (beberapa detik atau satu menit untuk banyak host).

The -Pbendera untuk menampilkan nomor baku pelabuhan bukan nama diselesaikan seperti http, ftpatau nama layanan yang lebih esoteris seperti dpserve, socalia.

Lihat komentar untuk opsi lainnya.

Untuk kelengkapan, karena sering digunakan bersama:

Untuk membunuh PID:

kill -9 <PID>
# kill -9 60401
Poin
sumber
154
Awali ini dengan sudountuk melihat proses yang tidak Anda miliki.
Gordon Davisson
30
pada singa, bekerja dengan perubahansudo lsof -i TCP:$PORT | grep LISTEN
dhaval
58
Di Mountain Lion, Anda tidak perlu grep:sudo lsof -iTCP:$PORT -sTCP:LISTEN
Siu Ching Pong -Asuka Kenji-
16
setelah begitu banyak pencarian yang satu ini adalah yang terbaik. orang yang secara langsung ingin menyalin perintah harus mengganti $ PORT dengan nomor port aktual atau menentukan variabel PORT dan itu juga untuk beberapa port seperti: export PORT = 8080.44433; lsof -n -i4TCP: $ PORT
siddhusingh
2
Seseorang tidak perlu sudo jika port untuk menyelidiki berada di atas 1024.
stigkj
626

Sejak Snow Leopard (10.6), hingga Mojave (10.14) dan Catalina (10.15) , setiap versi macOS mendukung ini:

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

Secara pribadi saya telah berakhir dengan fungsi sederhana ini di ~/.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
}

Kemudian listeningperintah memberi Anda daftar proses mendengarkan pada beberapa port dan listening smthmemahami ini untuk beberapa pola.

Setelah ini, cukup mudah untuk bertanya tentang proses tertentu, misalnya listening dropbox, atau port, misalnya listening 22.

lsofperintah memiliki beberapa opsi khusus untuk bertanya tentang port, protokol, proses dll. tetapi secara pribadi saya telah menemukan fungsi di atas jauh lebih berguna, karena saya tidak perlu mengingat semua opsi tingkat rendah ini. lsofalat yang cukup kuat, tapi sayangnya tidak begitu nyaman untuk digunakan.

Michał Kalinowski
sumber
7
Ini terjadi di dotfiles saya. Saya mencari setiap beberapa bulan dan selalu menemukan jawaban ini.
danemacmillan
1
Saya merasa ini harus diterima sebagai jawaban OP mengatakan dia -pntl, yang akan mencantumkan semua layanan. Jawaban yang diterima meminta satu atau lebih nomor port yang akan ditentukan, yang tidak jauh sama.
seeafish
440

Anda juga bisa menggunakan:

sudo lsof -i -n -P | grep TCP

Ini bekerja di Mavericks.

Rog182
sumber
3
The -ipilihan membuatnya secara signifikan lebih cepat. 0,02 detik vs 2 detik. Dalam aplikasi saya ini membuat perbedaan.
Eric Boehs
apa yang dilakukan flag-flag spesifik itu -i, -n, -P. Saya tidak dapat menemukan di mana pun maksudnya
Chad Watkins
sudo lsof -i -n -P | grep TCP | grep $ PORT - Saya membuat alias dengan perintah ini
alyn000r
Saya sarankan menambahkan "| grep $ PORT" atau "| grep LISTEN"
KC Baltz
Bagus! Bekerja juga di Mojave.
Ikan Gefilte
291

Perbarui Januari 2016

Benar-benar terkejut tidak ada yang menyarankan:

lsof -i :PORT_NUMBER

untuk mendapatkan informasi dasar yang dibutuhkan. Misalnya, memeriksa port 1337:

lsof -i :1337

Variasi lain, tergantung pada keadaan:

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

Anda dapat dengan mudah membangun ini untuk mengekstrak PID itu sendiri. Sebagai contoh:

lsof -t -i :1337

yang juga setara (dalam hasil) dengan perintah ini:

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

Ilustrasi cepat:

masukkan deskripsi gambar di sini

Untuk kelengkapan, karena sering digunakan bersama:

Untuk membunuh PID:

kill -9 <PID>
# kill -9 60401

atau sebagai satu liner:

kill -9 $(lsof -t -i :1337)
arcseldon
sumber
2
Perintah ini juga menampilkan PID yang tidak mendengarkan, dan pertanyaan yang diajukan hanya untuk pendengar saja.
Poin
3
Anda juga bisa berlari lsof -t -i :1338. -takan mengembalikan id proses, jadi Anda tidak perlu awk / kepala.
KFunk
Tidak ada yang berhasil kecuali kill -9 $(lsof -t -i :5000)pada el capitan
goksel
Ini bagus. Saya lebih suka tahu apa yang ada di sana sebelum saya membunuhnya, jadi (berdasarkan ini) saya baru saja menambahkan ke bashrc saya:, whatsonport() { ps -ef | grep `lsof -t -i :$1` }jadi:⇒ whatsonport 3000 --> 501 14866 14865 0 6:07AM ttys006 0:01.73 node .
Sigfried
1
Terima kasih, lsof -i :PORT_NUMBERmelakukan pekerjaan untuk saya.
marika.daboja
79

Ini berfungsi di Mavericks (OSX 10.9.2).

sudo lsof -nP -iTCP:$PORT -sTCP:LISTEN
Charley Wu
sumber
Saya tidak membutuhkan sudo pada 10.10.
Sophistifunk
Bekerja Yosemite (10.10.2)
Phillip Kamikaze
48

Untuk port LISTEN, ESTABLISHED, dan CLOSED

sudo lsof -n -i -P | grep TCP

Untuk port DENGAR saja

sudo lsof -n -i -P | grep LISTEN

Untuk port LISTEN tertentu, mis: port 80

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

Atau jika Anda hanya ingin ringkasan ringkas [tidak ada layanan / aplikasi yang dijelaskan], buka NETSTAT. Sisi baiknya di sini adalah, tidak perlu sudo

netstat -a -n | grep 'LISTEN '

Menjelaskan item yang digunakan:

-n menekan nama host

-i untuk protokol IPv4 dan IPv6

-Menghapus nama port

-a [over netstat] untuk semua soket

-n [over netstat] tidak menyelesaikan nama, tampilkan alamat jaringan sebagai angka

Diuji pada Sierra Tinggi 10.13.3 dan Mojave 10.14.3

  • sintaks netstat terakhir juga berfungsi di linux
PYK
sumber
Penjelasan detail sebenarnya sangat berguna untuk pemula seperti saya. terima kasih @PYK
Tomaz Wang
46

pada OS X Anda dapat menggunakan opsi -v untuk netstat untuk memberikan pid terkait.

Tipe:

netstat -anv | grep [.]PORT

output akan terlihat seperti ini:

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

PID adalah angka sebelum kolom terakhir, 3105 untuk kasus ini

Sean Hamilton
sumber
Anda juga perlu menambahkan grep LISTENuntuk menunjukkan pendengar saja.
Poin
3
Inilah yang saya butuhkan! lsoftidak dapat menemukan porta. tetapi netstatmenunjukkan itu terbuka. -vadalah saus rahasia yang kurang.
Aaron McMillin
32

Di macOS, inilah cara mudah untuk mendapatkan ID proses yang mendengarkan pada port tertentu dengan netstat . Contoh ini mencari proses penyajian konten di port 80:

temukan server berjalan pada port 80

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

output sampel

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

Yang ke-2 dari kolom terakhir adalah PID. Di atas, ini 715 .

pilihan

-a - tampilkan semua port, termasuk yang digunakan oleh server

-n- tampilkan angka, jangan cari nama. Ini membuat perintah jauh lebih cepat

-v - verbose output, untuk mendapatkan ID proses

-w- kata pencarian. Kalau tidak, perintah akan mengembalikan info untuk port 8000 dan 8001, bukan hanya "80"

LISTEN - berikan info hanya untuk port dalam mode LISTEN, yaitu server

johntellsallall
sumber
2
flag -v berhasil
user9869932
18

Pada versi macOS terbaru Anda dapat menggunakan perintah ini:

lsof -nP -i4TCP:$PORT | grep LISTEN

Jika Anda merasa sulit untuk diingat maka mungkin Anda harus membuat bashfungsi dan mengekspornya dengan nama yang lebih ramah seperti itu

vi ~/.bash_profile

dan kemudian tambahkan baris berikut ke file itu dan simpan.

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

Sekarang Anda dapat mengetikkan listening_on 80Terminal Anda dan melihat proses mana yang mendengarkan pada port 80.

arturgrigor
sumber
13

Di Snow Leopard (OS X 10.6.8), menjalankan hasil 'man lsof':

lsof -i 4 -a

(entri manual sebenarnya adalah 'lsof -i 4 -a -p 1234')

Jawaban sebelumnya tidak berfungsi pada Snow Leopard, tetapi saya mencoba menggunakan 'netstat -nlp' sampai saya melihat penggunaan 'lsof' dalam jawaban oleh pts.

Brent Self
sumber
10

Saya seorang pria Linux. Di Linux sangat mudah dengan netstat -ltpnatau kombinasi huruf-huruf itu. Namun di Mac OS X netstat -an | grep LISTENadalah yang paling manusiawi. Yang lain sangat jelek dan sangat sulit diingat ketika troubleshooting.

edib
sumber
2
Pertanyaannya secara eksplisit meminta port TCP tertentu, dan perintah Anda menunjukkan pendengar pada semua port.
Poin
7
lsof -n -i | awk '{ print $1,$9; }' | sort -u

Ini menampilkan siapa yang melakukan apa. Hapus -n untuk melihat nama host (sedikit lebih lambat).

Misha Tavkhelidze
sumber
1
Jawaban Anda tidak buruk, tetapi ada pada pertanyaan dengan beberapa jawaban yang sangat dipilih, dan yang diterima, dari beberapa tahun yang lalu. Di masa depan, cobalah untuk fokus pada pertanyaan yang lebih baru, terutama yang belum dijawab.
Apakah perintah ini juga menampilkan port non-TCP, dan non-pendengar? Pertanyaannya secara eksplisit meminta pendengar hanya pada port TCP.
Poin
Sesuai halaman manual (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: Jadi ini menampilkan non-pendengar juga, jadi itu tidak menjawab pertanyaan.
Poin
Tambahkan -sTCP:LISTENkelsof
Misha Tavkhelidze
3

Ini melakukan apa yang saya butuhkan.

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

Saya membuat skrip kecil untuk melihat tidak hanya siapa yang mendengarkan di mana tetapi juga untuk menampilkan koneksi yang mapan dan ke negara mana. Bekerja pada 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)

Ini mungkin berguna untuk memeriksa apakah Anda terhubung ke korea utara! ;-)

0x00
sumber
0

Ini adalah cara yang baik di macOS High Sierra:

netstat -an |grep -i listen
tr4nc3
sumber
Benar juga! Jawaban yang diterima sebenarnya adalah cara yang benar ... netstat pada mac os x tidak menunjukkan pemetaan pid ke port.
tr4nc3
0

Terinspirasi oleh pengguna Brent Self:

lsof -i 4 -a | grep LISTEN

Punnerud
sumber
0

Untuk macOS saya menggunakan dua perintah bersama untuk menunjukkan informasi tentang proses mendengarkan pada mesin dan proses menghubungkan ke server jauh. Dengan kata lain, untuk memeriksa port mendengarkan dan koneksi saat ini (TCP) pada host, Anda dapat menggunakan dua perintah berikut secara bersamaan

1. netstat -p tcp -p udp 

2. lsof -n -i4TCP -i4UDP 

Kupikir aku akan menambahkan masukanku, semoga itu bisa membantu seseorang.

Boschko
sumber