关于macos:谁在Mac OS X上侦听给定的TCP端口?

Who is listening on a given TCP port on Mac OS X?

在Linux上,我可以使用netstat -pntl | grep $PORTfuser -n tcp $PORT来查明哪个进程(pid)正在监听指定的TCP端口。如何在Mac OS X上获得相同的信息?


在Macos High Sierra上,使用以下命令:

1
lsof -nP -i4TCP:$PORT | grep LISTEN

在旧版本上,使用以下表单之一:

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

用端口号或用逗号分隔的端口号列表替换$PORT

如果您需要有关1024以下端口的信息,请预先发送sudo(后跟空格)。

-n标志用于显示IP地址而不是主机名。这使得命令执行得更快,因为获取主机名的DNS查找速度可能很慢(对于许多主机来说,几秒或一分钟)。

-P标志用于显示原始端口号,而不是解析名称,如httpftp或更深奥的服务名称,如dpservesocalia

有关更多选项,请参见注释。


由于雪豹(10.6),直到莫哈韦(10.14),每个版本的MacOS都支持这一点:

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

就我个人而言,我在我的~/.bash_profile中使用了这个简单的函数:

1
2
3
4
5
6
7
8
9
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
}

然后,listening命令为您提供了一个监听某个端口的进程列表,listening smth会对某些模式进行greps处理。

有了这个,就很容易询问特定的过程,例如listening dropbox或port,例如listening 22

lsof命令有一些关于端口、协议、进程等的专门选项,但就我个人而言,我发现上面的功能更加方便,因为我不需要记住所有这些低级选项。lsof是非常强大的工具,但不幸的是使用起来并不舒服。


您还可以使用:

1
sudo lsof -i -n -P | grep TCP

这在小牛中有效。


2016年1月更新

真的很惊讶没有人建议:

1
lsof -i :PORT_NUMBER

获取所需的基本信息。例如,检查端口1337:

1
lsof -i :1337

其他变化,视情况而定:

1
2
sudo lsof -i :1337
lsof -i tcp:1337

您可以轻松地在此基础上提取PID本身。例如:

1
lsof -t -i :1337

这也相当于(结果)这个命令:

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

快速说明:

enter image description here

为了完整性,因为经常一起使用:

取消PID:

1
2
kill -9 <PID>
# kill -9 60401

或者作为一条直线:

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


这适用于Mavericks(OSX 10.9.2)。

1
sudo lsof -nP -iTCP:$PORT -sTCP:LISTEN


在OSX上,可以使用netstat的-v选项来提供相关的PID。

类型:

1
netstat -anv | grep [.]PORT

输出如下:

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

pid是最后一列之前的数字,本例为3105


在MacOS上,有一种简单的方法可以获取进程ID,该ID通过netstat监听特定端口。此示例查找为端口80上的内容提供服务的进程:

查找在端口80上运行的服务器

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

样本输出

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

最后一列的第二个是PID。上面是715。

选项

-a—显示所有端口,包括服务器使用的端口。

-n—显示数字,不要查名字。这使得命令更快

-v—详细输出,以获取进程ID

-w搜索词。否则,命令将返回端口8000和8001的信息,而不仅仅是"80"

LISTEN—仅为处于侦听模式的端口(即服务器)提供信息


用于监听、建立和关闭端口

1
sudo lsof -n -i -P | grep TCP

仅用于侦听端口

1
sudo lsof -n -i -P | grep LISTEN

对于特定的监听端口,例如:端口80

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

或者,如果您只需要一个简洁的摘要[没有描述任何服务/应用程序],请通过netstat访问。好的一面是,不需要sudo

1
netstat -a -n | grep 'LISTEN '

解释使用的项目:

-n取消主机名

-i用于IPv4和IPv6协议

-省略端口名(O)

-所有套接字的[over netstat]

-n[通过netstat]不解析名称,将网络地址显示为数字

Tested on High Sierra 10.13.3 and Mojave 10.14.3

  • the last syntax netstat works on linux too

  • lsof you can try over Debian based: apt-get install lsof


在最新的MacOS版本上,可以使用以下命令:

1
lsof -nP -i4TCP:$PORT | grep LISTEN

如果你觉得很难记住,那么也许你应该创建一个bash函数,并用一个更友好的名字导出它,就像这样。

1
vi ~/.bash_profile

然后将以下行添加到该文件并保存它。

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

现在,您可以在终端中键入listening_on 80,查看哪个进程正在侦听端口80


在雪豹(OS X 10.6.8)上,运行"man lsof"会产生:

1
lsof -i 4 -a

(实际手动输入为'LSOF-I 4-A-P 1234')

以前的答案对雪豹不起作用,但我一直在尝试使用"netstat-nlp",直到我看到pts在答案中使用了"lsof"。


我是个Linux用户。在Linux中,使用netstat -ltpn或这些字母的任何组合都非常容易。但在Mac OS X中,netstat -an | grep LISTEN是最人道的。其他故障排除时很难看,也很难记住。


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

这将显示谁在做什么。删除-n以查看主机名(稍慢)。


这是我需要的。

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

对于MacOS,我同时使用两个命令来显示有关在计算机上侦听的进程和连接到远程服务器的进程的信息。换句话说,要检查主机上的侦听端口和当前(TCP)连接,可以同时使用以下两个命令

1
2
3
1. netstat -p tcp -p udp

2. lsof -n -i4TCP -i4UDP

我想我会添加我的输入,希望它能最终帮助别人。


我写了一个小剧本,不仅要看谁在听哪里的话,还要展示已经建立的联系和与哪些国家的联系。在OSX Siera上工作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
printf"
checking established connections

"
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"
displaying listening ports

"

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

#EOF
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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)

这可能有助于检查您是否与朝鲜有联系!;-)


这是在马科斯高地上的一个好方法:

1
netstat -an |grep -i listen


灵感来源于用户Brent Self:

lsof -i 4 -a | grep LISTEN