Python 腳本學習筆記(五)集中式病毒掃描,端口掃描以及分段數據庫操做

        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()
相關文章
相關標籤/搜索