Clam AntiVirus是一个免费而且开放源码的防毒软件,软件与病毒库的更新由开源社区免费发布,目前ClamdAV主要为Linux、Uinux系统提供病毒扫描查杀pyClamad是一个python的第三方模块,可让python直接使用ClamAV病毒扫描守护进程clamd来实现一个高效的病毒检测功能。
一、实现集中式的病毒扫描
1、安装clamavp clamd 服务的相关程序包
yum install clamav clamd clamav-update -y
chkconfig clamd on
更新病毒库
/usr/bin/freshclam
更改配置文件修改监听地址到所有网络,启动服务
sed -i -e ‘/^TCPAddr/{ s/127.0.0.1/0.0.0.0/;}‘ /etc/clamd.conf
/etc/init.d/clamd start
2、安装pyClamd模块
pip2.7 install pyClamd
工作原理:管理服务器通过python发出多线程指令连接业务服务器的3310端口,执行病毒扫描,然后返回结果给管理服务器。 业务服务器必须安装clamd相关程序包,并启动服务监听在3310端口才能正常收到指令;
实现代码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import pyclamd
from threading import Thread
class Scan(Thread): #继承多线程Thread类
def __init__ (self,IP,scan_type,file):
"""构造方法"""
Thread.__init__(self)
self.IP = IP
self.scan_type=scan_type
self.file = file
self.connstr=""
self.scanresult=""
def run(self):
"""多进程run方法"""
try:
cd = pyclamd.ClamdNetworkSocket(self.IP,3310)
"""探测连通性"""
if cd.ping():
self.connstr=self.IP+" connection [OK]"
"""重载clamd病毒特征库"""
cd.reload()
"""判断扫描模式"""
if self.scan_type=="contscan_file":
self.scanresult="{0}\n".format(cd.contscan_file(self.file))
elif self.scan_type=="multiscan_file":
self.scanresult="{0}\n".format(cd.multiscan_file(self.file))
elif self.scan_type=="scan_file":
self.scanresult="{0}\n".format(cd.scan_file(self.file))
time.sleep(1)
else:
self.connstr=self.IP+" ping error,exit"
return
except Exception,e:
self.connstr=self.IP+" "+str(e)
IPs=[‘192.168.1.21‘,‘192.168.1.22‘] #扫描主机的列表
scantype="multiscan_file" #指定扫描模式
scanfile="/data/www" #指定扫描路径
i=1
threadnum=2 #指定启动的线程数
scanlist = [] #存储Scan类线程对象列表
for ip in IPs:
"""将数据值带入类中,实例化对象"""
currp = Scan(ip,scantype,scanfile)
scanlist.append(currp) #追加对象到列表
"""当达到指定的线程数或IP列表数后启动线程"""
if i%threadnum==0 or i==len(IPs):
for task in scanlist:
task.start() #启动线程
for task in scanlist:
task.join() #等待所有子线程退出,并输出扫描结果
print task.connstr #打印服务器连接信息
print task.scanresult #打印结果信息
scanlist = []
i+=1二、使用python-nmap模块实现一个高效的端口扫描器
需要依赖nmap和python-nmap;
yum install nmap
pip2.7 install python-nmap
实现代码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import nmap
scan_row=[]
input_data = raw_input(‘Please input hosts and port: ‘)
scan_row = input_data.split(" ")
if len(scan_row)!=2:
print "Input errors,example \"192.168.1.0/24 80,443,22\""
sys.exit(0)
hosts=scan_row[0] #接收用户输入的主机
port=scan_row[1] #接收用户输入的端口
try:
nm = nmap.PortScanner() #创建端口扫描对象
except nmap.PortScannerError:
print(‘Nmap not found‘, sys.exc_info()[0])
sys.exit(0)
except:
print("Unexpected error:", sys.exc_info()[0])
sys.exit(0)
try:
nm.scan(hosts=hosts, arguments=‘ -v -sS -p ‘+port) #调用扫描方法,参数指定扫描主机hosts,nmap扫描命令行参数arguments
except Exception,e:
print "Scan erro:"+str(e)
for host in nm.all_hosts(): #遍历扫描主机
print(‘----------------------------------------------------‘)
print(‘Host : %s (%s)‘ % (host, nm[host].hostname())) #输出主机及主机名
print(‘State : %s‘ % nm[host].state()) #输出主机状态,如up、down
for proto in nm[host].all_protocols(): #遍历扫描协议,如tcp、udp
print(‘----------‘)
print(‘Protocol : %s‘ % proto) #输入协议名
lport = nm[host][proto].keys() #获取协议的所有扫描端口
lport.sort() #端口列表排序
for port in lport: #遍历端口及输出端口与状态
print(‘port : %s\tstate : %s‘ % (port, nm[host][proto][port][‘state‘]))三、实现一个程序完成取MySQL数据导出txt,完成压缩,传FTP服务器,自动删除过期数据。
#!/usr/local/python27/bin/python2.7
#coding:utf-8
import os
import sys
import pymysql
import ftplib
import commands
import time
import datetime
"""从数据库获取数据"""
def sql(user,passwd,host,db):
conn = pymysql.connect(host=host,user=user,password=passwd,db=db)
cur = conn.cursor()
cur.execute("select count(*) from ucenter_member;")
result_num = cur.fetchall()
"""由于返回的数据是一个元组,下面的格式转换用于去除括号"""
total_num = int(str(result_num).lstrip(‘((‘).rstrip(‘,),)‘))
"""总行数 / 每次取数据的行数 = 需要取的次数 + 1 是因为怕不能整除可以把剩下的数据都取出"""
linesum = (total_num/5000+1)
j = 0
while ( j < linesum ):
result_num = cur.execute("SELECT id,login,reg_time,last_login_time,type from ucenter_member limit"+‘ ‘+str(int(j*5000))+‘,‘+str(5000)+‘;‘)
data = cur.fetchall()
"""定义输出的文件对象"""
outfile = open(‘/alidata/data_analyse/ucenter-%s‘% time.strftime(‘%Y-%m-%d‘,time.localtime(time.time()))+‘.txt‘,‘a+‘)
for i in range(result_num):
out = str(data[i]).strip(‘()‘)+‘\n‘
outfile.write(out)
j+=1
outfile.close()
outfilename = (‘ucenter-%s‘% time.strftime(‘%Y-%m-%d‘,time.localtime(time.time()))+‘.txt‘)
return outfilename
"""FTP文件上传函数"""
def upload(file):
os.chdir(‘/alidata/data_analyse/‘)
file_path = os.path.abspath(file)
f = open(file_path,‘rb‘)
ftp = ftplib.FTP(‘115.236.179.166‘)
ftp.login(‘liuyang‘,‘liuyang666999‘)
"""上传文件,STOR 后面的 %s 定义的是上传后保存的文件名,f为需要上传的文件对象"""
ftp.storbinary(‘STOR %s‘%file,f)
"""文件压缩函数"""
def gzip(filename):
os.chdir(‘/alidata/data_analyse/‘)
g = commands.getoutput("zip -9 %s %s" %(filename+‘.zip‘,filename))
return(filename+‘.zip‘)
"""过期文件删除函数"""
def Del_file():
"""切换程序的工作目录"""
os.chdir(‘/alidata/data_analyse/‘)
ThreeDaysAgo = (datetime.datetime.now() - datetime.timedelta(days=3))
rmtime = ThreeDaysAgo.strftime("%Y-%m-%d")
rmfile = (‘ucenter-%s‘% rmtime+‘.txt‘)
rmfile2 = (‘ucenter-%s‘% rmtime+‘.txt.zip‘)
if os.path.exists(rmfile):
os.remove(rmfile)
if os.path.exists(rmfile2):
os.remove(rmfile2)
return
if __name__ == ‘__main__‘:
outfilename = sql(‘root‘,‘123456‘,‘10.1.1.1‘,‘hellodb‘)
gzipfile = gzip(outfilename)
starttime = datetime.datetime.now()
upload(gzipfile)
endtime = datetime.datetime.now()
uptime = (endtime - starttime).seconds
with open(‘./history.log‘,‘a+‘) as f:
f.write(‘time:%s,upload cost time:%s‘ % (time.strftime(‘%Y-%m-%d %H:%M:%S‘,time.localtime(time.time())),uptime)+‘\n‘)
Del_file()本文出自 “突破舒适区” 博客,转载请与作者联系!
Python 脚本学习笔记(五)集中式病毒扫描,端口扫描以及分段数据库操作
原文地址:http://tchuairen.blog.51cto.com/3848118/1698897