2016-04-12 14 views
0

Tam (çalışma dışı) burada kodPython3 parçacığı birden çok IP/test portu ping çalışıyor simultaineously

Full aşağıda kodu (/ parçacığı o w, çalışma): http://pastebin.com/KUYzNtT2

Ben küçük yazdım şunları yapar komut dosyası: bir CIDR bir veritabanı

  • ping her bir IP den

    1. çekin ağ bilgilerini (yani - 192.168.0.0/24); eğer çalışıyor ise, bu iyi çalışıyor

    belli liman

  • Ekran sonuçları açıksa da test edin, ama daha hızlı komut çalışmasını sağlamak için diş uygulamak istiyorum; taramak için binlerce IP'm var ve sonsuza dek sürüyor.

    İş parçacığı eğiticilerle oynamıştım ancak betiğimde nasıl uygulanacağını anlayamıyorum.

    Düşünceleriniz veya önerileriniz kabul edilir.

    DÜZENLEME: Bu kılavuzda dayanan farklı yöne gitti: http://chriskiehl.com/article/parallelism-in-one-line/

    Şimdi programı çalıştırmak ve almak: File "port_test.py", line 39, in display_results for (client, location, cidr) in results: ValueError: too many values to unpack (expected 3) ve nedenini anlamıyorum. Düşünceler?

    ** DÜZENLEME: Sanırım neden başarısız olduğunu anladım, havuz gibi görünüyor sadece bir veri noktası bekliyor. Diğer iki sütun yerine yalnızca CIDR'ler için DB'yi sorgularsam, program veri göndermeye başlar (daha önce olduğundan daha hızlı). Yani şimdi ben, sonra sonuçlara diğer iki sütunlar eklemek onlar mantıklı sonuçlarını sıralamak için nasıl anlamaya ihtiyacımız

    #! /usr/bin/python 
    # Import modules 
    import socket 
    import subprocess 
    import ipaddress 
    import mysql.connector 
    import configparser 
    import logging 
    import coloredlogs 
    from multiprocessing.dummy import Pool as ThreadPool 
    
    #logging.basicConfig(format='%(levelname)s:%(message)s',level=logging.INFO) 
    
    
    coloredlogs.install(level='DEBUG') 
    coloredlogs.DEFAULT_LOG_FORMAT = '%(asctime)s -- %(message)s' 
    # read from the config file 
    config = configparser.ConfigParser() 
    config.read('config.ini') 
    db=config['mysql'] 
    net=config['network'] 
    port = int(net['port']) 
    
    # create the connection, connect, and setup the query 
    cnx = mysql.connector.connect(user=db['user'], database=db['database'], password=db['password']) 
    cursor = cnx.cursor() 
    
    query = ("select fw.net_cidr as cidr " 
         "from firewalls fw " 
          "left join clients c on c.id = fw.client_id " 
          "left join locations l on l.id = fw.location_id " 
           "where fw.net_cidr <> '' and c.active = '1' and fw.active = '1'") 
    
    cursor.execute(query) 
    results = cursor.fetchall() 
    
    def display_results(results): 
    # execute and display the results 
        for (cidr) in results: 
          logging.info("{} --> ".format(cidr)) 
          try: 
           # Prompt the user to input a network address 
           net_addr = str(cidr) 
    
           # Create the network 
           ip_net = ipaddress.ip_network(net_addr) 
    
           # Get all hosts on that network 
           all_hosts = list(ip_net.hosts()) 
          except ValueError as e: 
           logging.warning(e) 
           continue 
    
          # For each IP address in the subnet, test to see if port 3389 is open 
          for i in range(len(all_hosts)): 
           sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
           sock.settimeout(.25) 
           result = sock.connect_ex((str(all_hosts[i]),port)) 
           if result == 0: 
             logging.info(str(all_hosts[i]) + ": " + net['port'] + " is open") 
          else: 
            logging.debug(str(all_hosts[i]) + ": " + net['port'] + " is not open") 
    
    # make a pool of workers 
    pool = ThreadPool(4) 
    
    # ping the cidrs in their own thread 
    pool.map(display_results, results) 
    pool.close() 
    pool.join() 
    
    # close the database connection 
    cursor.close() 
    cnx.close() 
    
  • +0

    Sorunuz ne? rt çalışmıyor? Okumalısınız. –

    +1

    Bkz. [Bu yanıt] (http://stackoverflow.com/a/35925129/1172714). Farklı işler yapmak için iş parçacıklarına ihtiyacınız var (farklı bir çalışma yapmak için bir imleci tek bir veritabanı sorgusunda paylaşamazlar). Bağımsız değişken gerektiren bir argümana ihtiyaç duyan bir fonksiyona sahip dört iş parçacığınız vardır. Daha sonra iş parçacığı başlatmaya çalıştıktan sonra imlecin sonuçlarını tüketirsiniz ve sonra iş parçacığı bittiğini görmek için beklemeden bağlantıyı kapatırsınız. (ancak bu noktada, yanlış sayıda argümanla işlevini çağırdıkları için bu noktadalarlar) – dsh

    +2

    , hem ProcessPoolExecutor hem de ThreadPoolExecutor sahip concurrent.futures modülüne bir göz atabilirler. Dokümanlardaki güzel örnekleri var. python 3: https://docs.python.org/3/library/concurrent.futures.html python 2.7: http: // pythonhosted.org/futures/ –

    cevap

    -1

    Grab (Ben mantıklı herhalde sonuçlarına hiçbir emir yoktur) tüm Başlangıçta veri ve bir Queue içinde saklayın. Queue boşalıncaya kadar

    (Sürekli çalışan bir fonksiyonu oluşturma, yani while my_queue.empty() is False.

    Kepçe Queue ilk nesne Queue sitesindeki get() yöntemi ile.

    sonra işlemek.

    başlatma İstediğiniz kadar iş parçacığı olarak, Queue boş olana kadar çalışacaklardır.

    İlgili konular