谁在Mac OS X上监听给定的TCP端口?


1381

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


27
抱歉,netstat -p tcp | grep $PORT由于Mac OS X上的netstat无法显示PID,因此不会显示PID。
pts 2010年

12
netstat -anv显示Mac OS X上的端口(来源:@SeanHamiliton的解决方案)
Curtis Yallop

Answers:


2043

在macOS High Sierra及更高版本上,使用以下命令:

lsof -nP -iTCP:$PORT | grep LISTEN

或仅查看IPv4:

lsof -nP -i4TCP:$PORT | grep LISTEN

在旧版本上,使用以下形式之一:

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

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

sudo如果需要有关#1024以下端口的信息,请加前缀(后跟空格)。

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

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

请参阅注释以获取更多选项。

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

杀死PID:

kill -9 <PID>
# kill -9 60401

152
为此加上前缀,sudo以查看您不拥有的进程。
戈登·戴维森

30
在狮子上,进行了更改sudo lsof -i TCP:$PORT | grep LISTEN
dhaval 2012年

58
在Mountain Lion上,您不需要grepsudo lsof -iTCP:$PORT -sTCP:LISTEN
Siu Ching Pong -Asuka Kenji-

16
经过如此多的搜索后,这个是最好的。直接复制命令的用户应将$ PORT替换为实际的端口号,或者定义变量PORT,对于多个端口也应这样,例如:export PORT = 8080,4433; lsof -n -i4TCP:$ PORT
siddhusingh 2014年

2
如果要调查的端口高于1024
不需要sudo。– stigkj 2014年

624

从Snow Leopard(10.6)到Mojave(10.14)和Catalina(10,15),每个macOS版本都支持以下功能:

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

就我个人而言,我最终在以下代码中使用了此简单功能~/.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
}

然后,listening命令为您提供了在某个端口上侦听的进程列表,并listening smth针对某些模式对此进行了摸索。

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

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


7
这在我的dotfiles中。我每隔几个月搜索一次,总是得到这个答案。
danemacmillan

1
我认为这是应该接受的答案,就像OP所说的那样-pntl,它将列出所有服务。接受的答案要求指定一个或多个端口号,这与远程端口号不同。
seeafish

440

您还可以使用:

sudo lsof -i -n -P | grep TCP

这适用于小牛。


3
-i选项使其速度大大提高。0.02秒vs 2秒 在我的应用程序中,差异很大。
Eric Boehs 2014年

这些特定标志做什么-i,-n,-P。我在任何地方都找不到它们的确切含义
Chad Watkins 2015年

须藤lsof -i -n -P | grep TCP | grep $
PORT-

我建议添加“ | grep $ PORT”或“ | grep LISTEN”
KC Baltz

大!也可以在莫哈韦沙漠上使用。
Gefilte Fish,

291

2016年1月更新

真的很惊讶,没有人建议:

lsof -i :PORT_NUMBER

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

lsof -i :1337

其他变化,取决于情况:

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

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

lsof -t -i :1337

(等效于)此命令:

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

快速说明:

在此处输入图片说明

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

杀死PID:

kill -9 <PID>
# kill -9 60401

或作为一个班轮:

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

2
此命令还显示非侦听器PID,以及明确要求仅侦听器的问题。
pts 2016年

3
您也可以运行lsof -t -i :1338-t将返回进程ID,因此您不必awk / head。
KFunk

毫无效果,除了kill -9 $(lsof -t -i :5000)在埃尔卡皮坦
goksel

这很棒。我宁愿在杀死它之前先知道那里有什么,所以(基于此)我刚刚添加到我的bashrc:中whatsonport() { ps -ef | grep `lsof -t -i :$1` },所以:⇒ whatsonport 3000 --> 501 14866 14865 0 6:07AM ttys006 0:01.73 node .
Sigfried

1
谢谢,lsof -i :PORT_NUMBER为我做了一份工作。
marika.daboja


48

对于LISTEN,ESTABLISHED和CLOSED端口

sudo lsof -n -i -P | grep TCP

仅用于LISTEN端口

sudo lsof -n -i -P | grep LISTEN

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

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

或者,如果您只想要一个简短的摘要[没有描述服务/应用],请使用NETSTAT。这里的好处是,不需要sudo

netstat -a -n | grep 'LISTEN '

解释使用的项目:

-n取消主机名

-i用于IPv4和IPv6协议

-P省略端口名称

-a [通过netstat]用于所有套接字

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

High Sierra 10.13.3和Mojave 10.14.3 上测试

  • 最后一种语法netstat在Linux上也适用

实际上,详细说明对于像我这样的初学者来说非常有用。感谢@PYK
Tomaz Wang

46

在OS X上,可以对netstat使用-v选项来提供关联的pid。

类型:

netstat -anv | grep [.]PORT

输出将如下所示:

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

PID是最后一列之前的数字,在这种情况下为3105


您还需要添加grep LISTEN以仅显示侦听器。
pts 2016年

3
这就是我所需要的!lsof找不到端口。但netstat显示它是开放的。-v是我所缺乏的秘密调味料
亚伦·麦克米林

32

在macOS上,这是一种使用netstat获取在特定端口上侦听的进程ID的简便方法。本示例查找在端口80上提供内容的进程:

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

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

样本输出

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

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

选项

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

-n-显示数字,不要查找姓名。这使命令快很多

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

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

LISTEN -仅提供侦听模式下的端口信息,即服务器


2
-v标志成功实现
user9869932

18

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

lsof -nP -i4TCP:$PORT | grep LISTEN

如果您很难记住,那么也许您应该创建一个bash函数并使用一个更友好的名称将其导出,如下所示

vi ~/.bash_profile

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

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

现在,您可以listening_on 80在Terminal中输入内容,查看哪个进程正在监听port 80


13

在Snow Leopard(OS X 10.6.8)上,运行“ man lsof”将产生:

lsof -i 4 -a

(实际的手动输入是“ lsof -i 4 -a -p 1234”)

先前的答案在Snow Leopard上不起作用,但是我一直尝试使用'netstat -nlp',直到在pts的答案中看到使用'lsof'为止。


10

我是Linux专家。在Linux中,使用netstat -ltpn这些字母或将其任意组合非常容易。但是在Mac OS X中netstat -an | grep LISTEN是最人性化的。其他人非常丑陋,并且在进行故障排除时很难记住。


2
该问题明确要求使用特定的TCP端口,并且您的命令在所有端口上显示侦听器。
pts

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

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


1
您的答案还不错,但是它是一个问题,其中包含多个多年前被高度评价的答案和一个被接受的答案。将来,请尝试着眼于较新的问题,尤其是尚未回答的问题。

此命令是否也显示非TCP端口和非侦听器?该问题明确要求仅在TCP端口上提供侦听器。
pts 2014年

根据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 2014年

@Misha Tavkhelidze:因此它也显示非收听者,因此没有回答问题。
pts 2016年

添加-sTCP:LISTENlsof
Misha Tavkhelidze,

3

这做了我需要的。

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

1

我编写了一个小脚本,不仅可以查看谁在哪里监听,还可以显示已建立的联系以及与哪些国家的联系。在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)

这对于检查您是否已连接到朝鲜很有用!;-)


0

这是在macOS High Sierra上的好方法:

netstat -an |grep -i listen

没错!接受的答案实际上是正确的方法……在Mac OS X上的netstat不会显示pid到端口的映射。
tr4nc3


0

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

1. netstat -p tcp -p udp 

2. lsof -n -i4TCP -i4UDP 

以为我会补充我的意见,希望它最终可以对某人有所帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.