在Linux,我可以使用netstat -pntl | grep $PORT或fuser -n tcp $PORT找出哪个进程(PID)正在侦听指定的TCP端口。如何在Mac OS X上获取相同的信息?
netstat -pntl | grep $PORT
fuser -n tcp $PORT
在macOSBig Sur及更高版本上,使用此命令:
Big Sur
sudo lsof -i -P | grep LISTEN | grep :$PORT
或者只看IPv4:
sudo lsof -nP -i4TCP:$PORT | grep LISTEN
在旧版本中,请使用以下形式之一:
sudo lsof -nP -iTCP:$PORT | grep LISTENsudo lsof -nP -i:$PORT | grep LISTEN
用端口号或逗号分隔的端口号列表替换$PORT。
$PORT
如果您需要#1024以下端口的信息,请在前面加上sudo(后跟空格)。
sudo
-n标志用于显示IP地址而不是主机名。这使得命令执行得更快,因为获取主机名的DNS查找可能很慢(对于许多主机来说,几秒钟或一分钟)。
-n
-P标志用于显示原始端口号,而不是像http、ftp或更深奥的服务名称(如dpserve、socalia)这样的已解析名称。
-P
http
ftp
dpserve
socalia
查看更多选项的评论。
为了完整,因为经常一起使用:
杀死PID:
sudo kill -9 <PID># kill -9 60401
在Snow Leopard(OS X 10.6.8)上,运行man lsof会产生:
lsof -i 4 -a
(实际手动输入是'lsof-i 4-a-p 1234')
前面的答案在Snow Leopard上不起作用,但我一直在尝试使用'netstat-nlp',直到我在pt的答案中看到'lsof'的使用。
您还可以使用:
sudo lsof -i -n -P | grep TCP
这在小牛队工作。
lsof -n -i | awk '{ print $1,$9; }' | sort -u
这显示谁在做什么。删除-n以查看主机名(慢一点)。
直到macOS 13 Ventura,每个版本的macOS都支持:
sudo lsof -iTCP -sTCP:LISTEN -n -P
就个人而言,我在我的~/.bash_profile中结束了这个简单的函数:
~/.bash_profile
listening() {if [ $# -eq 0 ]; thensudo lsof -iTCP -sTCP:LISTEN -n -Pelif [ $# -eq 1 ]; thensudo lsof -iTCP -sTCP:LISTEN -n -P | grep -i --color $1elseecho "Usage: listening [pattern]"fi}
然后listening命令为您提供了一个监听某些端口的进程列表,listening smth为某些模式提供了这个列表。
listening
listening smth
有了这个,很容易询问特定的过程,例如listening dropbox,或端口,例如listening 22。
listening dropbox
listening 22
lsof命令有一些专门的选项来询问端口、协议、进程等,但我个人发现上面的函数更方便,因为我不需要记住所有这些低级选项。
lsof
在OS X上,您可以使用netstat的-v选项来提供关联的pid。
类型:
netstat -anv | grep [.]PORT
输出将如下所示:
tcp46 0 0 *.8080 *.* LISTEN 131072 131072 3105 0
PID是最后一列前的数字,本案为3105
2016年1月更新
真的很惊讶没有人建议:
lsof -i :PORT_NUMBER
以获取所需的基本信息。例如,检查端口1337:
lsof -i :1337
其他变化,视情况而定:
sudo lsof -i :1337lsof -i tcp:1337
你可以很容易地在此基础上提取PID本身。例如:
lsof -t -i :1337
它也等价于(结果)此命令:
lsof -i :1337 | awk '{ print $2; }' | head -n 2 | grep -v PID
快速插图:
kill -9 <PID># kill -9 60401
或作为单行:
kill -9 $(lsof -t -i :1337)
我是一个Linux的人。在Linux用netstat -ltpn或这些字母的任何组合都非常容易。但在Mac OS Xnetstat -an | grep LISTEN中是最人性化的。其他的非常丑陋,在故障排除时很难记住。
netstat -ltpn
netstat -an | grep LISTEN
这做了我需要的。
ps -eaf | grep `lsof -t -i:$PORT`
我制作了一个小脚本,不仅可以查看谁在哪里收听,还可以显示已建立的连接以及与哪些国家的连接。适用于OSX Siera
#!/bin/bashprintf "\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); doprintf "$i : " & curl freegeoip.net/xml/$i -s -S | grep CountryName |cut -d ">" -f2 | cut -d"<" -f1done printf "\ndisplaying listening ports\n\n" sudo lsof -i -n -P | grep TCP | grep LISTEN | cut -d " " -f 1,32-35 #EOF
Sample outputchecking established connections 107.178.244.155 : United States17.188.136.186 : United States17.252.76.19 : United States17.252.76.19 : United States17.188.136.186 : United States5.45.62.118 : Netherlands40.101.42.66 : Ireland151.101.1.69 : United States173.194.69.188 : United States104.25.170.11 : United States5.45.62.49 : Netherlands198.252.206.25 : United States151.101.1.69 : United States34.198.53.220 : United States198.252.206.25 : United States151.101.129.69 : United States91.225.248.133 : Ireland216.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)
这可能是有用的检查,如果你连接到朝鲜!;-)
在macOS上,以下是一种简单的方法来获取使用netstat侦听特定端口的进程ID。此示例查找在端口80上提供内容的进程:
netstat -anv | egrep -w [.]80.*LISTEN
tcp4 0 0 *.80 *.* LISTEN 131072 131072 715 0
最后一列的第二个是PID。在上面,它是715。
-a-显示所有端口,包括服务器使用的端口
-a
-n-显示数字,不要查找名称。这使得命令很多更快
-v-详细输出,以获取进程ID
-v
-w-搜索词。否则,该命令将返回端口8000和8001的信息,而不仅仅是“80”
-w
LISTEN-仅为LISTEN模式下的端口提供信息,即服务器
LISTEN
在最新的macOS版本中,您可以使用此命令:
lsof -nP -i4TCP:$PORT | grep LISTEN
如果你觉得很难记住,那么也许你应该创建一个bash函数并用一个更友好的名字导出它,比如
bash
vi ~/.bash_profile
然后将以下行添加到该文件并保存它。
function listening_on() {lsof -nP -i4TCP:"$1" | grep LISTEN}
现在您可以在终端中键入listening_on 80并查看哪个进程正在侦听端口80。
listening_on 80
80
这是在macOS High Sierra上的一个好方法:
netstat -an |grep -i listen
对于侦听、已建立和已关闭的端口
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[over netstat]用于所有套接字
-n[over netstat]不解析名称,将网络地址显示为数字
在High Sierra 10.13.3和莫哈韦 10.14.3上测试最后一个语法netstat也适用于linux
在High Sierra 10.13.3和莫哈韦 10.14.3上测试
受用户Brent self启发:
lsof -i 4 -a | grep LISTEN
对于macOS,我同时使用两个命令来显示有关在机器上侦听的进程和连接到远程服务器的进程的信息。换句话说,要检查主机上的侦听端口和当前(TCP)连接,您可以一起使用以下两个命令
1. netstat -p tcp -p udp 2. lsof -n -i4TCP -i4UDP
我想我会添加我的输入,希望它最终能帮助某人。
查看此项目/工具:pros
在MacOS上安装:brew install procs
brew install procs
这允许您控制使用procs显示的内容。
procs
要查看TCP/UDP端口,请在安装工具后将其添加到~/.procs.toml。
~/.procs.toml
[[columns]]kind = "TcpPort"style = "BrightYellow|Yellow"numeric_search = truenonnumeric_search = falsealign = "Left" [[columns]]kind = "UdpPort"style = "BrightGreen|Green"numeric_search = falsenonnumeric_search = truealign = "Left"
这是一个示例输出:
只是对MichaüKalinowski的回答略有改进(我没有足够的声誉在那里发表评论):如果您试图找到在255及以下端口上监听的进程,grep命令可能会打印与IP地址相关的行,并且与所需结果不对应。对于具有任何数字的端口,grep命令也可能错误地匹配设备的MAC地址或PID。为了改进这一点,我建议将命令更改为grep --color ":$1 "
grep
grep --color ":$1 "