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

pts*_*pts 1267 macos netstat tcp listen

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

pts*_*pts 1865

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

lsof -nP -i4TCP:$PORT | grep LISTEN
Run Code Online (Sandbox Code Playgroud)

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

lsof -nP -iTCP:$PORT | grep LISTEN
lsof -nP -i:$PORT | grep LISTEN
Run Code Online (Sandbox Code Playgroud)

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

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

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

-P标志是用于显示原始的端口号,而不是解决的名字,如http,ftp或像更深奥的服务名称dpserve,socalia.

有关更多选项,请参阅注释.

  • 使用`sudo`作为前缀,查看您不拥有的进程. (143认同)
  • 在Mountain Lion上,你不需要`grep`:`sudo lsof -iTCP:$ PORT -sTCP:LISTEN` (57认同)
  • 在狮子上,使用了改变`sudo lsof -i TCP:$ PORT | grep LISTEN` (29认同)
  • 经过这么多搜索,这一次是最好的.直接想要复制命令的人应该用实际端口号替换$ PORT或者为多个端口定义变量PORT,例如:export PORT = 8080,4433; lsof -n -i4TCP:$ PORT (14认同)
  • 如果要调查的端口在 1024 以上,则不需要 sudo。 (2认同)
  • 我有错误:`lsof:不可接受的端口规范:-i 4TCP` (2认同)

Mic*_*ski 547

从Snow Leopard(10.6)到Mojave(10.14),每个版本的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
}
Run Code Online (Sandbox Code Playgroud)

然后listening命令会给你一个监听某个端口的进程列表,并listening smth为某些模式greps这个.

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

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

  • 这在我的dotfiles中。我每隔几个月搜索一次,总是得到这个答案。 (5认同)
  • 我觉得这应该被接受,因为OP说他做了“-pntl”,它将列出所有服务。接受的答案要求指定一个或多个端口号,而这些端口号并不完全相同。 (2认同)
  • 这对我来说也适用于 Monterey 12.1。 (2认同)

Rog*_*182 430

您还可以使用:

sudo lsof -i -n -P | grep TCP
Run Code Online (Sandbox Code Playgroud)

这适用于小牛队.

  • 这项工作对我来说很高兴,加油(OS X 10.9) (2认同)
  • -i选项使其速度大大提高。0.02秒vs 2秒 在我的应用程序中,差异很大。 (2认同)

arc*_*don 280

2016年1月更新

真的很惊讶没有人建议:

lsof -i :PORT_NUMBER
Run Code Online (Sandbox Code Playgroud)

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

lsof -i :1337
Run Code Online (Sandbox Code Playgroud)

其他变化,取决于具体情况:

sudo lsof -i :1337
lsof -i tcp:1337
Run Code Online (Sandbox Code Playgroud)

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

lsof -t -i :1337
Run Code Online (Sandbox Code Playgroud)

这也与此命令等效(结果):

lsof -i :1337 | awk '{ print $2; }' | head -n 2 | grep -v PID
Run Code Online (Sandbox Code Playgroud)

快速插图:

在此输入图像描述

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

杀死PID:

kill -9 <PID>
# kill -9 60401
Run Code Online (Sandbox Code Playgroud)

或作为一个班轮:

kill -9 $(lsof -t -i :1337)
Run Code Online (Sandbox Code Playgroud)

  • 此命令还显示非侦听器PID,并且仅显式询问侦听器. (2认同)
  • 你也可以运行`lsof -t -i:1338`.`-t`将返回进程ID,因此你不必awk/head. (2认同)

小智 79

这适用于Mavericks(OSX 10.9.2).

sudo lsof -nP -iTCP:$PORT -sTCP:LISTEN
Run Code Online (Sandbox Code Playgroud)


小智 42

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

类型:

netstat -anv | grep [.]PORT
Run Code Online (Sandbox Code Playgroud)

输出将如下所示:

tcp46      0      0  *.8080                 *.*                    LISTEN      131072 131072   3105      0
Run Code Online (Sandbox Code Playgroud)

PID是最后一列之前的数字,对于这种情况是3105

  • 这就是我需要的!`lsof`找不到端口.但是`netstat`显示它是开放的.`-v`是我缺少的秘诀. (3认同)

PYK*_*PYK 37

对于LISTEN,ESTABLISHED和CLOSED端口

sudo lsof -n -i -P | grep TCP
Run Code Online (Sandbox Code Playgroud)

仅适用于LISTEN端口

sudo lsof -n -i -P | grep LISTEN
Run Code Online (Sandbox Code Playgroud)

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

sudo lsof -n -i -P | grep ':80 (LISTEN)'
Run Code Online (Sandbox Code Playgroud)

或者,如果您只想要一个紧凑的摘要[没有描述服务/应用程序],请访问NETSTAT.这里好的一面是,不需要sudo

netstat -a -n | grep 'LISTEN '
Run Code Online (Sandbox Code Playgroud)

解释使用的项目:

-n禁止主机名

-i用于IPv4和IPv6协议

-P省略端口名称

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

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

High Sierra 10.13.3和Mojave 10.14.3上进行了测试

  • 最后一个语法netstat也适用于linux

  • lsof的,你可以尝试基于Debian的上方:apt-get的安装lsof的


joh*_*all 32

在macOS上,这是一个简单的方法来获取正在使用netstat监听特定端口的进程ID .此示例查找在端口80上提供内容的进程:

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

netstat -anv | egrep -w [.]80.*LISTEN
Run Code Online (Sandbox Code Playgroud)

样本输出

tcp4  0 0  *.80       *.*    LISTEN      131072 131072    715      0
Run Code Online (Sandbox Code Playgroud)

最后一列的第二个是PID.在上面,它是715.

选项

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

-n - 显示数字,不要查找名称.这使得该命令很多

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

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

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

  • -v标志成功了 (2认同)

art*_*gor 18

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

lsof -nP -i4TCP:$PORT | grep LISTEN
Run Code Online (Sandbox Code Playgroud)

如果你发现它很难记住,那么也许你应该创建一个bash函数并用更友好的名字输出它

vi ~/.bash_profile
Run Code Online (Sandbox Code Playgroud)

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

function listening_on() {
    lsof -nP -i4TCP:"$1" | grep LISTEN
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以键入listening_on 80终端并查看正在侦听端口的进程80.


ran*_*913 14

我想分享这个命令,它运行良好并打印标题,以便您知道哪一列是哪一列:

lsof -iTCP:8080 -sTCP:LISTEN -P -n
Run Code Online (Sandbox Code Playgroud)

示例输出: 在此输入图像描述


小智 12

在Snow Leopard(OS X 10.6.8)上,运行'man lsof'会产生:

lsof -i 4 -a
Run Code Online (Sandbox Code Playgroud)

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

之前的答案对Snow Leopard没有用,但是我试图使用'netstat -nlp',直到我看到pts在答案中使用'lsof'.


edi*_*dib 11

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

  • 问题明确要求特定的TCP端口,并且您的命令在所有端口上显示侦听器. (2认同)

Rob*_*jan 9

检查这个项目/工具: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"
Run Code Online (Sandbox Code Playgroud)

这是一个示例输出:

在此输入图像描述


Mis*_*dze 7

lsof -n -i | awk '{ print $1,$9; }' | sort -u
Run Code Online (Sandbox Code Playgroud)

这表明谁在做什么.删除-n以查看主机名(稍微慢一些).