【问题标题】:How to close TCP and UDP ports via windows command line如何通过 windows 命令行关闭 TCP 和 UDP 端口
【发布时间】:2012-01-31 02:47:28
【问题描述】:

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

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

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

【问题讨论】:

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

标签: networking


【解决方案1】:

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

【讨论】:

  • @Victor,我看到了,但是没有办法在不关闭进程的情况下强制关闭端口。另一种可能性是编写服务器程序,以便在您可以监视和管理客户端时拥有某种控制面板。
  • 另外,如果套接字正在侦听的接口被关闭,套接字将关闭。
  • 我相信他是在问一个例子。
【解决方案2】:

如果不关闭拥有这些套接字的进程,就无法关闭套接字。套接字归打开它们的进程所有。因此要找出 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
【解决方案3】:

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

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

http://nmap.org/

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

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

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

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

      【讨论】:

      • 是的,CP 是一个很棒的工具: CurrPorts.exe /close {Process Name} 这将是一行:CurrPorts.exe /close * 56789 * * server.exe
      • CurrPorts 似乎无法关闭来自进程的 UDP 多播连接
      【解决方案6】:
      1. 打开cmd

        • 输入netstat -a -n -o

        • 找到TCP [the IP address]:[port number] .... #[target_PID]#(UDP 同上)

        • (顺便说一句,kill [target_PID] 对我不起作用)

      2. CTRL+ALT+DELETE 并选择“启动任务管理器”

        • 点击“进程”标签

        • 通过以下方式启用“PID”列:查看 > 选择列 > 选中 PID 复选框

        • 找到感兴趣的 PID 和“END PROCESS”

      3. 现在您可以毫无问题地在 [IP 地址]:[端口号] 上重新运行服务器

      【讨论】:

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

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

      【讨论】:

        【解决方案8】:

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

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

        【讨论】:

        • 这和李浩奇的回答差不多。这将杀死丢弃每个连接的服务器进程,而不仅仅是不希望的连接。挑战在于只丢弃不受欢迎的那个,仅此而已。
        • 我同意维克多的观点。这不是问题的答案。所以你也可以禁用网络适配器...
        【解决方案9】:

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

        【讨论】:

          【解决方案10】:

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

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

          【讨论】:

          • 也为我工作。我在本地计算机上使用了本地安全策略-> IPSecurity 策略。用户界面非常直观。
          • 试过了,ipv6的关闭连接是灰色的,如果有的话,关闭ipv6的替代方法是什么?
          【解决方案11】:

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

          【解决方案12】:

          使用 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 的网页。

          【讨论】:

            【解决方案13】:

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

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

            完成!

            【讨论】:

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

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

            TASKKILL /f /pid 1234 
            

            我希望这对你有用

            【讨论】:

            • 我在 Windows 10 上进行了测试,它并没有单独杀死 TCP 连接,而是整个进程或线程使用它。正如维克多所说,这不是他的目标。
            【解决方案15】:

            如果您在 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 
            

            文档:

            【讨论】:

            • 我在 Windows 10 上进行了测试,它并没有单独杀死 TCP 连接,而是整个进程或线程使用它。正如维克多所说,这不是他的目标。
            【解决方案16】:

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

            netstat -ano | findstr :8080
            

            然后pid会出现在你可以用taskkill杀死的rigth。

            taskkill /pid 11704 /F
            

            你也可能想看看这个question,它专门用于本地主机,但我认为它是相关的:

            【讨论】:

            • 我在 Windows 10 上进行了测试,它并没有单独杀死 TCP 连接,而是整个进程或线程使用它。正如维克多所说,这不是他的目标。
            【解决方案17】:

            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,并在需要时添加其他规则。

            【讨论】:

              【解决方案18】:

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

              npx kill-port 1900

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

              【讨论】:

                猜你喜欢
                • 2012-05-18
                • 2011-07-31
                • 2015-04-15
                • 1970-01-01
                • 1970-01-01
                • 2010-09-08
                • 2010-09-28
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多