如何找出哪个进程正在侦听 Windows 上的 TCP 或 UDP 端口?
Posted
技术标签:
【中文标题】如何找出哪个进程正在侦听 Windows 上的 TCP 或 UDP 端口?【英文标题】:How can you find out which process is listening on a TCP or UDP port on Windows? 【发布时间】:2010-09-08 01:43:38 【问题描述】:【问题讨论】:
Currports 也是一个帮助搜索+过滤的工具nirsoft.net/utils/cports.html 我在 IntelliJ 下尝试以调试模式运行 Tomcat 时遇到了这个问题,对我来说最好的解决方案是更改调试传输配置(File->Settings->Build/exe/deploy- >调试器)从“套接字”到“共享内存”。netstat -aof | findstr :8080
(为任何端口更改 8080)
@DavidJesus 在 Windows 10 上不显示进程。
@SmitJohnth 我使用netstat -aof | findstr :3306
在 Windows 10 上查找 mysql 进程,并且工作起来很神奇。
【参考方案1】:
有一个适用于 Windows 的原生 GUI:
开始菜单 → 所有程序 → 附件 → 系统工具 → 资源监视器
或运行resmon.exe
,
或从 TaskManager → Performance 选项卡。
【讨论】:
还显示绑定的防火墙状态(最后一列)。非常实用。 您需要成为管理员(或该组中的管理员)才能运行它。 @bcorso,绑定到“unspecified address”是什么意思? 也可以从任务管理器的“性能”选项卡中启动,至少在 Windows 10 中。(未检查其他版本。) 上面@user4836454 的评论不正确:资源监视器确实显示带有侦听器的端口,即使这些端口没有网络连接。只需查看“侦听端口”部分而不是“TCP 连接”部分。【参考方案2】:netstat -aof | findstr :8080
(为任何端口更改 8080)
【讨论】:
【参考方案3】:如果有人像我一样需要 macOS 的等价物,那就是:
lsof -i tcp:8080
在你得到进程的PID
后,你可以杀死它:
kill -9 <PID>
【讨论】:
【参考方案4】:您还可以使用以下命令检查保留的端口。例如,Hyper-V 会保留一些端口。
netsh int ipv4 show excludedportrange protocol=tcp
【讨论】:
【参考方案5】:新答案,powershell
TCP
Get-Process -Id (Get-NetTCPConnection -LocalPort YourPortNumberHere).OwningProcess
UDP
Get-Process -Id (Get-NetUDPEndpoint -LocalPort YourPortNumberHere).OwningProcess
旧答案,cmd
C:\> netstat -a -b
(添加 -n 以阻止它尝试解析主机名,这将使其更快。)
请注意 Dane 对 TCPView 的建议。看起来很有用!
-a 显示所有连接和监听端口。
-b 显示创建每个连接或侦听端口所涉及的可执行文件。在某些情况下,众所周知的可执行文件包含多个独立的组件,在这些情况下,会显示创建连接或侦听端口所涉及的组件序列。在这种情况下,可执行文件名称在底部的 [] 中,顶部是它调用的组件,依此类推,直到到达 TCP/IP。请注意,此选项可能很耗时,并且除非您拥有足够的权限,否则会失败。
-n 以数字形式显示地址和端口号。
-o 显示与每个连接关联的拥有进程 ID。
【讨论】:
和 taskkill /PID1234
- 然后您可以使用 tasklist /fi "pid eq 1234"
找出进程的名称和其他详细信息。
@RodionSychev powershell 命令希望您将“portNumber”替换为您要查找的端口号。错误指出“portNumber”不是数字。【参考方案6】:
在 Windows 10 或 Windows Server 2016 上使用 PowerShell 5,运行 Get-NetTCPConnection
cmdlet。我想它也应该适用于旧的 Windows 版本。
Get-NetTCPConnection
的默认输出由于某种原因不包含进程 ID,这有点令人困惑。但是,您始终可以通过格式化输出来获得它。您正在寻找的房产是OwningProcess
。
如果您想找出正在侦听端口 443 的进程的 ID,请运行以下命令:
PS C:\> Get-NetTCPConnection -LocalPort 443 | Format-List
LocalAddress : ::
LocalPort : 443
RemoteAddress : ::
RemotePort : 0
State : Listen
AppliedSetting :
OwningProcess : 4572
CreationTime : 02.11.2016 21:55:43
OffloadState : InHost
将输出格式化为具有您要查找的属性的表格:
PS C:\> Get-NetTCPConnection -LocalPort 443 | Format-Table -Property LocalAddress, LocalPort, State, OwningProcess
LocalAddress LocalPort State OwningProcess
------------ --------- ----- -------------
:: 443 Listen 4572
0.0.0.0 443 Listen 4572
如果您想找出进程的名称,请运行以下命令:
PS C:\> Get-Process -Id (Get-NetTCPConnection -LocalPort 443).OwningProcess
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
143 15 3448 11024 4572 0 VisualSVNServer
【讨论】:
【参考方案7】:使用这些工具:来自 cmd:C:\> netstat -anob
,具有 Administrator 权限。
Process Explorer
Process Dump
Port Monitor
全部来自 sysinternals.com。
如果你只是想知道进程运行和每个进程下的线程,我建议学习wmic
。它是一个很棒的命令行工具,它可以为您提供比您知道的更多的东西。
例子:
c:\> wmic process list brief /every:5
上述命令将每 5 秒简要显示一次所有进程列表。要了解更多信息,您可以使用 windows 的 /?
命令,例如,
c:\> wmic /?
c:\> wmic process /?
c:\> wmic prcess list /?
等等等等。 :)
【讨论】:
PortMon(Port Monitor 后面的链接)用于监控 serial 和 parallel 端口,而不是网络端口。【参考方案8】:查找使用8000端口的pid
netstat -aon | findstr '8000'
在 Windows 中终止该进程
taskkill /pid pid /f
其中 pid 是您从第一个命令中获得的进程 ID
【讨论】:
netstat -aon | findstr 8000。引号不需要。 PID 是最后一列第一个命令返回的值。【参考方案9】:根据info 和kill 的答案,对我来说,将它们组合在one command 中很有用。您可以从 cmd 运行它以获取有关侦听给定端口(例如 8080)的进程的信息:
for /f "tokens=3 delims=LISTENING" %i in ('netstat -ano ^| findStr "8080" ^| findStr "["') do @tasklist /nh /fi "pid eq %i"
或者如果你想杀死它:
for /f "tokens=3 delims=LISTENING" %i in ('netstat -ano ^| findStr "8080" ^| findStr "["') do @Taskkill /F /IM %i
您也可以将这些命令放入 bat 文件中(它们会略有不同 - 将 %i
替换为 %%i
):
文件portInfo.bat
for /f "tokens=3 delims=LISTENING" %%i in (
'netstat -ano ^| findStr "%1" ^| findStr "["'
) do @tasklist /nh /fi "pid eq %%i"
文件portKill.bat
for /f "tokens=3 delims=LISTENING" %%i in (
'netstat -ano ^| findStr "%1" ^| findStr "["'
) do @Taskkill /F /IM %%i
然后你从 cmd 你可以这样做:
portInfo.bat 8080
或
portKill.bat 8080
【讨论】:
这可能是一个有用的脚本。但是,我在 CMD 和 PowerShell 6 中尝试过,但没有成功。也许你可以通过提供更多细节来改进你的答案。 第一部分有效吗?只是“蝙蝠”的问题吗?传递变量有一些区别: (%%i ) @Manfred 我已经在 3 个不同的 Windows 10 上尝试过这个。例如,PowerShell 中的.\portInfo.bat 800
会给出这样的结果:C:\work>for /F "tokens=3 delims=LISTENING" %i in ('netstat -ano | findStr "800" | findStr "["') do (tasklist /fi "pid eq %i" ) C:\work>(tasklist /fi "pid eq 4" ) Image Name PID Session Name Session# Mem Usage ========================= ======== ================ =========== ============ System 4 Services 0 1,820 K
抱歉,不走运。我将该命令放入 powershell 终端中名为portInfo.bat
的文件中,然后执行.\portInfo.bat 8080
。输出只是批处理文件的内容。很好posslble我忽略了一些东西。请注意,我在 Windows 10 上使用 PowerShell 6.2.3。我也在常规命令提示符下尝试过,但结果是一样的:脚本内容的输出。我确定我错过了一项重要的信息来完成这项工作。
为什么不添加 /nh
: @tasklist /nh /fi "pid eq %i"
?确切地说是门:Findstr ":8080"
【参考方案10】:
对我有帮助的单行解决方案就是这个。只需将 3000 替换为您的端口即可:
$P = Get-Process -Id (Get-NetTCPConnection -LocalPort 3000).OwningProcess; Stop-Process $P.Id
编辑:将 kill
更改为 Stop-Process
以获得更多类似 PowerShell 的语言
【讨论】:
您可能不想自动终止该进程。我会分开那个 kill 命令并解释它。不要让一些糟糕的用户在不仔细考虑的情况下复制粘贴。 如果您要使用完整的 PowerShell 解决方案,请将 kill 更改为 Stop-ProcessGet-Process -Id (Get-NetTCPConnection -LocalPort 3000).OwningProcess | Stop-Process
【参考方案11】:
打开命令提示符 - 开始 → 运行 → cmd
,或开始菜单 → 所有程序 → 附件 → 命令提示符。
类型
netstat -aon | findstr '[port_number]'
将[port_number]
替换为您要检查的实际端口号,然后按Enter。
-
如果任何应用程序正在使用该端口,则会显示该应用程序的详细信息。显示在列表最后一列的数字是该应用程序的 PID(进程 ID)。记下这一点。
类型
tasklist | findstr '[PID]'
将[PID]
替换为上述步骤中的数字,然后按Enter。
-
您将看到使用您的端口号的应用程序名称。
【讨论】:
在 Win 10 上:您在第 2 步和第 4 步中的命令不起作用,除非您将单引号替换为双引号。应该说 netstat -aon | findstr "[port_number]" 此解决方案不需要提升权限。谢了!【参考方案12】:要找出哪个特定进程(PID)正在使用哪个端口:
netstat -anon | findstr 1234
其中 1234 是您的进程的 PID。 [转到任务管理器 → 服务/进程选项卡以找出您的应用程序的 PID。]
【讨论】:
需要注意的是,-n
标志不需要设置两次。 -ano
就够了。【参考方案13】:
网络统计:
-a 显示所有连接和监听端口 -b 显示可执行文件 -n 停止解析主机名(数字形式)-o 拥有进程
netstat -bano | findstr "7002"
netstat -ano > ano.txt
Currports 工具有助于搜索和过滤
【讨论】:
【参考方案14】:使用下面的批处理脚本,它将进程名称作为参数并为进程提供netstat
输出。
@echo off
set procName=%1
for /f "tokens=2 delims=," %%F in ('tasklist /nh /fi "imagename eq %1" /fo csv') do call :Foo %%~F
goto End
:Foo
set z=%1
echo netstat for : "%procName%" which had pid "%1"
echo ----------------------------------------------------------------------
netstat -ano |findstr %z%
goto :eof
:End
【讨论】:
【参考方案15】:使用 PowerShell... ...这将是您的朋友(将 8080 替换为您的端口号):
netstat -abno | Select-String -Context 0,1 -Pattern 8080
样本输出
> TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 2920
[tnslsnr.exe]
> TCP [::]:8080 [::]:0 LISTENING 2920
[tnslsnr.exe]
因此,在本例中,tnslsnr.exe(OracleXE 数据库)正在侦听端口 8080。
快速解释
Select-String
用于过滤 netstat
的冗长输出以获取相关行。
-Pattern
针对正则表达式测试每一行。
-Context 0,1
将为每个模式匹配输出 0 个前导行和 1 个尾随行。
【讨论】:
【参考方案16】:只需打开一个命令外壳并输入(假设您的端口是 123456):
netstat -a -n -o | find "123456"
你会看到你需要的一切。
标题是:
Proto Local Address Foreign Address State PID
TCP 0.0.0.0:37 0.0.0.0:0 LISTENING 1111
正如提到的here。
【讨论】:
仅供参考/对于任何感兴趣的人:它是findstr 123456
(不带引号)或find "123456"
(带引号)。 (@Josh)【参考方案17】:
输入命令:netstat -aon | findstr :DESIRED_PORT_NUMBER
比如我要查找80端口:netstat -aon | findstr :80
这个答案最初发布到this question。
【讨论】:
【参考方案18】:对于使用 PowerShell 的用户,请尝试Get-NetworkStatistics
:
> Get-NetworkStatistics | where Localport -eq 8000
ComputerName : DESKTOP-JL59SC6
Protocol : TCP
LocalAddress : 0.0.0.0
LocalPort : 8000
RemoteAddress : 0.0.0.0
RemotePort : 0
State : LISTENING
ProcessName : node
PID : 11552
【讨论】:
【参考方案19】:在 Windows 中从 PID 获取端口号非常简单。
以下是步骤:
运行→输入cmd→按Enter。
编写以下命令...
netstat -aon | findstr [port number]
(注意:不要包括方括号。)
按 Enter...
然后 cmd 将为您提供在该端口上运行的服务的详细信息以及 PID。
打开任务管理器并点击服务选项卡并将PID与cmd的PID匹配,就是这样。
【讨论】:
【参考方案20】:首先,我们找到需要消除的特定任务的进程 ID,以便释放端口:
输入
netstat -n -a -o
在 Windows 命令行提示符 (cmd) 中执行此命令后,选择我认为是最后一列的 pid。假设这是 3312。
现在输入
taskkill /F /PID 3312
您现在可以通过键入netstat
命令进行交叉检查。
注意:有时 Windows 不允许您直接在 CMD 上运行此命令,因此首先您需要执行以下步骤:
从开始菜单 -> 命令提示符(右键单击命令提示符,并以管理员身份运行)
【讨论】:
【参考方案21】:要获取与每个连接关联的所有拥有进程 ID 的列表:
netstat -ao |find /i "listening"
如果想杀死任何有ID的进程并使用该命令,使端口变为空闲
Taskkill /F /IM PID of a process
【讨论】:
这不考虑监听 UDP 端口【参考方案22】:netstat -ao
和 netstat -ab
告诉你应用程序,但如果你不是系统管理员,你会得到“请求的操作需要提升”。
这并不理想,但如果您使用 Sysinternals 的Process Explorer,您可以转到特定进程的属性并查看 TCP 选项卡以查看它们是否正在使用您感兴趣的端口。这有点针锋相对的事情,但也许它会帮助某人......
【讨论】:
如果您不是管理员,您将无法使用进程资源管理器(甚至 Windows 任务管理器 > 资源管理器)从任何不属于您的进程中获取此信息。 【参考方案23】:运行以下命令可以获得更多信息:
netstat -aon | find /i "listening" |find "port"
使用“查找”命令可以过滤结果。 find /i "listening"
将仅显示“正在侦听”的端口。请注意,您需要 /i
忽略大小写,否则您将键入 find "LISTENING"。 | find "port"
会将结果限制为仅包含特定端口号的结果。请注意,在此它还将过滤在响应字符串中任何位置具有端口号的结果。
【讨论】:
FWIW 尝试在 PowerShell v2.0 中运行它会产生错误FIND: Parameter format not correct
。您需要在查找条件之后添加一个空格。这将为您留下netstat -aon | find /i "listening" | find "1234 "
。
将上面的“port”替换为您的端口,例如“5000”
@self。即使在管道后添加空格,我仍然会在 PS 5.1 中遇到该错误。你知道发生了什么吗?
@NickeManarinin & @self 要么首先从 powershell 更改为 cmd(只需键入 cmd 并按 enter 然后重做命令)或在 powershell 中使用此命令:netstat -aon |find /i "@987654327 @"listeningback tick
"" |find "back tick
"portback tick
"" (back tick这个词,因为我无法添加实际字符,因为它认为它是一个剪辑)
【参考方案24】:
用途:
netstat -a -o
这显示了在特定端口上运行的进程的 PID。
记住进程ID并转到任务管理器和服务或详细信息选项卡并结束具有相同PID的进程。
因此,您可以终止在 Windows 中特定端口上运行的进程。
【讨论】:
【参考方案25】:如果您想使用 GUI 工具来执行此操作,请访问 Sysinternals' TCPView。
【讨论】:
【参考方案26】:如果您需要 GUI,请使用 TCPView。这是微软收购的旧的Sysinternals 应用程序。
【讨论】:
在我看来这是最好的选择,特别是因为所有进程都在同一个列表中,您可以通过右键单击它们直接关闭进程。 另外,这不需要管理员权限! 我喜欢 TCPView。自 Windows XP 以来,它一直是我的首选!【参考方案27】:对于 Windows:
netstat -aon | find /i "listening"
【讨论】:
+1 但请记住,如果您的 Windows 以英语以外的语言运行,您将不得不将“聆听”更改为本地术语。例如。netstat -aon | find /i "abhören"
德语。
在我的情况下它不起作用可能是因为引号符号,但解决方案 netstat -aon | findstr LISTENING 完美!
我在尝试使用 PowerShell 在 W10 15063.729 上运行此命令时遇到错误:FIND: Parameter format not correct
这个答案与“找出哪个进程 [name] 正在侦听 Windows 上的端口有什么关系?”
如果在 Windows 上使用 git bash,则使用 //i 而不是 /i【参考方案28】:
以编程方式,您需要来自iphlpapi.h 的内容,例如GetTcpTable2()。像 MIB_TCP6ROW2 这样的结构包含所有者 PID。
【讨论】:
【参考方案29】:大多数答案中提到的 -b 开关要求您在计算机上具有管理权限。您真的不需要提升权限来获取进程名称!
查找在端口号(例如8080)中运行的进程的pid
netstat -ano | findStr "8080"
通过pid查找进程名
tasklist /fi "pid eq 2216"
【讨论】:
【参考方案30】:我推荐 NirSoft 的 CurrPorts。
CurrPorts 可以过滤显示的结果。 TCPView 没有这个功能。
注意:您可以右键单击进程的套接字连接并选择“关闭选定的 TCP 连接”(您也可以在 TCPView 中执行此操作)。这通常可以解决我在切换 *** 后使用 Outlook 和 Lync 时遇到的连接问题。使用 CurrPorts,您还可以使用“/close”参数从命令行关闭连接。
【讨论】:
以上是关于如何找出哪个进程正在侦听 Windows 上的 TCP 或 UDP 端口?的主要内容,如果未能解决你的问题,请参考以下文章