You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux服务器下如何用Python实现主目录病毒扫描完成后终止扫描循环

解决主目录扫描后终止递归的问题

看起来你是因为os.walk默认递归遍历所有子目录层级,导致每次进入子文件夹都会触发扫描,进而收到大量通知邮件。其实只要调整遍历逻辑,只处理主目录(也就是path下的直接内容)就能解决这个问题,给你两个简单的方案:

方案一:直接扫描主目录(推荐,逻辑更清晰)

放弃使用os.walk,直接用os.scandir扫描目标主目录下的所有条目(文件和子目录),这样就不会递归到更深的层级。同时注意如果不需要扫描子目录内部的文件,记得去掉clamscan的-r参数(不然clamscan自己还是会递归扫子目录内容)。示例代码调整如下:

import os
import time
import subprocess

path = "/你的目标路径"

# 直接扫描主目录下的所有条目
with os.scandir(path) as listOfEntries:
    for entry in listOfEntries:
        # 检查条目修改时间是否超过60秒
        age = time.time() - entry.stat().st_mtime
        if age > 60:
            scan_target = entry.path
            # 如果你不想扫描子目录内部的文件,就去掉-r参数;如果需要扫子目录但只扫一层,用--max-recursion=1
            value = subprocess.run(['clamscan', scan_target], capture_output=True, text=True)
            # 解析扫描结果
            for line in value.stdout.split("\n"):
                if 'Infected' in line:
                    parts = line.split(":")
                    if len(parts) >= 2:
                        infected_count = parts[1].strip()
                        if infected_count == "0":
                            # 这里添加你的移动逻辑,比如用shutil.move
                            if entry.is_dir():
                                print(f"移动无感染目录:{entry.path}")
                            else:
                                print(f"移动无感染文件:{entry.path}")

方案二:用os.walk但只处理第一次循环

os.walk的第一个迭代返回的就是主目录的信息,之后的迭代才会进入子目录。所以我们可以在处理完第一次循环后直接break,终止递归遍历:

import os
import time
import subprocess

path = "/你的目标路径"

# 只处理os.walk的第一次迭代(主目录)
for dirs, subdirs, files in os.walk(path):
    # 处理主目录下的文件
    for file in files:
        file_path = os.path.join(dirs, file)
        age = time.time() - os.stat(file_path).st_mtime
        if age > 60:
            value = subprocess.run(['clamscan', file_path], capture_output=True, text=True)
            for line in value.stdout.split("\n"):
                if 'Infected' in line and len(line.split(":"))>=2 and line.split(":")[1].strip() == "0":
                    print(f"移动无感染文件:{file_path}")
    # 处理主目录下的子目录
    for subdir in subdirs:
        subdir_path = os.path.join(dirs, subdir)
        age = time.time() - os.stat(subdir_path).st_mtime
        if age > 60:
            # 同样,按需决定是否保留-r参数
            value = subprocess.run(['clamscan', subdir_path], capture_output=True, text=True)
            for line in value.stdout.split("\n"):
                if 'Infected' in line and len(line.split(":"))>=2 and line.split(":")[1].strip() == "0":
                    print(f"移动无感染目录:{subdir_path}")
    # 终止os.walk的递归遍历
    break

关键提示

  • 原代码里嵌套了os.walk和os.scandir,这会导致重复处理目录结构,尽量避免这种冗余逻辑;
  • 如果你只是想确认主目录下的条目本身安全,不需要深入子目录,一定要去掉clamscan的-r参数,否则clamscan还是会自行递归扫描子目录内的所有文件,依旧会产生大量通知。

内容的提问来源于stack exchange,提问作者madhan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 05:38:12