自上篇之后,在windows中也会有类似的需求,而windows系统环境下并没有lsof这个指令。

因此转而使用netstat(显示协议统计信息和当前 TCP/IP 网络连接的工具)来查询。

在Windows中的netstat参数和作用不太一样需要特别注意。

直接在CMD中输入netstat ?即可获得参数帮助:

NETSTAT [-a] [-b] [-e] [-f] [-i] [-n] [-o] [-p proto] [-r] [-s] [-t] [-x] [-y] [interval]

  -a            显示所有连接和侦听端口。
  -b            显示在创建每个连接或侦听端口时涉及的
                可执行文件。在某些情况下,已知可执行文件托管
                多个独立的组件,此时会
                显示创建连接或侦听端口时
                涉及的组件序列。在此情况下,可执行文件的
                名称位于底部 [] 中,它调用的组件位于顶部,
                直至达到 TCP/IP。注意,此选项
                可能很耗时,并且可能因为你没有足够的
                权限而失败。
  -e            显示以太网统计信息。此选项可以与 -s 选项
                结合使用。
  -f            显示外部地址的完全限定
                域名(FQDN)。
  -i            显示 TCP 连接在当前状态所花费的时间。
  -n            以数字形式显示地址和端口号。
  -o            显示拥有的与每个连接关联的进程 ID。
  -p proto      显示 proto 指定的协议的连接;proto
                可以是下列任何一个: TCP、UDP、TCPv6 或 UDPv6。如果与 -s
                选项一起用来显示每个协议的统计信息,proto 可以是下列任何一个:
                IP、IPv6、ICMP、ICMPv6、TCP、TCPv6、UDP 或 UDPv6。
  -q            显示所有连接、侦听端口和绑定的
                非侦听 TCP 端口。绑定的非侦听端口
               不一定与活动连接相关联。
  -r            显示路由表。
  -s            显示每个协议的统计信息。默认情况下,
                显示 IP、IPv6、ICMP、ICMPv6、TCP、TCPv6、UDP 和 UDPv6 的统计信息;
                -p 选项可用于指定默认的子网。
  -t            显示当前连接卸载状态。
  -x            显示 NetworkDirect 连接、侦听器和共享
                终结点。
  -y            显示所有连接的 TCP 连接模板。
                无法与其他选项结合使用。
  interval      重新显示选定的统计信息,各个显示间暂停的
                间隔秒数。按 CTRL+C 停止重新显示
                统计信息。如果省略,则 netstat 将打印当前的
                配置信息一次。

在这里我主要用到ano三个参数。

image.png

命令返回值的最后一列即第五列就是对应的PID,比如这里的135端口所对应的进程号是1816。

如果需要指定查询对应的连接或者端口号就需要配合使用findstr指令。

比如我是用ssh客户端连接了192.168.3.42的22端口:

image.png

其中第二列代表本机ip以及本机占用的端口号,第三列代表和外部通信的对端ip以及对端端口号。最后一列就是PID。

想要关闭该进程则需要使用taskkill指令。

taskkill /F /PID 19636

image.png

同样,上面的方法是人工输入PID来结束进程,如果改为自动查找并结束则是:

for /f "tokens=5" %r in ('netstat /ano ^|findstr 192.168.3.42:22') do taskkill /F /PID %r

命令中^是转义字符


  • for /f 语法介绍:
FOR /F ["options"] %i IN (file) DO command
FOR /F ["options"] %i IN ("string") DO command--注意双引号
FOR /F ["options"] %i IN ('command') DO command--注意单引号

["options"]选项有多个:

 eol=c           - 指定一个行注释字符,遇到c开头的行就忽略掉。
 skip=n          - 指定在文件开始时忽略的行数。
 delims=xxx      - 指定分隔符。默认是空格和TAB。

 tokens=x,y,m-n  - 指每行的哪一个符号被传递到每个迭代
                   的 for 本身。这会导致额外变量名称的分配。m-n
                   格式为一个范围。通过 nth 符号指定 mth。如果
                   符号字符串中的最后一个字符星号,
                   那么额外的变量将在最后一个符号解析之后
                   分配并接受行的保留文本。
 usebackq        - 1.把单引号字符串作为命令;2.允许中使用双引号扩起文件名称。

这里主要说明for /f的用法。上面的命令中就是用了tokens选项,它用来确定使用待选文本的哪一列。

  • TASKKILL语法:
TASKKILL [/S system [/U username [/P [password]]]]
         { [/FI filter] [/PID processid | /IM imagename] } [/T] [/F]

描述:
    使用该工具按照进程 ID (PID) 或映像名称终止任务。

参数列表:
    /S    system           指定要连接的远程系统。

    /U    [domain\]user    指定应该在哪个用户上下文执行这个命令。

    /P    [password]       为提供的用户上下文指定密码。如果忽略,提示
                           输入。

    /FI   filter           应用筛选器以选择一组任务。
                           允许使用 "*"。例如,映像名称 eq acme*

    /PID  processid        指定要终止的进程的 PID。
                           使用 TaskList 取得 PID。

    /IM   imagename        指定要终止的进程的映像名称。通配符 '*'可用来
                           指定所有任务或映像名称。

    /T                     终止指定的进程和由它启用的子进程。

    /F                     指定强制终止进程。

    /?                     显示帮助消息。

筛选器:
    筛选器名      有效运算符                有效值
    -----------   ---------------           -------------------------
    STATUS        eq, ne                    RUNNING |
                                            NOT RESPONDING | UNKNOWN
    IMAGENAME     eq, ne                    映像名称
    PID           eq, ne, gt, lt, ge, le    PID 值
    SESSION       eq, ne, gt, lt, ge, le    会话编号。
    CPUTIME       eq, ne, gt, lt, ge, le    CPU 时间,格式为
                                            hh:mm:ss。
                                            hh - 时,
                                            mm - 分,ss - 秒
    MEMUSAGE      eq, ne, gt, lt, ge, le    内存使用量,单位为 KB
    USERNAME      eq, ne                    用户名,格式为 [domain\]user
    MODULES       eq, ne                    DLL 名称
    SERVICES      eq, ne                    服务名称
    WINDOWTITLE   eq, ne                    窗口标题

    说明
    ----
    1) 只有在应用筛选器的情况下,/IM 切换才能使用通配符 '*'。
    2) 远程进程总是要强行 (/F) 终止。
    3) 当指定远程机器时,不支持 "WINDOWTITLE" 和 "STATUS" 筛选器。

例如:
    TASKKILL /IM notepad.exe
    TASKKILL /PID 1230 /PID 1241 /PID 1253 /T
    TASKKILL /F /IM cmd.exe /T
    TASKKILL /F /FI "PID ge 1000" /FI "WINDOWTITLE ne untitle*"
    TASKKILL /F /FI "USERNAME eq NT AUTHORITY\SYSTEM" /IM notepad.exe
    TASKKILL /S system /U 域\用户名 /FI "用户名 ne NT*" /IM *
    TASKKILL /S system /U username /P password /FI "IMAGENAME eq note*"
  • tasklist语法:
TASKLIST [/S system [/U username [/P [password]]]]
         [/M [module] | /SVC | /V] [/FI filter] [/FO format] [/NH]

描述:
    该工具显示在本地或远程机器上当前运行的进程列表。


参数列表:
   /S     system           指定连接到的远程系统。

   /U     [domain\]user    指定应该在哪个用户上下文执行这个命令。

   /P     [password]       为提供的用户上下文指定密码。如果省略,则
                           提示输入。

   /M     [module]         列出当前使用所给 exe/dll 名称的所有任务。
                           如果没有指定模块名称,显示所有加载的模块。

   /SVC                    显示每个进程中主持的服务。

   /APPS 显示 Microsoft Store 应用及其关联的进程。

   /V                      显示详细任务信息。

   /FI    filter           显示一系列符合筛选器
                           指定条件的任务。

   /FO    format           指定输出格式。
                           有效值: "TABLE"、"LIST"、"CSV"。

   /NH                     指定列标题不应该
                           在输出中显示。
                           只对 "TABLE" 和 "CSV" 格式有效。

   /?                      显示此帮助消息。

筛选器:
    筛选器名称     有效运算符           有效值
    -----------     ---------------           --------------------------
    STATUS          eq, ne                    RUNNING | SUSPENDED
                                              NOT RESPONDING | UNKNOWN
    IMAGENAME       eq, ne                    映像名称
    PID             eq, ne, gt, lt, ge, le    PID 值
    SESSION         eq, ne, gt, lt, ge, le    会话编号
    SESSIONNAME     eq, ne                    会话名称
    CPUTIME         eq, ne, gt, lt, ge, le    CPU 时间,格式为
                                              hh:mm:ss。
                                              hh - 小时,
                                              mm - 分钟,ss - 秒
    MEMUSAGE        eq, ne, gt, lt, ge, le    内存使用(以 KB 为单位)
    USERNAME        eq, ne                    用户名,格式为
                                              [域\]用户
    SERVICES        eq, ne                    服务名称
    WINDOWTITLE     eq, ne                    窗口标题
    模块         eq, ne                    DLL 名称

注意: 当查询远程计算机时,不支持 "WINDOWTITLE" 和 "STATUS"
      筛选器。

Examples:
    TASKLIST
    TASKLIST /M
    TASKLIST /V /FO CSV
    TASKLIST /SVC /FO LIST
    TASKLIST /APPS /FI "STATUS eq RUNNING"
    TASKLIST /M wbem*
    TASKLIST /S system /FO LIST
    TASKLIST /S system /U 域\用户名 /FO CSV /NH
    TASKLIST /S system /U username /P password /FO TABLE /NH
    TASKLIST /FI "USERNAME ne NT AUTHORITY\SYSTEM" /FI "STATUS eq running"
最后修改:2023 年 06 月 13 日
如果觉得我的文章对你有用,请随意赞赏