一尘不染

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

javascript

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


阅读 167

收藏
2022-02-18

共2个答案

一尘不染

在 macOSBig 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或更深奥的服务名称,如dpserve, socalia

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

要kill PID:

sudo kill -9 <PID>
# kill -9 60401
2022-02-18
一尘不染

直到macOS 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

lsofcommand 有一些专门的选项来询问端口、协议、进程等,但我个人发现上面的函数更方便,因为我不需要记住所有这些低级选项。lsof是相当强大的工具,但不幸的是使用起来不太舒服。

2022-02-18