python - 通过python最快的ping方法?
问题描述
我正在寻找通过 python 最快的 ping 方法。我需要 ping 超过 100,000 台服务器,我当前的以下过程大约需要 85 分钟才能完成。我已经阅读了关于 scapy 的小片段,以及一般的 ICMP 和 python ping。我需要知道一种确定的方法,或者至少是一种可靠的测试方法,这是最快的。我无法测试 python - 工作中的 ping,因为它不是一个批准的包。我还尝试了 的代码片段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 !
我查看了一些链接,但无法从以下链接中获得可靠的答案:
解决方案
这仅解决了 Python 部分。评论说的很对。
OSError:Windows 原生 L3 原始套接字只能以管理员身份使用!安装 Winpcap/Npcap 解决方法!
我觉得这该死的很明确。如果您遵循 Windows 的 Scapy 文档,它会说您需要安装Npcap
. https://nmap.org/npcap/
除此之外,
packets = IP(dst=["www.google.com", "www.google.fr"])/ICMP()
results = sr(packets)
可能是最干净的方法。在我的机器上工作.. 确保您使用的是来自 GitHub 的最新开发版本(解压缩并通过 安装python setup.py install
)。
如果您使用的是最新版本,您甚至可能想要打开以threaded=True
在sr()
两个线程上发送和接收数据包,正如评论所指出的那样。您可能还想使用prn
而store=False
不是存储答案(100k 很多)
推荐阅读
- wordpress - 在woocommere中删除订单号之前的#
- spring - Chrome 允许 ajax 访问 http 外部来源,而 firefox 不允许 - 为什么?
- node.js - 如何从打字稿访问节点标准库
- swift - 如何在 swift 中创建动态自调整高度 UITableViewCell?
- django - 为什么 Nginx 找不到 Django 的静态文件?
- wordpress - 从 wordpress 中删除尾部斜杠
- qt - QML 和 QGraphicsScene
- android - 如何使用 CrossRef Junction 在 Android Room 中建模多对多关系
- powershell - 每分钟复制和重命名一个文件
- excel - 查找包含数据的最后一列并在该列之后添加数据