Clam AntiVirus是一個免費並且開放源碼的防毒軟件,軟件與病毒庫的更新由開源社區免費發佈,目前ClamdAV主要爲Linux、Uinux系統提供病毒掃描查殺pyClamad是一個python的第三方模塊,可以讓python直接使用ClamAV病毒掃描守護進程clamd來實現一個高效的病毒檢測功能。python
1、實現集中式的病毒掃描mysql
一、安裝clamavp clamd 服務的相關程序包sql
yum install clamav clamd clamav-update -y數據庫
chkconfig clamd on服務器
更新病毒庫網絡
/usr/bin/freshclam多線程
更改配置文件修改監聽地址到全部網絡,啓動服務app
sed -i -e '/^TCPAddr/{ s/127.0.0.1/0.0.0.0/;}' /etc/clamd.confpython2.7
/etc/init.d/clamd starttcp
二、安裝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
2、使用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']))
3、實現一個程序完成取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()