ClamAV(简称 ClamAV)是一款开源的病毒扫描器,可以用来检测和清除电脑中的病毒、蠕虫、恶意软件等威胁。ClamAV 支持多种文件格式,包括 Windows 下的可执行文件、动态链接库、Office 文档、图像文件、电子邮件等,并且具有高度可扩展性和可配置性,能够满足不同用户的需求。
ClamAV 不仅可以作为本地扫描工具使用,还可以集成到网络中,提供网络级别的病毒防护功能。ClamAV 支持多种系统,包括 Windows、Linux、Mac OS、FreeBSD 等,并且能够在服务器端和客户端使用。
ClamAV 还提供了许多工具和库,可以帮助开发者在自己的应用中集成病毒扫描功能。例如,ClamAV 提供了命令行工具 clamscan
和 clamdscan
,可以在 shell 中执行扫描任务;ClamAV 还提供了编程库 libclamav
,可以帮助开发者在自己的程序中集成病毒扫描功能
其实也没有夸它的意思,Linux上能用的杀软也挺多的,而且因为它是开源的,所以在病毒库的更新上也会比那些商用的杀软晚一些,主要是项目遇到了,我拿来水一篇用python调用后杀毒然后查询md5的文章
Centos上安装的步骤可能多一丢丢,首先需要配置个网络源,然后执行这两条安装
yum install epel-release -y
yum install clamav clamav-update clamav-server clamav-server-systemd clamav-data clamav-filesystem clamav-scanner-systemd clamav-devel clamav-lib clamav-server-systemd clamav-update clamav-scanner-systemd -y
接着开启服务,以及开机自启动
systemctl start clamav-freshclam
systemctl enable clamav-freshclam
systemctl start clamav-daemon
systemctl enable clamav-daemon
(ps: start clamav-daemon的时候可能会报错,但是我环境中没有影响我的使用)
ubuntu就简单的多
apt install clamav
安装完成后,可以通过以下命令实现病毒库的更新
freshclam
ClamAV 还有许多其他的用法,例如在后台运行定期扫描、扫描特定的文件夹或文件等。可以使用 man clamscan
命令查看详细的用法。
代码其实可以完全不需要安装第三方库来实现,主要是靠
import subprocess
import re
import hashlib
当然,subprocess这个库在Python 3.5 及以上版本中才可以使用,如果是以下的版本,则需要用os.system
来实现执行命令的操作了
为了美化操作,我使用的是这个库
...
from tabulate import tabulate
我们先写一个计算md5值的方法
...
def calculate_md5(filename):
hash_md5 = hashlib.md5()
with open(filename, "rb") as f:
for chunk in iter(lambda: f.read(4096), b""):
hash_md5.update(chunk)
return hash_md5.hexdigest()
上面的代码是逐块读取文件的,这样可以避免一次性将整个文件读入内存,对于较大的文件来说可以节省内存
接着,开始写执行命令、获取结果的部分
...
output = subprocess.run(["clamscan", "-r", "/root/test/"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
os_result=str(output.stdout)
我的测试环境中,我将php这类木马文件放置在了/root/test/
下,所以在-r后看到的目录就是需要扫描的目录
接着,使用re
匹配输出的结果中是否发现了病毒文件
...
check_av=re.findall("(.*): .* FOUND",os_result)
做完这些操作后,就写一个输出的
...
if check_av:
av_list=[]
for i in check_av:
print("[+] 检测到病毒文件:"+i)
one_file=[]
filename=str(i)
file_md5=calculate_md5(i)
one_file.append(filename)
one_file.append(file_md5)
av_list.append(one_file)
headers=["文件名","MD5"]
print(tabulate(av_list, headers))
else:
print("[-] 未发现病毒文件")
最终效果是这样的
如果嫌每次都需要手动改太麻烦,那么可以加个选项,或者像下面这样简单点
file_path=str(input("请输入需要扫描的目录:"))
output = subprocess.run(["clamscan", "-r", file_path], stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
完整代码放在了github上
https://github.com/Ernket/python3_clamav_scan