clamav 本身不支持 windows 风格的驱动层实时扫描,需通过 clamd 守护进程 + inotify/systemd path unit 实现准实时防护;推荐在业务入口(如上传后)调用 clamdscan 扫描,禁用 scanonaccess 除非确认 fanotify 支持,并严格限制扫描路径与超时参数。

ClamAV 是 Linux 服务器上最成熟、轻量且可深度集成的开源反病毒引擎,但它本身不提供开箱即用的“实时文件系统监控”功能——它的核心能力是按需扫描和守护进程式主动扫描。要实现接近实时的防护效果,需结合 clamd 守护进程 + 文件变更监听机制(如 inotify 或 systemd path unit),而非依赖 Windows 风格的“驱动层实时钩子”。
启用 clamd 守护进程并配置基础实时响应
ClamAV 的 clamd 服务支持“扫描请求触发式实时响应”,即当外部程序(如 Web 应用上传处理脚本、SFTP 入口钩子)在文件落盘后立即调用 clamdscan 发起扫描,延迟通常在毫秒级。这是生产环境最稳定、低侵入的实时策略。
- 确保已安装完整套件:
clamav、clamav-daemon(Debian/Ubuntu)或clamav-server(RHEL/CentOS),并确认clamd服务已启用:sudo systemctl enable --now clamd@scan - 编辑
/etc/clamd.d/scan.conf(RHEL)或/etc/clamav/clamd.conf(Debian),取消注释并设置:LocalSocket /var/run/clamd.scan/clamd.sockFixStaleSocket yesScanOnAccess yes(⚠️注意:此选项仅在内核支持 fanotify 且编译时启用了--enable-fanotify时才生效;多数发行版默认关闭,不可盲目开启) - 重启服务:
sudo systemctl restart clamd@scan,验证 socket 是否就绪:ls -l /var/run/clamd.scan/
对接业务入口实现准实时扫描
真正的“实时”应落在业务关键路径上,而非全盘监听。例如 Web 上传、Git 推送、SFTP 放入指定目录等场景,可在文件写入完成后立刻调用扫描。
- 在 Nginx/Apache 上传后端脚本中插入:
clamdscan --fdpass --stream &1 | grep -q "OK$" || { echo "Virus detected"; rm -f "$uploaded_file"; exit 1; } - 为 SFTP 配置
ForceCommand或使用inotifywait监控上传目录(如/var/www/uploads),检测到MOVED_TO事件后执行clamdscan --multiscan /path/to/file - 若使用 Docker,可在应用容器启动时挂载
/var/run/clamd.scansocket,并在业务代码中通过 Unix socket 调用 clamd API(推荐使用官方clamdPython 客户端库)
补充:用 systemd path unit 实现目录级轻量监听
无需复杂 inotify 工具,利用 systemd 原生能力即可构建低开销监听链路,适合中小规模部署。
- 创建监听单元:
/etc/systemd/system/clam-watch.uploads.path,内容含:[Path]PathModified=/var/www/uploads/Unit=clam-scan-upload.service[Install]WantedBy=multi-user.target - 配套 service 文件:
/etc/systemd/system/clam-scan-upload.service,执行扫描命令并记录日志 - 启用:
sudo systemctl daemon-reload && sudo systemctl enable clam-watch.uploads.path && sudo systemctl start clam-watch.uploads.path
关键避坑提醒
所谓“实时”不是无限监听一切,而是聚焦高风险路径。很多团队误启 ScanOnAccess 却未确认 fanotify 支持,导致 clamd 启动失败或 CPU 暴涨;也有人盲目扫描 /proc、/sys 或日志轮转中的临时文件,引发误报与性能抖动。
- 禁用对
/dev、/proc、/sys、/run等虚拟文件系统的扫描 - 在 clamd 配置中明确设置:
ExcludePath ^/var/log/.*$、ExcludePath ^/tmp/.*\.tmp$ - 扫描超时务必设限:
StreamMaxLength 25M、MaxFileSize 30M、ReadTimeout 30,防止大文件阻塞服务 - 所有扫描动作必须以非 root 用户运行(clamav 用户),避免提权风险











