Python

Python 以 pyClamd 模組使用 ClamAV 掃毒教學與範例

介紹如何在 Python 中使用 pyClamd 模組,使用 ClamAV 進行檔案的掃毒。

pyClamd 模組是一個 clamd(ClamAV 的常駐服務)的 Python 介面,透過 pyClamd 可以讓一般的 Python 程式加入病毒偵測功能。

安裝 ClamAV

由於 pyClamd 只是一個 clamd 的介面,實際上的掃毒工作是交由常駐的 clamd 執行,因此要先在系統上安裝並設定好 clamd 常駐服務

安裝 pyClamd

在安裝好 clamd 之後,接著以 pip 安裝 pyclamd 模組:

# 安裝 pyclamd 模組
pip install pyclamd

連接 clamd

若要使用 pyClamd 掃描病毒,可先載入 pyclamd 模組之後,使用 ClamdAgnostic() 建立與 clamd 的連線。

import pyclamd

# 連接 clamd 常駐服務
cd = pyclamd.ClamdAgnostic()

ClamdAgnostic() 會先嘗試使用 ClamdUnixSocket() 進行連接,若失敗則再嘗試 ClamdNetworkSocket()

建立好與 clamd 的連線之後,可以呼叫 ping() 測試連接是否正常。

# 測試與 clamd 的連接是否正常
if cd.ping():
    print("正常連接 clamd")
else:
    print("無法連接 clamd")
正常連接 clamd

version() 可以用來檢查 ClamAV 與病毒碼的版本:

# 檢查 ClamAV 版本
print(cd.version())
ClamAV 0.103.2/26209/Tue Jun 22 19:07:55 2021

呼叫 reload() 可以讓 clamd 立即重新載入最新的病毒碼:

# 重新載入病毒碼
print(cd.reload())
RELOADING

stats() 可以用來顯示目前 clamd 常駐服務的負載狀態:

# 查詢 clamd 常駐服務狀態
print(cd.stats())
POOLS: 1

STATE: VALID PRIMARY
THREADS: live 1  idle 0 max 12 idle-timeout 30
QUEUE: 0 items
        STATS 0.000022
MEMSTATS: heap 30.027M mmap 0.000M used 7.356M free 22.673M releasable 0.136M pools 1 pools_used 1130.071M pools_total 1130.112M
END

檔案掃毒

若要對指定檔案進行病毒的掃瞄,可以使用 scan_file 函數:

# 掃描檔案
result = cd.scan_file('/home/ubuntu/archive.zip')
print(result)
None

若掃描結果沒有發現病毒,就會傳回 None

若要測試實際掃描到病毒的狀況,可以使用 EICAR() 建立一個 68 位元組的 EICAR 病毒測試檔,

# 建立 EICAR 測試病毒檔案
open('/tmp/EICAR', 'wb').write(cd.EICAR())

再以 scan_file 函數掃描:

# 掃描病毒測試檔案
result = cd.scan_file('/tmp/EICAR')
print(result)
{'/tmp/EICAR': ('FOUND', 'Win.Test.EICAR_HDB-1')}

資料掃毒

若要對一段資料進行病毒掃描,可以使用 scan_stream 函數:

# 掃描病毒測試串流
result = cd.scan_stream(cd.EICAR())
print(result)
{'stream': ('FOUND', 'Win.Test.EICAR_HDB-1')}
Share
Published by
Office Guide

Recent Posts

Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤

本篇介紹如何在 Python ...

1 年 ago

Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例

本篇介紹如何在 Ubuntu ...

1 年 ago

Linux 網路設定 ip 指令用法教學與範例

本篇介紹如何在 Linux 系...

1 年 ago

Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例

介紹如何在 Linux 系統中...

1 年 ago