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

Posted

技术标签:

【中文标题】谁在 Mac OS X 上的给定 TCP 端口上监听?【英文标题】:Who is listening on a given TCP port on Mac OS X? 【发布时间】:2011-05-24 05:25:36 【问题描述】:

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

【问题讨论】:

抱歉,netstat -p tcp | grep $PORT 不显示 PID,因为 Mac OS X 上的 netstat 无法显示 PID。 netstat -anv 在 Mac OS X 上显示端口(来源:@SeanHamiliton 下面的解决方案) 【参考方案1】:

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

sudo lsof -i -P | grep LISTEN | grep :$PORT

或者只查看 IPv4:

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

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

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

$PORT 替换为端口号或以逗号分隔的端口号列表。

如果您需要关于 #1024 以下端口的信息,请在前面加上 sudo(后跟一个空格)。

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

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

查看 cmets 了解更多选项。

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

杀死 PID:

sudo kill -9 <PID>
# kill -9 60401

【讨论】:

sudo 为前缀以查看不属于您的进程。 关于狮子,进行了更改sudo lsof -i TCP:$PORT | grep LISTEN 在山狮上,你不需要grep:sudo lsof -iTCP:$PORT -sTCP:LISTEN 经过这么多搜索后,这个是最好的。直接想要复制命令的人应该用实际端口号替换 $PORT 或定义变量 PORT 以及多个端口,例如:export PORT=8080,4433; lsof -n -i4TCP:$PORT 如果要调查的端口在 1024 以上,则不需要 sudo。【参考方案2】:

直到 ma​​cOS 12 Monterey,每个 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 是一个相当强大的工具,可惜用起来不太舒服。

【讨论】:

这是我的点文件。我每隔几个月搜索一次,总是会得到这个答案。 我觉得这应该被接受,因为 OP 说他这样做了-pntl,这将列出所有服务。接受的答案要求指定一个或多个端口号,这远程不一样。 这对我来说也适用于 Monterey 12.1。【参考方案3】:

你也可以使用:

sudo lsof -i -n -P | grep TCP

这适用于小牛队。

【讨论】:

-i 选项使其显着加快。 0.02 秒对 2 秒。在我的应用程序中,这产生了很大的不同。 这些特定标志的作用是 -i、-n、-P。我在任何地方都找不到它们的确切含义 sudo lsof -i -n -P | grep TCP | grep $PORT - 我用这个命令做了一个别名 我建议添加“| grep $PORT”或“| grep LISTEN” 太棒了!也适用于莫哈韦沙漠。【参考方案4】:

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)

【讨论】:

此命令还显示非侦听器 PID,以及仅针对侦听器明确询问的问题。 你也可以运行lsof -t -i :1338-t 将返回进程 ID,因此您不必 awk/head。 除了kill -9 $(lsof -t -i :5000) 在el capitan 上没有任何效果 这很棒。我更喜欢在杀死它之前知道那里有什么,所以(基于此)我刚刚添加到我的 bashrc:whatsonport() ps -ef | grep `lsof -t -i :$1` ,所以:⇒ whatsonport 3000 --&gt; 501 14866 14865 0 6:07AM ttys006 0:01.73 node . 谢谢,lsof -i :PORT_NUMBER 为我做了一份工作。【参考方案5】:

这适用于 Mavericks (OSX 10.9.2)。

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

【讨论】:

我在 10.10 上不需要 sudo。 曾在优胜美地工作 (10.10.2)【参考方案6】:

对于 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 [over netstat] 用于所有套接字

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

High Sierra 10.13.3 和 Mojave 10.14.3

上测试 最后一个语法 netstat 也适用于 linux

【讨论】:

详细的解释对我这种初学者来说其实很有用。谢谢@PYK【参考方案7】:

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

类型:

netstat -anv | grep [.]PORT

输出将如下所示:

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

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

【讨论】:

您还需要添加grep LISTEN 以仅显示听众。 这就是我需要的! lsof 找不到端口。但netstat 表明它是开放的。 -v 是我缺少的秘诀。【参考方案8】:

在 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 - 仅提供 LISTEN 模式下端口的信息,即服务器

【讨论】:

-v 标志成功了【参考方案9】:

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

lsof -nP -i4TCP:$PORT | grep LISTEN

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

vi ~/.bash_profile

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

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

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

【讨论】:

【参考方案10】:

在 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”。

【讨论】:

【参考方案11】:

我是 Linux 人。在 Linux 中,使用 netstat -ltpn 或这些字母的任意组合非常容易。但在 Mac OS X 中netstat -an | grep LISTEN 是最人性化的。其他的非常难看,排查时很难记住。

【讨论】:

问题明确要求特定 TCP 端口,您的命令会显示所有端口上的侦听器。【参考方案12】:
lsof -n -i | awk ' print $1,$9; ' | sort -u

这显示了谁在做什么。去掉 -n 来查看主机名(有点慢)。

【讨论】:

您的答案还不错,但它是关于一个问题,该问题有几个高度赞成的答案,并且是多年前公认的答案。将来,请尝试关注最近的问题,尤其是尚未回答的问题。 此命令是否也显示非 TCP 端口和非侦听器?该问题明确要求仅 TCP 端口上的侦听器。 根据 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:所以它也显示非听众,所以它不回答问题。 -sTCP:LISTEN添加到lsof【参考方案13】:

这满足了我的需要。

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

【讨论】:

【参考方案14】:

我制作了一个小脚本,不仅可以查看谁在哪里收听,还可以显示已建立的连接以及与哪些国家/地区的连接。适用于 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。【参考方案15】:

签出此项目/工具:procs

在 MacO 上安装: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"

这是一个示例输出:

【讨论】:

【参考方案16】:

受用户 Brent Self 启发:

lsof -i 4 -a | grep LISTEN

【讨论】:

【参考方案17】:

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

1. netstat -p tcp -p udp 

2. lsof -n -i4TCP -i4UDP 

我想我会添加我的意见,希望它最终可以帮助某人。

【讨论】:

【参考方案18】:

这是 macOS High Sierra 上的好方法:

netstat -an |grep -i listen

【讨论】:

完全正确!接受的答案实际上是正确的方法...... mac os x 上的 netstat 没有显示 pid 到端口的映射。

以上是关于谁在 Mac OS X 上的给定 TCP 端口上监听?的主要内容,如果未能解决你的问题,请参考以下文章

我可以将非特权应用程序绑定到 Mac OS X 上的特权端口吗?

sh 如何杀死mac os x终端上的端口

sh 如何杀死mac os x终端上的端口

无法在Mac OS X上找到正在侦听端口8001的进程

MAC OS X下如何配置TCP_KEEPALIVE

如何在 MAC OS X 中获得最大 TCP 接收/发送窗口?