在 Linux 上,我可以使用netstat -pntl | grep $PORT
或fuser -n tcp $PORT
找出哪个进程 (PID) 正在侦听指定的 TCP 端口。如何在 Mac OS X 上获得相同的信息?
18 回答
在 macOSBig Sur
及更高版本上,使用以下命令:
sudo lsof -i -P | grep LISTEN | grep :$PORT
或者只查看 IPv4:
sudo lsof -nP -i4TCP:$PORT | grep LISTEN
在旧版本上,使用以下形式之一:
sudo lsof -nP -iTCP:$PORT | grep LISTEN
sudo lsof -nP -i:$PORT | grep LISTEN
替换$PORT
为端口号或以逗号分隔的端口号列表。
如果您需要关于 #1024 以下端口的信息,请在前面添加sudo
(后跟空格)。
该-n
标志用于显示 IP 地址而不是主机名。这使得命令执行得更快,因为获取主机名的 DNS 查找可能很慢(对于许多主机来说是几秒钟或一分钟)。
该-P
标志用于显示原始端口号,而不是像解析的名称http
,ftp
或更深奥的服务名称,如dpserve
, socalia
。
有关更多选项,请参阅评论。
为了完整起见,因为经常一起使用:
要杀死 PID:
sudo kill -9 <PID>
# kill -9 60401
直到macOS 12 Monterey,每个版本的 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
并将其用于某种模式。
有了这个,就很容易询问特定的进程,例如listening dropbox
,或端口,例如listening 22
。
lsof
command 有一些专门的选项来询问端口、协议、进程等,但我个人发现上面的函数更方便,因为我不需要记住所有这些低级选项。lsof
是相当强大的工具,但不幸的是使用起来不太舒服。
您还可以使用:
sudo lsof -i -n -P | grep TCP
这适用于小牛队。
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)
这适用于 Mavericks (OSX 10.9.2)。
sudo lsof -nP -iTCP:$PORT -sTCP:LISTEN
对于 LISTEN、ESTABLISHED 和 CLOSED 端口
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 和Mojave 10.14.3上测试
- 最后一个语法netstat也适用于 linux
在 OS X 上,您可以使用 netstat 的 -v 选项来提供关联的 pid。
类型:
netstat -anv | grep [.]PORT
输出将如下所示:
tcp46 0 0 *.8080 *.* LISTEN 131072 131072 3105 0
PID 是最后一列之前的数字,在这种情况下为 3105
在 macOS 上,这是一种使用netstat获取正在侦听特定端口的进程 ID 的简单方法。此示例查找在端口 80 上提供内容的进程:
查找在 80 端口上运行的服务器
netstat -anv | egrep -w [.]80.*LISTEN
样本输出
tcp4 0 0 *.80 *.* LISTEN 131072 131072 715 0
最后一列的第二个是PID。在上面,它是715。
选项
-a
- 显示所有端口,包括服务器使用的端口
-n
- 显示数字,不要查名字。这使命令更快
-v
- 详细输出,获取进程 ID
-w
- 搜索词。否则,该命令将返回端口 8000 和 8001 的信息,而不仅仅是“80”
LISTEN
- 仅提供 LISTEN 模式下端口的信息,即服务器
在最新的 macOS 版本上,您可以使用以下命令:
lsof -nP -i4TCP:$PORT | grep LISTEN
如果您觉得很难记住,那么也许您应该创建一个bash
函数并使用更友好的名称将其导出,如下所示
vi ~/.bash_profile
然后将以下行添加到该文件并保存它。
function listening_on() {
lsof -nP -i4TCP:"$1" | grep LISTEN
}
现在您可以输入listening_on 80
终端并查看正在侦听端口的进程80
。
在 Snow Leopard (OS X 10.6.8) 上,运行“man lsof”会产生:
lsof -i 4 -a
(实际手动输入是 'lsof -i 4 -a -p 1234')
以前的答案在雪豹上不起作用,但我一直在尝试使用“netstat -nlp”,直到我看到 pts 在答案中使用了“lsof”。
我是一个 Linux 人。netstat -ltpn
在 Linux 中,使用这些字母或这些字母的任意组合非常容易。但在 Mac OS Xnetstat -an | grep LISTEN
中是最人性化的。其他的非常难看,故障排除时很难记住。
lsof -n -i | awk '{ print $1,$9; }' | sort -u
这显示了谁在做什么。删除 -n 以查看主机名(有点慢)。
这做了我需要的。
ps -eaf | grep `lsof -t -i:$PORT`
我制作了一个小脚本,不仅可以查看谁在哪里收听,还可以显示已建立的连接以及与哪些国家/地区的连接。适用于 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)
这可能有助于检查您是否连接到朝鲜!;-)
签出这个项目/工具:procs
在 MacO 上安装:brew install procs
这使您可以控制要显示的内容procs
。
要查看 TCP/UDP 端口,请~/.procs.toml
在安装工具后添加以下内容。
[[columns]]
kind = "TcpPort"
style = "BrightYellow|Yellow"
numeric_search = true
nonnumeric_search = false
align = "Left"
[[columns]]
kind = "UdpPort"
style = "BrightGreen|Green"
numeric_search = false
nonnumeric_search = true
align = "Left"
这是一个示例输出:
受用户 Brent Self 的启发:
lsof -i 4 -a | grep LISTEN
对于 macOS,我同时使用两个命令来显示有关在机器上侦听的进程和连接到远程服务器的进程的信息。换句话说,要检查主机上的侦听端口和当前 (TCP) 连接,您可以同时使用以下两个命令
1. netstat -p tcp -p udp
2. lsof -n -i4TCP -i4UDP
以为我会添加我的输入,希望它最终可以帮助某人。
这是 macOS High Sierra 上的一个好方法:
netstat -an |grep -i listen