Самый быстрый метод пинг через python? - PullRequest
0 голосов
/ 03 февраля 2020

Я ищу самый быстрый метод пинг через python. Мне нужно пропинговать более 100 000 серверов, и моя текущая процедура, описанная ниже, занимает около 85 минут. Я прочитал небольшие фрагменты о scapy, а также общий ICMP и python ping. Мне нужно знать точный метод или хотя бы solid способ тестирования, который является самым быстрым. Я не могу проверить python - пинг с работы, поскольку это не утвержденный пакет. Я также попробовал фрагмент кода для scapy, но получил сообщение об ошибке:

OSError: Windows native L3 Raw sockets are only usable as administrator !
Install 'Winpcap/Npcap to workaround !

Так что я, разумеется, ищу фрагменты кода, которые можно проверить дома, или способы обойти эту ошибку у более опытных людей

Чтобы доказать, что я пытался, вот несколько связанных постов, а также мой текущий код

Текущий код:

import pandas as pd
import subprocess
import threading
raw_list = []
raw_list2 = []
def ping(host):
    raw_list.append(host+ ' '+ str((subprocess.run('ping -n 3 -w 800 '+host).returncode)))
with open(r"FILEPATH", "r") as server_list_file:
    hosts = server_list_file.read()
    hosts_list = hosts.split('\n')
num_threads = 100
num_threads2 = 10
num_threads3 = 1
number = 0
while number<len(hosts_list):
    print(number)
    if len(hosts_list)>number+num_threads:
        for i in range(num_threads):
            t = threading.Thread(target=ping, args=(hosts_list[number+i],))
            t.start()
        t.join()
        number = number + num_threads
    elif len(hosts_list)>(number+num_threads2):
        for i in range(num_threads2):
            t = threading.Thread(target=ping, args=(hosts_list[number+i],))
            t.start()
        t.join()
        number = number + num_threads2
    elif len(hosts_list)>(number+num_threads3-1):
        for i in range(num_threads3):
            t = threading.Thread(target=ping, args=(hosts_list[number+i],))
            t.start()
        t.join()
        number = number + num_threads3
    else:
        number = number+1
for x in range(len(raw_list)):
    if(raw_list[x][-1] == '0'):
        raw_list2.append(raw_list[x][0:-2])
to_csv_list = pd.DataFrame(raw_list2)
to_csv_list.to_csv('ServersCsv.csv', index = False, header = False)
to_csv_list.to_csv(r'ANOTHERFILEPATH', index = False, header = False) 
subprocess.call(r'C:\ProgramData\Anaconda3\python.exe "A_PROGRAM_THAT_INSERTS_INTO_SQL"')

Это делает именно то, что мне нужно, однако, он делает это недостаточно быстро.

Я пробовал очень маленький фрагмент:

from scapy.all import *
packets = IP(dst=["www.google.com", "www.google.fr"])/ICMP()
results = sr(packets)

, в результате чего gaierror: [Errno 11001] getaddrinfo failed

Я также пробовал:

TIMEOUT = 2
conf.verb = 0
packet = IP("ASERVERNAME", ttl=20)/ICMP()
reply = sr1(packet, timeout=TIMEOUT)
if not (reply is None):
     print(reply.dst + "is online")
else:
     print("Timeout waiting for %s") % packet[IP].dst

в результате:

OSError: Windows native L3 Raw sockets are only usable as administrator !
Install Winpcap/Npcap to workaround !

Несколько ссылок, на которые я посмотрел, но не смог получить solid ответ от:

Пинг сайта в Python?

Самый быстрый способ пинговать хост в python?

1 Ответ

0 голосов
/ 04 февраля 2020

Это только решает часть Python. Комментарии очень правильные.

OSError: Windows Собственные сокеты L3 Raw можно использовать только как администратор! Установите Winpcap / Npcap для обхода!

Я нахожу это чертовски явным. Если вы следуете документации по Scapy для windows, в ней говорится, что вам необходимо установить Npcap. https://nmap.org/npcap/

Кроме этого,

packets = IP(dst=["www.google.com", "www.google.fr"])/ICMP()
results = sr(packets)

Вероятно, самый чистый путь к go. Работает на моей машине ... убедитесь, что вы используете последнюю версию разработки от GitHub (распакуйте его и установите через python setup.py install).

Если вы используете последняя версия , вы можете даже включить threaded=True в sr() для отправки и получения пакетов в двух потоках, как указано в комментариях. Вы также можете использовать prn и store=False, чтобы не хранить ответы (100 тыс. Это много)

...