看到此篇,大伙都是彦祖、亦菲哈~~~
运维人员福音!当服务器病毒扫描动辄耗时数小时,你是否也曾为此抓狂?亲测优化ClamAV配置,扫描近6千个文件从150秒降至22秒,提升6.5倍;扫描19万个文件从65分钟降至36分钟,提升1.7倍。
文章详细剖析了内存占用高、扫描卡顿、重复扫描三大痛点,提供从病毒库加载策略、文件大小限制到递归深度控制的全套优化方案。包含clamscan与clamdscan指令详解、最佳配置参数清单及实测数据对比,助您轻松实现性能与安全的完美平衡。
话不多说,开干了~~~
一、基础知识
ClamAV扫描指令包含两种方式
第一种:clamscan 直接扫描
第二种:clamdscan 常驻进程扫描,内存长时间会占用到1.3G
优化前思考
**问题1:**加载病毒库到内存:clamd作为守护进程,会将整个病毒库常驻内存(这是为了提高扫描速度),仅病毒库本身就可能占用 500-800MB 内存; 【选择性挑选病毒库加载,如果是识别到当前内存小于4G,默认选择比较小的病毒库】
- 机器配置小于3G:只选择一个小病毒库
- 机器配置大于5G:全量加载
**问题2:**扫描卡顿,慢
- 超过10M文件,不扫描
- 最多只扫描10层
**问题3:**同一目录扫描,上一次未扫描完,则跳过本次扫描
病毒库文件
文件存放位置/var/lib/clamav
Plain
276K Nov 27 16:34 bytecode.cvd 字节码库
82M Dec 19 15:40 daily.cld 增量库
69 Dec 6 18:32 freshclam.dat
226M Dec 17 13:45 main.cld 标准库
"曲线救国"式限制文件扫描量
值得注意的是,没有限制扫描文件数量,只有限制扫描的文件总大小
如果需要限制扫描文件数量的话,可参考如下
Bash
【没有效果,clamscan不允许控制扫描总文件数量】
clamscan -v --max-filesize=25M --max-files=10000 --max-scansize=100M /www/wwwroot/
控制扫描文件数量
# 步骤1:取前200个写入临时列表
find /www/wwwroot/ -type f -size -10M ! -name "*.log" ! -name "*.tmp" ! -name "*.cache" | head -n 200 > /tmp/clamscan_file_list.txt
# 步骤2:扫描(结合压缩包内文件数限制--max-files=100)
clamscan -v --file-list=/tmp/clamscan_file_list.txt --max-files=100
# 步骤3:清理临时文件
rm /tmp/clamscan_file_list.txt
二、相关配置说明
clamscan指令说明
Plain
--help -h // 显示此帮助信息
--version -V // 打印版本号
--verbose -v // 启用详细输出模式(显示每个文件的扫描状态)
--archive-verbose -a // 显示扫描的压缩包内的具体文件名
--debug // 启用 libclamav 库的调试日志(用于排错)
--quiet // 仅输出错误信息(抑制正常扫描日志)
--stdout // 将输出写入标准输出(stdout)而非标准错误输出(stderr),不影响调试日志的输出位置
--no-summary // 禁用扫描结束时的汇总信息输出
--infected -i // 仅打印检测到的受感染文件
--suppress-ok-results -o // 跳过打印"扫描正常(OK)"的文件
--bell // 检测到病毒时触发终端响铃提醒
--tempdir=DIRECTORY // 在指定目录(DIRECTORY)中创建临时文件
--leave-temps[=yes/no(*)] // 不删除扫描过程中生成的临时文件(*默认no:删除临时文件;yes:保留)
--gen-json[=yes/no(*)] // 为扫描的文件生成 JSON 元数据(仅用于测试和开发!)
// 若启用 --debug,JSON 内容会打印到终端;
// 若启用 --leave-temps,JSON 文件会保存到临时目录
--database=FILE/DIR -d FILE/DIR // 从指定文件(FILE)加载病毒库,或从指定目录(DIR)加载所有支持的病毒库文件
--official-db-only[=yes/no(*)] // 仅加载官方签名的病毒库(*默认no:允许加载第三方病毒库)
--log=FILE -l FILE // 将扫描报告保存到指定文件(FILE)
--recursive[=yes/no(*)] -r // 递归扫描子目录(*默认yes:开启递归;no:关闭)
--allmatch[=yes/no(*)] -z // 检测到匹配项后,继续扫描当前文件的剩余内容(*默认no:检测到病毒即停止扫描该文件)
--cross-fs[=yes(*)/no] // 扫描其他文件系统上的文件和目录(*默认yes:跨文件系统扫描;no:仅扫描当前文件系统)
--follow-dir-symlinks[=0/1(*)/2] // 跟随目录软链接(0=从不跟随;1=仅跟随直接链接*默认;2=始终跟随)
--follow-file-symlinks[=0/1(*)/2] // 跟随文件软链接(0=从不跟随;1=仅跟随直接链接*默认;2=始终跟随)
--file-list=FILE -f FILE // 扫描指定文件(FILE)中列出的所有文件(批量扫描)
--remove[=yes/no(*)] // 删除受感染的文件(⚠️ 慎用!*默认no:不删除;yes:删除)
--move=DIRECTORY // 将受感染的文件移动到指定目录(DIRECTORY,用于隔离病毒)
--copy=DIRECTORY // 将受感染的文件复制到指定目录(DIRECTORY,用于备份)
--exclude=REGEX // 跳过文件名匹配指定正则表达式(REGEX)的文件
--exclude-dir=REGEX // 跳过目录名匹配指定正则表达式(REGEX)的目录
--include=REGEX // 仅扫描文件名匹配指定正则表达式(REGEX)的文件
--include-dir=REGEX // 仅扫描目录名匹配指定正则表达式(REGEX)的目录
--bytecode[=yes(*)/no] // 从病毒库加载字节码特征(*默认yes:启用;no:禁用)
--bytecode-unsigned[=yes/no(*)] // 加载未签名的字节码(*默认no:禁用)
// **警告**:切勿运行来自不可信来源的字节码签名!
// 此举可能导致任意代码执行(存在安全风险)
--bytecode-timeout=N // 设置字节码执行超时时间(单位:毫秒)
--statistics[=none(*)/bytecode/pcre] // 收集并打印执行统计信息(none*:不收集;bytecode:字节码统计;pcre:正则匹配统计)
--detect-pua[=yes/no(*)] // 检测潜在不受欢迎程序(PUA,*默认no:禁用;yes:启用)
--exclude-pua=CAT // 跳过指定类别(CAT)的 PUA 特征库
--include-pua=CAT // 仅加载指定类别(CAT)的 PUA 特征库
--detect-structured[=yes/no(*)] // 检测结构化数据(如社会安全号码 SSN、信用卡号)(*默认no:禁用)
--structured-ssn-format=X // SSN(社会安全号码)格式(0=标准格式;1=无分隔符格式;2=两种格式都检测)
--structured-ssn-count=N // 触发检测的最小 SSN 数量(需检测到 N 个以上才告警)
--structured-cc-count=N // 触发检测的最小信用卡号数量(需检测到 N 个以上才告警)
--structured-cc-mode=X // 信用卡检测模式(0=检测信用卡、借记卡和专用标签卡;1=仅检测信用卡)
--scan-mail[=yes(*)/no] // 扫描邮件文件(*默认yes:启用)
--phishing-sigs[=yes(*)/no] // 启用基于特征的钓鱼邮件检测(*默认yes:启用)
--phishing-scan-urls[=yes(*)/no] // 启用基于 URL 特征的钓鱼邮件检测(*默认yes:启用)
--heuristic-alerts[=yes(*)/no] // 启用启发式告警(基于行为/模式检测未知威胁,*默认yes:启用)
--heuristic-scan-precedence[=yes/no(*)] // 检测到启发式匹配项后立即停止扫描(*默认no:继续扫描;yes:停止)
--normalize[=yes(*)/no] // 标准化 HTML、脚本和文本文件(用于精准检测;设置no可兼容 YARA 规则)
--scan-pe[=yes(*)/no] // 扫描 PE 格式文件(Windows 可执行文件,如.exe/.dll,*默认yes:启用)
--scan-elf[=yes(*)/no] // 扫描 ELF 格式文件(Linux/Unix 可执行文件,*默认yes:启用)
--scan-ole2[=yes(*)/no] // 扫描 OLE2 容器文件(如老版本 Office 文档.doc/.xls,*默认yes:启用)
--scan-pdf[=yes(*)/no] // 扫描 PDF 文件(*默认yes:启用)
--scan-swf[=yes(*)/no] // 扫描 SWF(Flash)文件(*默认yes:启用)
--scan-html[=yes(*)/no] // 扫描 HTML 文件(*默认yes:启用)
--scan-xmldocs[=yes(*)/no] // 扫描基于 XML 的文档文件(*默认yes:启用)
--scan-hwp3[=yes(*)/no] // 扫描 HWP3 格式文件(韩国韩文字处理软件文档,*默认yes:启用)
--scan-archive[=yes(*)/no] // 扫描压缩包/归档文件(libclamav 支持的格式,如zip/tar,*默认yes:启用)
--alert-broken[=yes/no(*)] // 对损坏的可执行文件(PE/ELF)触发告警(*默认no:禁用)
--alert-broken-media[=yes/no(*)] // 对损坏的图片文件(JPEG/TIFF/PNG/GIF)触发告警(*默认no:禁用)
--alert-encrypted[=yes/no(*)] // 对加密的压缩包和文档触发告警(*默认no:禁用)
--alert-encrypted-archive[=yes/no(*)] // 对加密的压缩包触发告警(*默认no:禁用)
--alert-encrypted-doc[=yes/no(*)] // 对加密的文档触发告警(*默认no:禁用)
--alert-macros[=yes/no(*)] // 对包含 VBA 宏的 OLE2 文件(如.doc/.xls)触发告警(*默认no:禁用)
--alert-exceeds-max[=yes/no(*)] // 对超过最大文件大小、最大扫描大小或最大递归限制的文件触发告警(*默认no:禁用)
--alert-phishing-ssl[=yes/no(*)] // 对包含 SSL 域名不匹配 URL 的邮件触发告警(*默认no:禁用)
--alert-phishing-cloak[=yes/no(*)] // 对包含伪装(隐藏)URL 的钓鱼邮件触发告警(*默认no:禁用)
--alert-partition-intersection[=yes/no(*)] // 对包含分区交叉的原始 DMG 镜像文件触发告警(*默认no:禁用)
--nocerts // 禁用 PE 文件中 Authenticode 数字证书链的验证
--dumpcerts // 导出 PE 文件中的 Authenticode 数字证书链
--max-scantime=#n // 扫描时间超过该值则跳过文件并视为安全(单位:毫秒)
--max-filesize=#n // 大小超过该值的文件将被跳过并视为安全(支持单位:B/K/M/G,如10M)
--max-scansize=#n // 每个容器文件(如压缩包)的最大扫描数据量(解压后,**核心限制**)
--max-files=#n // 每个容器文件(如压缩包)内最多扫描的文件数量(**核心限制**)
--max-recursion=#n // 容器文件(如压缩包)的最大递归解压扫描深度(**核心限制**)
--max-dir-recursion=#n // 目录递归扫描的最大深度
--max-embeddedpe=#n // 检测嵌入式 PE 文件的最大文件大小
--max-htmlnormalize=#n // 待标准化处理的 HTML 文件的最大大小
--max-htmlnotags=#n // 标准化后去除标签的 HTML 文件的最大扫描大小
--max-scriptnormalize=#n // 待标准化处理的脚本文件的最大大小
--max-ziptypercg=#n // 重新分析 ZIP 类型的最大文件大小
--max-partitions=#n // 待扫描的磁盘镜像文件中最多处理的分区数量
--max-iconspe=#n // PE 文件中最多扫描的图标数量
--max-rechwp3=#n // HWP3 文件解析函数的最大递归调用次数
--pcre-match-limit=#n // PCRE(Perl 兼容正则)匹配函数的最大调用次数
--pcre-recmatch-limit=#n // PCRE(Perl 兼容正则)递归匹配函数的最大调用次数
--pcre-max-filesize=#n // 执行 PCRE 子特征匹配的文件最大大小
--disable-cache // 禁用已扫描文件哈希值的缓存和缓存检查
clamd配置文件
debian/Ubuntu:/etc/clamav/clamd.conf
centos/Rocky:/etc/clamd.d/scan.conf
Plain
#Automatically Generated by clamav-daemon postinst
#To reconfigure clamd run #dpkg-reconfigure clamav-daemon
#Please read /usr/share/doc/clamav-daemon/README.Debian.gz for details
LocalSocket /var/run/clamav/clamd.ctl // 指定clamd守护进程的本地UNIX套接字路径,用于本地进程与clamd通信
FixStaleSocket true // 启用后自动删除存在但无活跃进程的陈旧套接字,重建新套接字
LocalSocketGroup clamav // 设置套接字文件所属的用户组
LocalSocketMode 666 // 套接字文件的权限(八进制),666表示所有用户/组均有读写权限
# TemporaryDirectory is not set to its default /tmp here to make overriding
# the default with environment variables TMPDIR/TMP/TEMP possible
User clamav // 运行clamd守护进程的系统用户身份
ScanMail true // 启用邮件内容扫描,检测邮件中的恶意代码/病毒
ScanArchive true // 启用压缩包(ZIP/RAR等归档文件)扫描
ArchiveBlockEncrypted false // 是否阻止加密压缩包(false=仅标记可疑,不直接阻止)
MaxDirectoryRecursion 5 // 扫描目录时允许的最大递归深度
FollowDirectorySymlinks false // 是否跟随目录软链接进行扫描
FollowFileSymlinks false // 是否跟随文件软链接进行扫描
ReadTimeout 180 // 网络客户端连接的读取超时时间(秒),超时断开
MaxThreads 12 // clamd允许的最大并发工作线程数(处理多扫描请求)
MaxConnectionQueueLength 15 // 等待处理的客户端连接最大队列长度
LogSyslog false // 是否将日志输出到系统syslog(false=仅写入指定日志文件)
LogRotate true // 启用日志轮转,防止日志文件无限增大
LogFacility LOG_LOCAL6 // 指定syslog的日志设施(仅LogSyslog=true时生效)
LogClean false // 是否记录"干净文件"的扫描日志(false=仅记录病毒/可疑文件)
LogVerbose false // 是否启用详细日志模式(false=仅记录关键信息)
PreludeEnable no // 是否集成Prelude SIEM(安全信息事件管理系统)
PreludeAnalyzerName ClamAV // Prelude集成时使用的分析器名称(仅PreludeEnable=yes生效)
DatabaseDirectory /var/lib/clamav // 病毒特征库的存储目录
OfficialDatabaseOnly false // 是否仅使用官方签名库(false=允许第三方签名库)
SelfCheck 3600 // clamd进程自我健康检查的时间间隔(秒),3600=每小时检查1次
Foreground false // 是否前台运行clamd(false=后台守护进程模式)
Debug false // 是否启用调试模式(false=关闭调试日志)
ScanPE true // 启用Windows PE可执行文件扫描
MaxEmbeddedPE 10M // 扫描PE文件时,允许嵌入的子PE文件最大大小(10兆字节)
ScanOLE2 true // 启用OLE2格式文件扫描(如Office 97-2003文档)
ScanPDF true // 启用PDF文件扫描,检测其中的恶意脚本/代码
ScanHTML true // 启用HTML文件扫描,检测恶意脚本/钓鱼链接
MaxHTMLNormalize 10M // HTML文件规范化(去标签/格式化)的最大处理大小
MaxHTMLNoTags 2M // HTML文件去除标签后,内容的最大处理大小
MaxScriptNormalize 5M // 脚本文件(JS/VBS等)规范化处理的最大大小
MaxZipTypeRcg 1M // ZIP类压缩包递归扫描的最大数据量
ScanSWF true // 启用SWF(Flash)文件扫描
ExitOnOOM true // 内存不足(OOM)时是否退出clamd(false=不退出,仅记录告警)
LeaveTemporaryFiles false // 扫描完成后是否保留临时文件(false=自动删除)
AlgorithmicDetection true // 启用启发式算法检测(基于行为/特征的非签名检测)
ScanELF true // 启用Linux ELF可执行文件扫描
IdleTimeout 30 // 空闲客户端连接的超时时间(秒),超时后断开
CrossFilesystems true // 是否跨文件系统扫描(如从ext4扫描到NTFS分区)
PhishingSignatures true // 启用钓鱼邮件特征签名检测
PhishingScanURLs true // 扫描文件/邮件中的URL,检测钓鱼链接
PhishingAlwaysBlockSSLMismatch false // 是否强制阻止SSL证书不匹配的钓鱼链接
PhishingAlwaysBlockCloak false // 是否强制阻止伪装(Cloak)的钓鱼链接
PartitionIntersection false // 是否检测跨分区的恶意文件(仅针对磁盘镜像扫描)
DetectPUA false // 是否检测潜在不受欢迎应用(PUA,如广告软件/工具栏)
ScanPartialMessages false // 是否扫描不完整的邮件消息
HeuristicScanPrecedence false // 启发式扫描是否优先于签名扫描
StructuredDataDetection false // 是否检测JSON/XML等结构化数据中的恶意内容
CommandReadTimeout 30 // 读取客户端命令的超时时间(秒)
SendBufTimeout 200 // 向客户端发送数据的缓冲区超时时间(毫秒)
MaxQueue 100 // 等待扫描的任务最大队列长度
ExtendedDetectionInfo true // 是否在检测结果中包含扩展信息(如病毒变种/位置)
OLE2BlockMacros false // 是否阻止OLE2文件中的宏(false=仅标记,不直接阻止)
AllowAllMatchScan true // 是否允许扫描时匹配所有可用签名(true=全面扫描)
ForceToDisk false // 是否强制将大文件写入磁盘后再扫描(false=优先内存扫描)
DisableCertCheck false // 是否禁用SSL证书校验(仅特征库更新等场景生效)
DisableCache false // 是否禁用扫描缓存(false=启用缓存,提升重复文件扫描速度)
MaxScanTime 120000 // 单个文件的最大扫描耗时(毫秒),120000=2分钟
MaxScanSize 100M // 单次扫描任务的最大总数据量(100兆字节)
MaxFileSize 10M // 单个文件的最大扫描大小(超过则跳过)
MaxRecursion 16 // 压缩包/归档文件的最大递归解压深度
MaxFiles 10000 // 单个归档文件中最多扫描的文件数量
MaxPartitions 50 // 扫描磁盘镜像时允许的最大分区数量
MaxIconsPE 100 // PE文件中最多扫描的图标数量(防止恶意图标注入)
PCREMatchLimit 10000 // PCRE正则表达式匹配的最大次数(防止DoS攻击)
PCRERecMatchLimit 5000 // PCRE正则表达式递归匹配的最大次数
PCREMaxFileSize 25M // 使用PCRE正则扫描的文件最大大小
ScanXMLDOCS true // 启用XML文档扫描
ScanHWP3 true // 启用韩版Office HWP3文件扫描
MaxRecHWP3 10 // HWP3文件的最大递归扫描深度
StreamMaxLength 10M // 流式扫描的最大数据长度(10兆字节)
LogFile /var/log/clamav/clamav.log // 扫描日志文件的存储路径
LogTime true // 是否在日志中添加时间戳
LogFileUnlock false // 是否每次写入日志后解锁文件(false=保持锁定,提升写入效率)
LogFileMaxSize 0 // 日志文件的最大大小(0=不限制,依赖LogRotate轮转)
Bytecode true // 启用字节码签名(动态加载的检测规则)
BytecodeSecurity TrustSigned // 字节码安全策略:仅信任官方签名的字节码
BytecodeTimeout 60000 // 字节码执行的超时时间(毫秒),60000=1分钟
OnAccessMaxFileSize 5M // 实时访问扫描(On-Access)时单个文件的最大大小
clamdscan指令说明
Plain
clamdscan [options] [file/directory/-]
--help -h // 显示此帮助信息 中文
--version -V // 显示版本号并退出
--verbose -v // 详细输出,包括扫描进度
--quiet // 仅输出错误信息,不显示进度
--stdout // 将输出写入标准输出(stdout),而不是标准错误(stderr)。不会影响 'debug' 消息。
(this help is always written to stdout)
--log=FILE -l FILE // 将扫描报告保存到 FILE 文件中
--file-list=FILE -f FILE // 从 FILE 文件中读取要扫描的文件列表
--ping -p A[:I] // 尝试最多 A 次,可选间隔 I 秒,直到 clamd 响应。
--wait -w // 最多等待 30 秒,直到 clamd 启动。可选搭配 --ping 来设置尝试次数 [A] 和间隔 [I] 来检查 clamd。
--remove // 删除感染文件。小心操作!
--move=DIRECTORY // 将感染文件移动到 DIRECTORY 目录中
--copy=DIRECTORY // 将感染文件复制到 DIRECTORY 目录中
--config-file=FILE // 从 FILE 文件中读取配置
--allmatch -z // 找到匹配后继续扫描文件中的其他内容
--multiscan -m // 强制 MULTISCAN 模式,即使找到匹配也继续扫描
--infected -i // 仅打印感染文件
--no-summary // 禁用扫描结束时的摘要信息
--reload // 请求 clamd 重新加载病毒数据库
--fdpass // 传递文件描述符给 clamd(如果 clamd 以不同用户运行)
--stream // 强制将文件流式传输给 clamd(用于调试和单元测试)
clamdscan扫描 过滤掉指定文件类型或者指定目录
| 配置项 | 作用域 | 优点 | 缺点 |
|---|---|---|---|
| ExcludePath | 全局(clamdscan/实时扫描) | 支持正则,功能强大 | 需要正则知识 |
| ExcludeExtension | 全局(clamdscan/实时扫描) | 配置简单直观 | 对压缩包内文件无效,不支持通配符 |
| --exclude 参数 | 仅 clamscan 可用 | 命令行灵活控制 | clamdscan 不支持 |
Plain
ExcludePath \.(mp4|mp3|avi|mkv|mov|wav|flac)$
ExcludePath \.(jpg|jpeg|png|gif|bmp|ico)$
ExcludePath \.(iso|tar\.gz|tar\.bz2|zip|rar|7z|tgz)$
三、ClamAV配置优化
clamdscan最佳配置
debian/ubuntu:/etc/clamav/clamd.conf
centos:/etc/clamd.d/scan.conf
Plain
# ================================
# 性能核心参数(最重要)
# ================================
# 并发线程控制 - 根据CPU核心数调整
MaxThreads 4 # 4核CPU=2线程,8核CPU=4线程,16核CPU=8线程
# 连接和队列管理
MaxConnectionQueueLength 10 # 降低连接队列长度
MaxQueue 50 # 减少等待扫描队列长度
# ================================
# 内存控制参数(重要)
# ================================
# 文件大小限制 - 平衡安全性和性能
MaxFileSize 5M # 单文件最大扫描大小
MaxScanSize 50M # 单次扫描任务最大数据量
MaxScanTime 90000 # 单文件最大扫描时间(90秒)
# HTML和脚本文件处理限制
MaxHTMLNormalize 5M # HTML文件最大归一化大小
MaxHTMLNoTags 1M # HTML文件最大无标签大小
MaxScriptNormalize 3M # 脚本文件最大归一化大小
# ================================
# 扫描功能控制(根据需求调整)
# ================================
# 启用/禁用扫描功能
ScanMail false # 非邮件服务器可关闭
ScanArchive true # 保持开启但限制深度
ScanPE true # PE文件扫描(重要)
ScanOLE2 true # Office文档扫描(重要)
ScanHTML true # HTML文件扫描
ScanPDF true # PDF文件扫描
# 递归深度控制
MaxDirectoryRecursion 8 # 目录递归深度,默认8层
MaxRecursion 8 # 压缩包递归深度
MaxFiles 5000 # 单个归档文件内最大文件数
# ================================
# 缓存和性能优化
# ================================
DisableCache false # 启用缓存(重要)
ForceToDisk false # 内存优先处理
# ================================
# 安全检测调优
# ================================
AlgorithmicDetection true # 启发式检测(平衡安全性和性能)
HeuristicScanPrecedence false # 签名优先于启发式
DetectPUA false # 关闭PUA检测(可节省资源)
PhishingSignatures true # 保持钓鱼检测
# ================================
# 字节码和时间控制
# ================================
BytecodeTimeout 30000 # 字节码执行超时(30秒)
SelfCheck 3600 # 健康检查间隔(1小时)
# ================================
# 资源保护参数
# ================================
ExitOnOOM true # 内存不足时退出(保护系统)
MaxEmbeddedPE 5M # PE文件嵌入子文件大小
PCREMatchLimit 8000 # 正则匹配次数限制
PCREMaxFileSize 20M # PCRE扫描文件大小限制
<!-- 排除掉一些文件类型:zip、jpg、jpeg、png、PDF、JPG、JPEG、ZIP -->
ExcludePath \.(mp4|mp3|avi|mkv|mov|wav|flac)$
ExcludePath \.(jpg|jpeg|png|gif|bmp|ico)$
ExcludePath \.(iso|tar\.gz|tar\.bz2|zip|rar|7z|tgz)$
clamscan最佳配置
Plain
clamscan \
--max-filesize=5M \ // 单文件最大扫描大小
--max-scantime=30000 \ // 单文件最大扫描时间(30秒)
--max-scansize=50M \ // 单次扫描任务最大数据量
--max-dir-recursion=8 \ // 目录递归深度,最多8层
--max-recursion=8 \ // 压缩包递归深度
--max-files=5000 \ // 单个归档文件内最大文件数
--max-htmlnormalize=5M \ // HTML文件最大归一化大小
--max-htmlnotags=2M // 标准化后去除标签的 HTML 文件的最大扫描大小
--max-scriptnormalize=3M \ // 脚本文件最大归一化大小
--pcre-max-filesize=25M // 执行 PCRE 子特征匹配的文件最大大小
--max-embeddedpe=10M // 检测嵌入式 PE 文件的最大文件大小
--detect-pua=no \ // 关闭PUA检测(可节省资源)
--scan-mail=no \ // 关闭邮件扫描(非邮件服务器可关闭)
--suppress-ok-results \ // 抑制正常文件结果
--infected \ // 仅显示感染文件
--exclude=pdf$ --exclude=jpg$ --exclude=jpeg$ --exclude=png$ --exclude=PDF$ --exclude=JPG$ --exclude=JPEG$ --exclude=zip$ // 排除PDF、JPG、JPEG、PNG、ZIP文件扫描
/path/to/scan
四、效果对比
测试1
原来: /www/test/ 22.1s 5663 662
优化后:/www/test/ 150.8s 5661 662
效果:测试近6k个文件,时间从150s减少到22s,扫描速度提升了6.5倍,而且检测效果一样。
测试2
效果:测试19w个文件,扫描时间从3901.45s减少到2158.41s,扫描速度提升了1.7倍,而且检测效果基本一致。
原来:/ 3901.45s 197020 1353
优化后:/ 2158.41s 198513 1344
原始测试数据参考
Plain
300w文件,大概60分钟
----------- SCAN SUMMARY -----------
Known viruses: 3626944
Engine version: 1.0.9
Scanned directories: 31170
Scanned files: 195297
Infected files: 1353
Data scanned: 5008.75 MB
Data read: 5114.15 MB (ratio 0.98:1)
Time: 4076.971 sec (67 m 56 s)
Start Date: 2025:12:19 18:03:54
End Date: 2025:12:19 19:11:51
1w个文件, 近30分钟
----------- SCAN SUMMARY -----------
Known viruses: 3626992
Engine version: 1.0.9
Scanned directories: 0
Scanned files: 99679
Infected files: 14
Data scanned: 1709.46 MB
Data read: 1653.57 MB (ratio 1.03:1)
Time: 1659.128 sec (27 m 39 s)
Start Date: 2025:12:20 16:14:06
End Date: 2025:12:20 16:41:45
越大文件,扫描速度越慢