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ı
- çekin ağ bilgilerini (yani - 192.168.0.0/24); eğer çalışıyor ise, bu iyi çalışıyor
belli liman
İş 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()
Sorunuz ne? rt çalışmıyor? Okumalısınız. –
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
, 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/ –