2016-03-10 84 views
0

我拼凑了一个自动vnc扫描器。它通过IP地址循环,如果它检测到一个开放端口5900,它会尝试一个屏幕截图。它不漂亮,建造不好,但它的工作原理。然而,它很慢。我已经尝试了线程的过程,但我一直在挣扎。你可以看到我已经添加了一个计时器,所以我可以看到扫描30个IP需要多长时间。我已经尝试了多种线程和线程库。这个当前的迭代可能是我拥有的最快的迭代,但它比没有线程快了几秒。如果您能提供一些反馈意见,我将不胜感激。Python Threading的新手 - 它似乎没有区别

非常感谢

import socket 
    import nmap 
    from vncdotool import * 
    from ipaddress import * 
    import pexpect 
    import time 
    from multiprocessing import Pool, freeze_support 
    from multiprocessing.dummy import Pool as ThreadPool 
    import itertools 



    def vncconnect(tgtHost): 
     try: 
      ip = str(tgtHost) 
      command = 'vncdotool -v -s ' + ip + ' --delay=1000 capture %s' % (ip + '.jpg') 
      child = pexpect.spawn(command) 
      child.expect ('INFO:root:connecting') 
      time.sleep (10) 
      print 'attempting screenshot on ' + ip 
      child.expect (pexpect.EOF) 
     except: 
      pass 

    def nmapScan(tgtHost,tgtPort): 

     try: 
      nmScan = nmap.PortScanner() 
      result = nmScan.scan(str(tgtHost),str(tgtPort)) 
      if (result['nmap']['scanstats']['uphosts'] == '1'): 
      print 'Trying ' + tgtHost + ' - appears open: attempting to connect' 
      vncconnect(tgtHost) 
      f = open('database', 'r+') 
       f.write(tgtHost + ' Banner: ' + result['scan']['190.81.24.103']['tcp'][5900]['name'] + result['scan']['190.81.24.103']['tcp'][5900]/    ['version'] + '/n') 

      else: 
      print 'Trying ' + tgtHost + ' - is not open' 
     except: 
      pass 


    def main(): 
     net4 = IPv4Address(u'170.0.0.0') 
     y = 0 
     start = time.time() 
     numberofhoststoscan = 30 
     while y < numberofhoststoscan: 
      try:    

       port = '5900' 
       y = y + 1 
       z = str(net4) 
       nmapScan(z, port) 
       net4 = net4 + 1 

      except: 
       pass    
       net4 = net4 + 1 
     end = time.time() 
     total = (end - start) 
     print 'total scan time = ' + str(total) + ', scanned ' + str(numberofhoststoscan) + ' hosts' 

    if __name__ == "__main__": 
     freeze_support() 
     pool = ThreadPool(4) 
     pool.map(main()) 
     pool.close() 
     pool.join() 
+0

什么是'pool.map(main())'应该实现?它同步调用'main()',然后调用'pool.map(None)'。 – Duncan

+0

只要注意。你的代码根本不使用线程。 –

回答

3

它看起来像:

  1. 启动线程池,然后完成整个扫描:pool.map(main())。不要拨打main,只需传递对象:pool.map(main)
  2. 每个线程将开始扫描同一组IP地址。您希望每个线程都扫描一组不同的IP地址,以便在它们之间划分工作。


更新:我会用generator生产地址扫描

def addressesToScan(firstAddress, numberofhoststoscan): 
    net4 = IPv4Address(firstAddress) 
    for y in range(numberofhoststoscan): 
     yield net4 
     net4 = net4 + 1 

要使用它,你需要接受的地址的功能。为了测量总时间,您需要在线程工作人员之外进行测量。

def worker(targetHost): 
    port = '5900' 
    try: 
     nmapScan(targetHost, port) 
    except: 
     pass 

if __name__ == "__main__": 
    freeze_support() 
    pool = ThreadPool(4) 
    start = time.time() 
    pool.map(worker, addressesToScan(u'170.0.0.0', 30)) 
    pool.close() 
    pool.join() 

    end = time.time() 
    total = (end - start) 
    print 'total scan time = ' + str(total) + ', scanned ' + str(numberofhoststoscan) + ' hosts' 
+1

pool.map()应该有一个iterable作为第二个参数,可能是ip地址... –

+0

啊我明白你的意思了。这就说得通了。把它放在nmap函数中会更好吗? – nick

+0

嗨Antti你会如何建议使线程函数中的IP变量迭代?非常感谢 – nick