Apresente o uso geral e os métodos comuns do módulo pyClamd.
Podemos usar python para o controle clamd
e, assim, controlar ClamAv
, a necessidade de introduzir módulos de terceiros: pyClamd
.
O uso de pyClamd
controle clamd
antes, deve ser instalado corretamente com clamd
o clamav
. Você pode consultar o artigo anterior:
1. Introdução ao pyClamd
PyClamd
Sim clamd
interface python. clamd
É ClamAv
o processo daemon das ferramentas antivírus.
Ao usar pyClamd
, podemos adicionar a função de detecção de vírus ao programa python de uma forma simples e eficiente.
Dois, instale o pyClamd
Use a pip
instalação expressa:
pip install pyClamd
Documentação oficial do módulo:
http://xael.org/pages/pyclamd-en.html
tip1: Amigos que falam inglês podem ler os documentos oficiais diretamente. Claro, você também pode ler os documentos oficiais rapidamente após ler este artigo.
Dica2:
pypi
NapyClamd
última atualização em 2017, o autor pode não continuar a manter este projeto, e 且行且珍惜 ele ~
Três, use
3.1 Exemplos de métodos comuns
pyClamd
Fornece alguns métodos comuns, incluindo teste simples clamd
se está disponível, verificação de fluxo de bytes, verificação de arquivo / pasta, etc. A seguir, testaremos esses métodos no terminal Python.
A primeira etapa: Abra o terminal de linha de comando python3:
[root@程序员的一天 home]# python3
Python 3.7.4 (default, Sep 18 2020, 14:36:11)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>>
Etapa 2: Importar pyClamd
:
>>> import pyclamd
>>>
A terceira etapa: instanciar um clamd
objeto de controle:
>>> cd = pyclamd.ClamdAgnostic()
>>>
dica: este é o primeiro método de instanciação e os outros dois métodos serão introduzidos posteriormente, incluindo a conexão por meio da rede
clamd
.
Etapa 4: teste clamd
se ele pode ser conectado:
Se a conexão for bem-sucedida, retorne True
.
>>> cd = pyclamd.ClamdAgnostic()
>>> cd.ping()
True
>>>
Etapa 5: verifique a ClamAv
versão:
>>> cd.version()
'ClamAV 0.103.0/25929/Sun Sep 13 21:53:46 2020'
>>>
Etapa 6: Gerar amostras de vírus de teste:
pyClamd
Fornece um EICAR()
método que pode gerar rapidamente amostras de vírus para teste. Vamos primeiro dar uma olhada no conteúdo específico da amostra:
>>> cd.EICAR()
b'X5O!P%@AP[4\\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*'
>>>
dica: você pode ver que a saída é uma string de bytes python. Embora seja uma amostra de vírus, não o executamos, por isso é inofensivo. Não se preocupe com o envenenamento da máquina! !
Etapa 7: Fluxo de scan_stream()
detecção do método bytes
:
scan_stream()
O método é usado para detectar o bytes
fluxo.
Incluindo fluxos de bytes da rede, ele também pode ser detectado. Por exemplo, na frente do sistema de caixa de correio, todos os fluxos de bytes de email são detectados para detectar e eliminar emails maliciosos.
Podemos usar EICAR()
métodos para gerar fluxos de bytes para testar:
>>> cd.scan_stream(cd.EICAR())
{'stream': ('FOUND', 'Win.Test.EICAR_HDB-1')}
>>>
>>> cd.scan_stream(b'pythonbytes')
>>>
>>> cd.scan_stream(b'pythonbytes') is None
True
>>>
dica: se um vírus for detectado, retorne ao dicionário, caso contrário, retorne Nenhum.
Etapa 8: scan_file()
Verificação de arquivo / pasta:
scan_file()
Método para detectar arquivos ou pastas.
scan_file()
Método, assim que um vírus for detectado, a varredura terminará e o primeiro resultado de vírus será retornado imediatamente.
Se você ClamAv
usar o método de compilação do código-fonte para instalar, ClamAV
haverá uma test
pasta no pacote de descompactação do código-fonte , que contém todas ClamAv
as amostras de teste de vírus fornecidas:
[root@程序员的一天 clamAv]# ls
clamav-0.103.0 clamav-0.103.0.tar.gz
[root@程序员的一天 clamAv]#
[root@程序员的一天 clamAv]# ls clamav-0.103.0/test
clam.7z clam_cache_emax.tgz clam.exe.bz2 clam.impl.zip clam.mail clam-pespin.exe clam-upx.exe Makefile.am
clam.arj clam.chm clam.exe.html clam_IScab_ext.exe clam-mew.exe clam-petite.exe clam-v2.rar Makefile.in
clam-aspack.exe clam.d64.zip clam.exe.mbox.base64 clam_IScab_int.exe clam.newc.cpio clam.ppt clam-v3.rar README
clam.bin-be.cpio clam.ea05.exe clam.exe.mbox.uu clam_ISmsi_ext.exe clam-nsis.exe clam.sis clam-wwpack.exe
clam.bin-le.cpio clam.ea06.exe clam.exe.rtf clam_ISmsi_int.exe clam.odc.cpio clam.tar.gz clam-yc.exe
clam.bz2.zip clam.exe clam.exe.szdd clam.iso clam.ole.doc clam.tnef clam.zip
clam.cab clam.exe.binhex clam-fsg.exe clamjol.iso clam.pdf clam-upack.exe Makefile
[root@程序员的一天 clamAv]#
dica: Não examine levemente a pasta continuamente
test
, porque todas são amostras de vírus, a varredura será muito lenta (talvez possa ser usada para testar o desempenho de varredura do ClamAv). Você pode especificar um teste de arquivo específico entre eles ou gerar um novo teste de arquivo de amostra.
Podemos usar esses arquivos para teste ou podemos usar EICAR()
métodos para gravar strings de bytes de vírus em arquivos para gerar novos arquivos de amostra para teste. Aqui eu uso para gerar um novo arquivo para teste.
tmp
Gere EICAR
e NO_EICAR
arquive no diretório :
>>> void = open('/tmp/EICAR','w').write(cd.EICAR().decode())
>>> void = open('/tmp/NO_EICAR','w').write('no virus in this file')
>>>
dica: aqui, os arquivos e são
/tmp
gerados no diretório , que representam arquivos de amostra de vírus e arquivos normais, respectivamente.EICAR
NO_EICAR
Passe o caminho do arquivo específico para o scan_file()
método de verificação do arquivo :
>>> cd.scan_file('/tmp/EICAR')
{'/tmp/EICAR': ('FOUND', 'Win.Test.EICAR_HDB-1')}
>>>
>>> cd.scan_file('/tmp/NO_EICAR') is None
True
>>>
dica: Assim que o vírus for detectado, retorne imediatamente ao dicionário, que
key
é o arquivo específico evalue
o resultado da detecção. Caso contrário, ele retornaNone
.
Da mesma forma, você também pode passar um caminho de pasta como um scan_file()
parâmetro de método para verificação de pasta :
>>> cd.scan_file('/tmp')
{'/tmp/EICAR': ('FOUND', 'Win.Test.EICAR_HDB-1')}
>>>
dica: Depois que o primeiro arquivo de vírus é verificado, a verificação termina e o resultado é retornado.
Etapa 9: contscan_file()
Verificação de arquivos / pastas:
contscan_file()
Método, também usado para verificação de arquivo / pasta.
Diferente da scan_file()
verificação do método, o contscan_file()
método retornará todos os arquivos de vírus detectados depois que toda a pasta for verificada.
Para facilitar o teste, /tmp
geramos outro EICAR_1
arquivo de amostra no diretório . Em seguida, verifique o /tmp
diretório:
>>> void = open('/tmp/EICAR_1','w').write(cd.EICAR().decode())
>>>
>>> cd.contscan_file('/tmp/')
{'/tmp/EICAR': ('FOUND', 'Win.Test.EICAR_HDB-1'), '/tmp/EICAR_1': ('FOUND', 'Win.Test.EICAR_HDB-1')}
>>>
>>> cd.scan_file('/tmp')
{'/tmp/EICAR': ('FOUND', 'Win.Test.EICAR_HDB-1')}
>>>
dica: você pode ver que o
scan_file()
método retorna apenas um resultado econtscan_file()
irá verificar todo o diretório de arquivos e retornar todos os arquivos de ameaças detectados.
O mesmo contscan_file()
também pode ser usado para verificação de arquivo único:
>>> cd.contscan_file('/tmp/EICAR_1')
{'/tmp/EICAR_1': ('FOUND', 'Win.Test.EICAR_HDB-1')}
>>>
>>> cd.contscan_file('/tmp/EICAR')
{'/tmp/EICAR': ('FOUND', 'Win.Test.EICAR_HDB-1')}
>>>
3.2 Resumo dos métodos de pyClamd
conexãoclamd
Ao compilar, instalar ClamAv
e configurar o código-fonte clamd
, apresentamos: Se você deseja permitir a clamd
comunicação com outros aplicativos, ative pelo menos uma das seguintes opções:
# 本地套接字通信
LocalSocket
# 网络套接字通信
TCPSocket
Por exemplo, configure assim:
# LocalSocket /tmp/clamd.socket
TCPSocket 3310
dica: comunique-se na porta 3310 via soquete TCP.
Da mesma forma, pyClamd
com a clamd
comunicação, esses dois métodos também são correspondentes.
Em pyClamd
, duas classes são fornecidas para conexão clamd
. Eles são:
ClamdUnixSocket()
ClamdNetworkSocket()
Acima, usamos ClamdAgnostic()
um método de embalagem selecionado automaticamente.
Dica: Deve-se notar que não importa qual método está conectado, todos os métodos comuns são os mesmos após a criação de um objeto instanciado.
A seguir, iremos apresentá-los separadamente.
3.2.1. ClamdAgnostic()
Método
ClamdAgnostic()
Método, o método de conexão é selecionado automaticamente.
ClamdAgnostic()
Método, primeiro tente se ClamdUnixSocket
conectar clamd
. Se falhar, tente
se ClamdNetworkSocket
conectar. Finalmente, o objeto instanciado correspondente é retornado.
O ClamdAgnostic()
método em pyclamd.py é definido como:
dica: É o módulo principal
pyclamd.py
dapyClamd
biblioteca, podemos até colocar esse arquivo diretamente no programa sem usar apip
instalaçãopyClamd
.
############################################################################
def ClamdAgnostic():
"""
Tries to connect to clamd using ClamdUnixSocket or if it fails, tries
with ClamdNetworkSocket and return the corresponding object.
Of course, it tries to connect with default settings...
"""
try:
# Create object for using unix socket
cd = ClamdUnixSocket()
except ConnectionError:
# if failed, test for network socket
try:
cd = ClamdNetworkSocket()
except ConnectionError:
raise ValueError("could not connect to clamd server either by unix or network socket")
return cd
############################################################################
Se estivermos na mesma máquina e controlados por pythonclamd
, esse método será suficiente. Os exemplos de instanciação específicos são os seguintes:
>>> cd = pyclamd.ClamdAgnostic()
>>>
3.2.2, ClamdUnixSocket()
classe
ClamdUnixSocket()
Use soquetes locais para comunicação de processo no mesmo computador.
Precisa clamd.conf
configurar LocalSocket
opções:
# 指定本地套接字路径
LocalSocket /tmp/clamd.socket
ClamdUnixSocket()
Parte do código-fonte é o seguinte:
class ClamdUnixSocket(_ClamdGeneric):
"""
Class for using clamd with an unix socket
"""
def __init__(self, filename=None, timeout=None):
"""
Unix Socket Class initialisation
filename (string) : unix socket filename or None to get the socket from /etc/clamav/clamd.conf or /etc/clamd.conf
timeout (float or None) : socket timeout
"""
# try to get unix socket from clamd.conf
if filename is None:
for clamdpath in ['/etc/clamav/clamd.conf', '/etc/clamd.conf']:
if os.path.isfile(clamdpath):
break
else:
raise ConnectionError('Could not find clamd unix socket from /etc/clamav/clamd.conf or /etc/clamd.conf')
Como você pode ver, ClamdUnixSocket()
ele pode receber dois parâmetros de entrada:
# 指定本地套接字
filename
# 设置连接超时
timeout
Se, no mesmo computador, quisermos especificar um soquete local para controlar clamd
, podemos instanciar a ClamdUnixSocket()
classe:
>>> cd = pyclamd.ClamdUnixSocket(filename='/tmp/clamd.socket', timeout=10)
>>>
dica: O soquete local correspondente precisa existir.
3.2.3, ClamdNetworkSocket()
classe
ClamdNetworkSocket()
Classe, permitindo controle via sockets de rede clamd
.
Precisa clamd.conf
configurar TCPSocket
opções:
# 配置监听端口
TCPSocket 3310
# 配置监听地址,默认为0.0.0.0
TCPAddr 127.0.0.1
ClamdNetworkSocket()
Parte do código-fonte é o seguinte:
class ClamdNetworkSocket(_ClamdGeneric):
"""
Class for using clamd with a network socket
"""
def __init__(self, host='127.0.0.1', port=3310, timeout=None):
"""
Network Class initialisation
host (string) : hostname or ip address
port (int) : TCP port
timeout (float or None) : socket timeout
"""
Como você pode ver, ClamdNetworkSocket()
três parâmetros de entrada podem ser recebidos:
# 指定clamd监听地址
host
# 指定clamd监听端口
port
# 设置连接超时
timeout
Através ClamdNetworkSocket()
, podemos controlar remotamente através de máquinas e através de sockets de rede clamd
. Instancie a ClamdNetworkSocket()
classe:
>>> cd = pyclamd.ClamdNetworkSocket(host='127.0.0.1', port=3310, timeout=10)
>>>
Neste ponto, a pyClamd
introdução acabou!
FIM.
Alguns dos meus artigos serão publicados na conta pública pela primeira vez. Os leitores do Wechat podem pesquisar por: [ Dia do Programador ], amigos interessados podem seguir e apoiar, obrigado!
Cada atenção e elogio são um grande apoio e incentivo. Por fim, muito obrigado pela leitura.