python端口掃描

前段時間寫了個端口掃描的python腳本,發現現在忘記的差不多了,趕緊記錄下來吧,雖然是併發的,但是在實際的使用場景中,如果掃描的機器過多,依舊有性能上的問題,好在我需要掃描的機子就那麼幾臺.腳本寫的生爛...

下面附源碼:

#!/usr/bin/env python
#-*- coding:utf-8 -*-
import nmap
import threading
import smtplib
import string
from email.mime.text import MIMEText
from email.header import Header
import sys
#防止linux下中文出問題
reload(sys)
sys.setdefaultencoding('utf-8')

#設置白名單接口
PortList=[22,80,xxx,xxx]

#設置收件人列表:多個需要用逗號隔開,如:['[email protected]','[email protected]','[email protected]']
MailList=['[email protected]','[email protected]','[email protected]']

#定義個全局變量以接受scan1函數中的變量
result = ''

#總共執行的主機數,從ip.txt裏面讀取主機,當然有的需求可能是從數據庫中,這裏可以自行修改
num=file('ip.txt','r')
HostNum=len(num.readlines())
num.close()

#定義發郵件函數
def SendMail(sender,receiver,subject,content,smtpserver,smtpuser,smtppass):
  msg = MIMEText(content,'html','utf-8')
  msg['Subject'] = Header(subject, 'utf-8')
  msg['From'] = '<%s>' % sender 
  msg['To'] = ";".join(receiver)
  try: 
    smtp = smtplib.SMTP()
    smtp.connect(smtpserver)
    smtp.login(smtpuser, smtppass)
    smtp.sendmail(sender, receiver, msg.as_string())
    smtp.quit()
  except Exception,e:
      print e
#定義掃面端口函數,默認端口是1-65535
def scan1(ip,port='1-65535'):
  nm = nmap.PortScanner()
  nm.scan(ip,port)
  global result
  result = result + "<h2>ip地址: %s</h2><hr>" %(ip)
  for proto in nm[ip].all_protocols():
    lport = nm[ip][proto].keys()
   # print lport
    lport.sort()
    for port in lport:
      if port in PortList:
        info = '<strong><font color=green>Info:正常開放端口:</font></strong>&nbsp;&nbsp;'
        portinfo='%s<strong> port </strong>: %s&nbsp;&nbsp;<strong>state</strong>: %s &nbsp;&nbsp;<strong>product</strong>: %s<br>' %(info,port,nm[ip][proto][port]['state'],nm[ip]['tcp'][port]['name'])
        result = result + portinfo
      else:
        info = '<strong><font color=red>Info:非預期端口</font></strong>&nbsp;&nbsp;'
        portinfo='%s<strong> port </strong>: %s&nbsp;&nbsp;<strong>state</strong>: %s &nbsp;&nbsp;<strong>product</strong>: %s<br>' %(info,port,nm[ip][proto][port]['state'],nm[ip]['tcp'][port]['name'])
        result = result + portinfo 
  return result
#定義多線程掃描
def main():
  threads=[]
  #使用的ip列表文件
  f=file('./ip.txt','rU')
  nloops = len(f.readlines())
  f.seek(0)
  global ErrorNum
  global CurNum
  global ErrHostList
  ErrorNum=0
  CurNum=0
  ErrHostList = ''
  for i in f.readlines():
    t=threading.Thread(target=scan1,args=(i.strip(),))
    threads.append(t)
  for i in range(nloops):
    try:
      threads[i].start()
    except Exception,e:
      ErrorNum=ErrorNum+1
      ErrHostList = ErrHostList + '%s' % num[ip]
    else:
      CurNum=CurNum+1
  for i in range(nloops):
    threads[i].join()
  f.close()
if __name__ == "__main__":
  main()
  sender = '[email protected]'
  receiver = MailList
  #郵件主題,如:xxx端口掃描
  subject = 'xxx端口掃描'
  smtpserver = 'smtp.xxxx.com'
  smtpuser = '[email protected]'
  smtppass = 'xxxx'
  #mailcontent = '<h1>共執行%s 臺主機<h1><br>' % HostNum + '<h2>成功%s臺<h2><br>' % CurNum + '<h2>失敗%s臺<h2><br>' % ErrorNum + '<h2>失敗的ip爲:%s<h2><br>' % ErrHostList + result 
  mailcontent = '<h1>共執行%s 臺主機</h1>' % HostNum + '<h2>成功%s臺</h2>' % CurNum + '<h2>失敗%s臺</h2>' % ErrorNum + '<h2>失敗的ip爲:%s</h2><hr>' % ErrHostList + result 
  #print mailcontent
  SendMail(sender,receiver,subject,mailcontent,smtpserver,smtpuser,smtppass)
  #print result


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章