在 Linux 上,我可以使用netstat -pntl | grep $PORT
或fuser -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
标志用于显示原始端口号,而不是像http
, ftp
或更多深奥的服务名称(如dpserve
, socalia
等dpserve
解析的名称。
有关更多选项,请参阅注释。
您还可以使用:
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
是非常强大的工具,但不幸的是使用起来不那么舒服。