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


当前回答

我做了一个小脚本,不仅要看谁在哪里听,还要看与哪些国家建立的联系。在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)

这可能有助于检查您是否连接到朝鲜!;-)

其他回答

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)

直到macOS 13 Ventura,每个版本的macOS都支持此功能:

sudo lsof-iTCP-sTCP:列表-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
}

然后,listing命令为您提供了一个在某个端口上侦听的进程列表,并为某个模式侦听smthgreps。

有了这一点,很容易询问特定的进程,例如监听dropbox或端口,例如监听22。

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

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

1. netstat -p tcp -p udp 

2. lsof -n -i4TCP -i4UDP 

我想我会添加我的输入,希望它最终能帮助某人。

lsof -n -i | awk '{ print $1,$9; }' | sort -u

这显示了谁在做什么。删除-n以查看主机名(速度稍慢)。

您还可以使用:

sudo lsof -i -n -P | grep TCP

这在小牛队奏效。