2016-07-24 5 views
0

に一度実行されます。私はドメインと一致するIPアドレスのリストの証明書を取得するためにPythonスクリプトを書いたPythonの3

#! /usr/bin/env python3 

import ssl 
import socket 
import argparse 
from threading import Thread, Lock 
from itertools import islice 

class scanThread(Thread): 
    def __init__(self,iplist, q, hostname, port): 
     Thread.__init__(self) 
     self.iplist = iplist 
     self.hostname = hostname 
     self.port = port 
     self.queue = q 

    def dummy(self,ip): 
     print("Running dummy") 

    def checkCert(self, ip): 
     print('Processing IP: %s' % ip) 
     ctx = ssl.create_default_context() 
     s = ctx.wrap_socket(socket.socket(), server_hostname=self.hostname) 
     try: 
      s.connect((ip, self.port)) 
      cert = s.getpeercert() 
      if cert['subjectAltName'][0][1].find(hostname) != -1: 
       return ip 
     except (ssl.CertificateError, ssl.SSLError): 
      print('Ignore: %s' % ip) 
     finally: 
      s.close() 
      return 

    def run(self): 
     for ip in self.iplist: 
      returnIP = self.checkCert(ip) 
      if returnIP: 
       self.queue.append(ip) 

def main(l, hostname, port): 
    iplist = [] 
    threads = [] 
    hostPool = [] 
    with open(l,'r') as f: 
     #while True: 
     iplist.extend([f.readline().strip() for x in islice(f, 10000)]) 
     #print(iplist) 
     t = scanThread(iplist, hostPool, hostname, port) 
     t.start() 
     threads.append(t) 
     iplist.clear() 

    for t in threads: 
     t.join() 

    for h in hostPool: 
     print(h) 




if __name__ == '__main__': 
    parser = argparse.ArgumentParser() 
    parser.add_argument("hostname",help="root hostname") 
    parser.add_argument("-l","--list",required=True, help="IP list for scanning") 
    parser.add_argument("-p","--port", nargs='?', const=443, default=443, type=int, help="port to scan") 
    arg = parser.parse_args() 
    main(arg.list,arg.hostname, arg.port) 

私はちょうどmain機能でwhileループをコメントアウトし、スクリプトは1つのスレッドを作成し、10,000のIPをスキャンします。

取る 'google.com' は、たとえば、それは数多くのIPは、世界的に対処しています

./google.py -l 443.txt google.com 

出力例:私はかなり確信している、いくつかのテストの後

Processing IP: 13.76.139.89 
Ignore: 13.76.139.89 

をそのfor ... inループscanThread.run()で1回実行されます。このスニペットコードでは不適切なことをしましたか?

答えて

0

これは、main関数のリストをクリアしている可能性があります。

t = scanThread(iplist, hostPool, hostname, port) 
    t.start() 
    threads.append(t) 
    iplist.clear() // here you are clearing. 

あなたが試すことができます:

class scanThread(Thread): 
    def __init__(self,iplist, q, hostname, port): 
     Thread.__init__(self) 
     self.iplist = list(iplist) 

self.iplist = list(iplist)これはむしろ、渡されたリストを使用するよりも、リストのコピーを作成しています。

+0

私はこれを理解していませんでした。あなたの答えをありがとう。 –

+0

@ J.Kはそれが機能しましたか? –

+0

はい。それは気が狂う。あなたは言ったように:) –

関連する問題