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

2065

在Linux上,可以使用netstat -pntl | grep $PORTfuser -n tcp $PORT命令来查找监听特定TCP端口的进程(PID)。在Mac OS X上如何获取相同的信息?


32
抱歉,“netstat -p tcp | grep $PORT”命令无法显示进程ID,因为Mac OS X上的netstat无法显示进程ID。 - pts
29
netstat -anv 显示 Mac OS X 上的端口(来源:@SeanHamiliton 的下面解决方案)。 - Curtis Yallop
2
从上面的评论中:在 Mac OS X(10.15.7 Catalina)上,netstat -anv 命令给了我 PID。 - preOtep
19个回答

11

我是一个Linux的爱好者。在Linux中,使用netstat -ltpn或任何这些字母的组合都非常容易。但在Mac OS X中,netstat -an | grep LISTEN最为人性化。其他方法很丑陋且在故障排除时难以记住。


3
问题明确要求特定的TCP端口,而你的命令展示了所有端口上的监听器。 - pts

9

看一下这个项目/工具:procs

在MacOS上安装:brew install procs

这允许您使用procs控制要显示什么内容。

要查看TCP/UDP端口,请在安装该工具后将以下内容添加到~/.procs.toml中。

[[columns]]
kind = "TcpPort"
style = "BrightYellow|Yellow"
numeric_search = true
nonnumeric_search = false
align = "Left"

[[columns]]
kind = "UdpPort"
style = "BrightGreen|Green"
numeric_search = false
nonnumeric_search = true
align = "Left"

以下是一个样例输出:

输入图像描述


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

此处显示谁在做什么。去掉 -n 可以看到主机名(速度略慢)。


1
你的回答还不错,但是这个问题已经有多年前的多个高赞和被采纳的答案了。在未来,请尽量关注一些更近期的问题,特别是那些还没有得到答案的。 - user308323
这个命令是否也显示非TCP端口和非监听器?问题明确要求仅显示TCP端口上的监听器。 - pts
根据lsof(8)的man页:如果没有指定地址,该选项[-i]将选择列出所有的Internet和x.25 (HP-UX)网络文件。 - Misha Tavkhelidze
@Misha Tavkhelidze:所以它也会显示非监听器,因此它没有回答问题。 - pts
Add -sTCP:LISTEN to lsof - Misha Tavkhelidze
显示不仅监听的端口,还包括出站连接? - Motti Shneor

4

这个做了我需要的事情。

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

3

我编写了一个小脚本,不仅可以查看谁在哪里收听,还可以显示已建立的连接及其所在国家。该脚本适用于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)

这可能有助于检查您是否连接到朝鲜!;-)

太好了!只需更新为ipstack(因为freegeoip已经不存在了),并使用jp而不是grep进行更轻松的json解析。 - Robert Wildling

2
这是在macOS High Sierra上的一种好方法:
netstat -an |grep -i listen

非常正确!接受的答案实际上是正确的方法...在Mac OS X上,netstat不显示pid到端口映射。 - tr4nc3

2

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

1. netstat -p tcp -p udp 

2. lsof -n -i4TCP -i4UDP 

我想添加我的意见,希望能对某人有所帮助。


2
受用户 Brent Self 启发: lsof -i 4 -a | grep LISTEN 该命令用于列出所有正在监听 IPv4 端口的进程。

1

这是对Michał Kalinowski的回答进行的轻微改进(我没有足够的声望在那里留下评论):如果您正在尝试查找侦听编号为255及以下的端口的进程,则grep命令可能会打印与IP地址相关的行,而这些行不对应所需的结果。对于任何编号的端口,grep命令也可能错误地匹配设备的MAC地址或PID。为了改进这一点,我建议将命令更改为grep --color ":$1 "


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接