协慌网

登录 贡献 社区

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

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

答案

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

lsof -nP -i4TCP:$PORT | grep LISTEN

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

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

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

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

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

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

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

您还可以使用:

sudo lsof -i -n -P | grep TCP

这适用于小牛队。

从 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
}

然后listening命令给你的监听某个端口上的进程的列表,并listening smth里 grep 这对于一些模式。

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

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