介紹如何在 Python 中使用 pyClamd 模組,使用 ClamAV 進行檔案的掃毒。
pyClamd 模組是一個 clamd
(ClamAV 的常駐服務)的 Python 介面,透過 pyClamd 可以讓一般的 Python 程式加入病毒偵測功能。
由於 pyClamd 只是一個 clamd
的介面,實際上的掃毒工作是交由常駐的 clamd
執行,因此要先在系統上安裝並設定好 clamd
常駐服務。
在安裝好 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')}