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

时间:2010-12-12 12:30:02

标签: macos tcp netstat listen

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

17 个答案:

答案 0 :(得分:1712)

在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或更多深奥的服务名称(如dpservesocalia等已解析的名称。

有关更多选项,请参阅评论。

答案 1 :(得分:435)

自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 greps上的某些模式。

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

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

答案 2 :(得分:415)

您也可以使用:

sudo lsof -i -n -P | grep TCP

这适用于小牛队。

答案 3 :(得分:257)

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

快速说明:

enter image description here

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

杀死PID:

kill -9 <PID>
# kill -9 60401

或作为一个班轮:

kill -9 $(lsof -t -i :1337)

答案 4 :(得分:79)

这适用于Mavericks(OSX 10.9.2)。

sudo lsof -nP -iTCP:$PORT -sTCP:LISTEN

答案 5 :(得分:34)

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

型:

netstat -anv | grep [.]PORT

输出将如下所示:

tcp46      0      0  *.8080                 *.*                    LISTEN      131072 131072   3105      0

PID是最后一列之前的数字,本案例为3105

答案 6 :(得分:31)

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

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

netstat -anv | egrep -w [.]80.*LISTEN

样本输出

tcp4  0 0  *.80       *.*    LISTEN      131072 131072    715      0

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

选项

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

-n - 显示数字,不要查找姓名。这使命令 lot 更快

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

-w - 搜索字词。否则,该命令将返回端口8000和8001的信息,而不仅仅是“80”

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

答案 7 :(得分:24)

用于侦听,已建立和已关闭的端口

sudo lsof -n -i -P | grep TCP

仅适用于LISTEN端口

sudo lsof -n -i -P | grep LISTEN

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

sudo lsof -n -i -P | grep ':80 (LISTEN)'

或者,如果您只想获得简短的摘要[没有描述服务/应用],请使用NETSTAT。这里的好处是,不需要sudo

netstat -a -n | grep 'LISTEN '

说明使用的项目:

-n 取消显示主机名

-i (用于IPv4和IPv6协议)

-P 省略端口名

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

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

  

High Sierra 10.13.3和 Mojave 10.14.3

上进行了测试      
      
  • 最后一个语法 netstat 在Linux上也适用

  •   
  • lsof ,您可以尝试以下基于Debian的方法: apt-get install lsof

  •   

答案 8 :(得分:17)

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

lsof -nP -i4TCP:$PORT | grep LISTEN

如果您发现很难记住那么也许您应该创建一个bash函数并将其导出为更友好的名称,如此

vi ~/.bash_profile

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

function listening_on() {
    lsof -nP -i4TCP:"$1" | grep LISTEN
}

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

答案 9 :(得分:12)

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

lsof -i 4 -a

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

以前的答案在雪豹上没有用,但我试图使用'netstat -nlp',直到我在pts的答案中看到使用'lsof'。

答案 10 :(得分:10)

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

答案 11 :(得分:7)

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

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

答案 12 :(得分:3)

这就是我所需要的。

ps -eaf | grep `lsof -t -i:$PORT`

答案 13 :(得分:0)

我制作了一个小脚本,不仅可以看到谁在哪里听,还可以看到已建立的联系以及哪些国家。适用于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)

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

答案 14 :(得分:0)

这是在macOS High Sierra上的好方法:

netstat -an |grep -i listen

答案 15 :(得分:0)

受用户Brent Self的启发:

lsof -i 4 -a | grep LISTEN

答案 16 :(得分:0)

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

1. netstat -p tcp -p udp 

2. lsof -n -i4TCP -i4UDP 

我想添加我的意见,希望它最终可以帮助某人。