ChatGPT解决这个技术问题 Extra ChatGPT

如何通过 Windows 命令行关闭 TCP 和 UDP 端口

有人知道如何通过 Windows 命令行关闭单个连接的 TCP 或 UDP 套接字吗?

谷歌搜索,我看到有人问同样的事情。但答案看起来像是 netstat 或 netsh 命令的手册页,重点是如何监控端口。我不想要关于如何监控它们的答案(我已经这样做了)。我想关闭/杀死他们。

编辑,澄清一下:假设我的服务器监听 TCP 端口 80。客户端建立连接并为其分配端口 56789。然后,我发现这个连接是不受欢迎的(例如,这个用户正在做坏事,我们要求他们停止,但连接并没有在途中的某个地方断开)。通常,我会添加防火墙来完成这项工作,但这需要一些时间,而且我处于紧急情况。杀死拥有该连接的进程在这里确实是一个坏主意,因为这会关闭服务器(当我们只想有选择地暂时删除这个连接时,所有用户都会失去功能)。

为什么?您不能从命令行或文件关闭端口。您必须关闭拥有它们的程序。还是您指的是防火墙操作?你的问题还不清楚。

H
HaoQi Li

open cmd type in netstat -a -n -o find TCP [the IP address]:[port number] .... #[target_PID]#(UDP 同上)(顺便说一句,kill [target_PID] 对我不起作用) CTRL+ALT+DELETE 并选择“启动任务管理器” 点击“进程”选项卡 启用“PID”列:查看 > 选择列 > 选中 PID 框 找到感兴趣的 PID 和“结束进程” 现在你可以毫无问题地在 [IP 地址]:[端口号] 上重新运行服务器


您所说的只是杀死服务器进程并重新运行它,这是我想避免的,因为这会断开与服务器的每个连接,而不仅仅是不希望的连接。
抱歉,我没有帮助解决您的具体问题。我只是提供我的答案,因为当我在谷歌上搜索如何简单地关闭 Windows 端口时出现了您的问题,并认为这可能对其他遇到我的问题的人有所帮助。 :)
@HaoQiLi,你不能简单地结束一切。例如,处理 Windows 网络连接的 System 进程。
@HaoQiLi 我认为关闭我们可以使用 taskkill /pid 6168 /f 6168 是 pid
荒谬的是,当问题明确指出单一连接而不是整个过程时,这个答案有很多赞成!!!
B
Boussadjra Brahim

如果您知道要释放的端口,则可以通过查找特定端口来对 netstat 列表进行排序,如下所示:

netstat -ano | findstr :8080

然后 pid 将出现在您可以使用 taskkill 杀死的 rigth 上。

https://i.stack.imgur.com/vakVI.png

taskkill /pid 11704 /F

此外,您可能想查看专门针对 localhost 的 question,但我认为它是相关的:


我在 Windows 10 上进行了测试,它不会单独杀死 TCP 连接,而是使用它的整个进程或线程。正如维克多所说,这不是他的目标。
R
Rahul

例如你想释放端口 8080 然后,按照这些命令。

 netstat -ano
 taskkill /f /im [PID of the port 8080 got from previous command]

完毕!


对,它有助于在尝试定位 PID 时实际打印出 PID。 (这些人是谁?)。
这也杀死了提到的 pid 进程,而不仅仅是关闭端口。
我在 Windows 10 上进行了测试,它不会单独杀死 TCP 连接,而是使用它的整个进程或线程。正如维克多所说,这不是他的目标。
I
Ian Kemp

是的,这是可能的。您不必是拥有套接字的当前进程即可关闭它。考虑一下远程机器、网卡、网线和您的操作系统都可能导致套接字关闭。

还要考虑 Fiddler 和 Desktop VPN 软件可以将自己插入网络堆栈并向您显示所有流量或重新路由所有流量。

因此,您真正需要的只是让 Windows 提供一个直接允许这样做的 API,或者让某人编写一个运行有点像 VPN 或 Fiddler 的程序,并为您提供一种关闭通过它的套接字的方法。

至少有一个程序 (CurrPorts) 可以做到这一点,我今天使用它来关闭在启动 CurrPorts 之前启动的进程上的特定套接字。当然,要做到这一点,您必须以管理员身份运行它。

请注意,可能不容易导致程序不侦听端口(嗯,这是可能的,但该功能被称为防火墙......),但我认为这里没有被问到。我相信问题是“我如何有选择地关闭一个活动连接(套接字)到我的程序正在侦听的端口?”。问题的措辞有点偏离,因为给出了不希望的入站客户端连接的端口号,它被称为“端口”,但很明显它是对那个套接字的引用,而不是侦听端口。


是的,CP 是一个很棒的工具: CurrPorts.exe /close {Process Name} 这将是一行:CurrPorts.exe /close * 56789 * * server。可执行程序
CurrPorts 似乎无法关闭来自进程的 UDP 多播连接
P
Pang

使用 TCPView:http://technet.microsoft.com/en-us/sysinternals/bb897437.aspx
或 CurrPorts:https://www.nirsoft.net/utils/cports.html

或者,如果您不想使用外部软件(顺便说一下,这些工具不需要安装),您可以简单地首先运行 netstat 命令(最好是 netstat -b )然后设置本地安全策略来阻止 IP有问题的用户机器的地址,这就是我一直在使用不需要甚至未知的连接所做的事情——它允许你在没有任何外部软件的情况下做所有事情(一切都随 Windows 提供)......


也为我工作。我在本地计算机上使用了本地安全策略-> IPSecurity 策略。 UI 非常直观。
试过了,ipv6的关闭连接是灰色的,如果有的话,关闭ipv6的替代方法是什么?
P
Pang

试试 Sysinternals/Microsoft 的工具 TCPView (GUI) 和 Tcpvcon(命令行)。
https://docs.microsoft.com/en-us/sysinternals/downloads/tcpview


J
Jim G.

如果不关闭拥有这些套接字的进程,就无法关闭套接字。套接字归打开它们的进程所有。因此要找出 Unix/Linux 的进程 ID (PID)。像这样使用 netstat:

netstat -a -n -p -l

这将打印如下内容:

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State     PID/Program name   
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN     1879/sendmail: acce 
tcp        0      0 0.0.0.0:21                  0.0.0.0:*                   LISTEN     1860/xinetd         

其中 -a 打印所有套接字, -n 显示端口号, -p 显示 PID, -l 仅显示正在侦听的内容(这取决于您所追求的内容是可选的)。

您想要的真实信息是PID。现在我们可以通过执行以下操作来关闭该进程:

kill 1879

如果您要关闭服务,最好使用:

service sendmail stop

Kill 从字面上杀死了该进程及其拥有的任何子进程。使用 service 命令运行在 init.d 目录中注册的关闭脚本。如果您在服务上使用 kill 它可能无法正确启动备份,因为您没有正确关闭它。这仅取决于服务。

不幸的是,Mac 在这方面与 Linux/Unix 不同。你不能使用netstat。如果您对 Mac 感兴趣,请阅读本教程:

http://www.tech-recipes.com/rx/227/find-out-which-process-is-holding-which-socket-open/

如果您在 Windows 上使用 TaskManager 来终止进程,并使用服务 UI 来关闭服务。您可以像 Linux/Unix 一样在 Windows 上使用 netstat 来识别 PID。

http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/netstat.mspx?mfr=true


他澄清了他的问题,即远程客户端套接字,正如其他人指出的那样,可以用其他工具关闭。这个答案主要集中在不能(没有在操作系统内部摆弄)的服务器套接字上。这是如何干净地关闭拥有服务器套接字的进程,如果那是端口,这就是您想要做的。但是,如果您的服务器有很多传入连接,情况就不同了,您绝对可以杀死这些连接。这并没有错,只是不完全是OP的要求。
您应该删除“终止进程”部分,因为它不是问题的答案。您也可以停止网络适配器以停止流量,但它仍然不会仅杀死套接字!
答案仅对 ipv6 正确,对于 ipv4,您可以调用 SetTcpEntry
q
qwertzguy

使用 CurrPorts(免费且无需安装):http://www.nirsoft.net/utils/cports.html

/close <Local Address> <Local Port> <Remote Address> <Remote Port> {Process Name}

例子:

# Close all connections with remote port 80 and remote address 192.168.1.10: 
/close * * 192.168.1.10 80
# Close all connections with remote port 80 (for all remote addresses): 
/close * * * 80
# Close all connections to remote address 192.168.20.30: 
/close * * 192.168.20.30 *
# Close all connections with local port 80: 
/close * 80 * *
# Close all connections of Firefox with remote port 80: 
/close * * * 80 firefox.exe

它还有一个不错的 GUI,带有搜索和过滤功能。

注意:这个答案是 Huntharo 和 JasonXA 的答案和评论放在一起并简化,以使读者更容易。示例来自 CurrPorts 的网页。


A
AnatuGreen

如果您知道要终止的特定端口,只需以管理员身份打开命令提示符(在 Windows 上),然后:

npx 杀死端口 1900

上面的 1900 是我的端口号。当我想关闭一个运行 React-Native 开发工具(和 Expo)的端口时,我经常使用这个。原因是即使在关闭开发人员窗口或停止服务器之后,该端口仍然以某种方式仍在使用中。


c
chubbsondubs

如果不拥有这些套接字,就无法关闭服务器上的套接字,因此如果没有在拥有服务器套接字的进程中运行代码,就无法真正关闭套接字。

但是,还有另一个选项是告诉客户端关闭其套接字。向客户端连接的端口发送 RST TCP 数据包将导致客户端断开连接。您可以使用 nmap 进行 RST 扫描。

http://nmap.org/


M
Michael Mueller

我找到了这个问题的正确答案。试试 Sysinternals 的 TCPView,现在归微软所有。您可以在 http://technet.microsoft.com/en-us/sysinternals/bb897437 找到它


u
user3310805

wkillcx 是一个可靠的 windows 命令行工具,用于从尚未提及的命令行中终止 tcp 连接。但是,有时它确实与具有大量连接的服务器存在问题。我有时使用 tcpview 进行交互式杀戮,但 wkillcx 可以在脚本中使用。


M
Mochan

您可以使用 sysinternal 中的 tcpview 之类的程序。我想它可以在监视和终止不需要的连接方面为您提供很多帮助。


D
Darin Dimitrov

为了关闭端口,您可以识别正在侦听该端口的进程并终止该进程。


@Victor,我看到了,但没有办法在不关闭进程的情况下强行关闭端口。另一种可能性是以这样一种方式编写服务器程序,当您可以监视和管理客户端时,您有某种控制面板。
此外,如果套接字正在侦听的接口被关闭,则套接字将关闭。
我相信他是在问一个例子。
a
afarah

CurrPorts 对我们不起作用,我们只能通过 ssh 访问服务器,所以也没有 TCPView。我们也无法终止该进程,以免断开其他连接。我们最终做的并且尚未被建议的是阻止 Windows 防火墙上的连接。是的,这将阻止所有符合规则的连接,但在我们的例子中,只有一个连接(我们感兴趣的那个):

netsh advfirewall firewall add rule name="Conn hotfix" dir=out action=block protocol=T
CP remoteip=192.168.38.13

将 IP 替换为您需要的 IP,并在需要时添加其他规则。


C
Community

即时/可行/部分答案https://stackoverflow.com/a/20130959/2584794

与之前使用 netstat -a -o -n 的答案不同,long list使用这些端口在没有应用程序名称的情况下进行调查


这和李昊琪的回答几乎是一样的。这将杀死丢弃每个连接的服务器进程,而不仅仅是不希望的连接。挑战是只丢弃不受欢迎的人,仅此而已。
我同意维克多。这不是问题的答案。所以你也可以禁用网络适配器...
B
Bijay Budhathoki

是的 可以关闭 TCP 或 UDP 端口 DOS 中有一个命令

TASKKILL /f /pid 1234 

我希望这对你有用


我在 Windows 10 上进行了测试,它不会单独杀死 TCP 连接,而是使用它的整个进程或线程。正如维克多所说,这不是他的目标。
V
Victor Stafusa

如果您在 Windows 8 上运行,`Windows Server 2012 或更高版本并安装了以上版本的 PowerShell v4,您可以使用以下脚本。这会找到与端口关联的进程并终止它们。

代码

#which port do you want to kill
[int]$portOfInterest = 80

#fetch the process ids related to this port
[int[]]$processId = Get-NetTCPConnection -LocalPort $portOfInterest | 
    Select-Object -ExpandProperty OwningProcess -Unique | 
    Where-Object {$_ -gt 0} 

#kill those processes
Stop-Process -Id $processId 

文档:

Get-NetTCPConnection - PowerShell 的 NetStat 等效项

Select-Object - 从对象中拉回特定属性/删除重复项

Where-Object - 根据某些条件过滤值

Stop-Process - PowerShell 的 TaskKill 等效项


我在 Windows 10 上进行了测试,它不会单独杀死 TCP 连接,而是使用它的整个进程或线程。正如维克多所说,这不是他的目标。

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅