多个 ping 脚本多次从一个列表中 ping 相同的 ip

multiple ping script keeps pinging the same ips from one list several times

我写了一个简单的代码,应该使用线程方法同时 ping 多个 ips。看起来代码 运行 很好并且能够执行任务,但问题是脚本 keeps 多次 ping 同一个 ips,尽管 range线程设置为列表中 ips 的编号。

代码如下:

import os
from threading import *
from time import *


def ipList():
    while True:
        ip = input("Insert an ip")
        ip_list.append(ip)
        if ip == "end":
            ip_list.pop()
            break


def ipPinger(ip_list):
    for ip in ip_list:
        response = os.popen(f"ping -c 4 {ip}").read()
        if "--- " in response:
            result = response[response.find("--- "):]
            print(result)


ip_list = []
ipList()

print(ip_list)

q = input("Are you sure that this is the right list? Y/N")
if q == "Y":
    print("Loading...")
else:
    ipList()

num = 0

for i in range(len(ip_list)):
    t = Thread(target=ipPinger, args=(ip_list[num + i:],))
    t.start()

这是我得到的输出:

Insert an ip8.8.8.8
Insert an ip1.1.1.1
Insert an ip8.8.4.4
Insert an ipend
['8.8.8.8', '1.1.1.1', '8.8.4.4']
Are you sure that this is the right list? Y/NY
Loading...
--- 1.1.1.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 8.132/9.569/10.592/1.017 ms

--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 47.767/48.436/49.066/0.547 ms

--- 8.8.4.4 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 47.001/47.400/48.047/0.434 ms

4s 后打印上部 ping,再 4s 后打印下部 ping

--- 1.1.1.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3006ms
rtt min/avg/max/mdev = 8.620/8.661/8.742/0.047 ms

--- 8.8.4.4 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 47.378/48.118/48.791/0.571 ms

--- 8.8.4.4 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 47.025/48.122/49.402/1.023 ms

我尝试为线程设置不同的范围,在线程中设置参数的不同方式,但没有找到解决方案。

ps。我完全是代码新手,所以也许我没有看到一些超级明显的东西,但我真的没有在网上找到解决方案所以只是想了解我在这里做错了什么

看来问题是你在拆分 num+i 和 forward 的列表,而不是获取 num+i 的索引值。 (此外,由于 num 在您的底部循环中永远不会递增,因此它不起作用)

假设我有一个如下所示的列表:

['1.1.1.1','8.8.8.8','8.8.4.4']

目前您在生成线程的 3 次迭代中像这样拆分它:

['1.1.1.1','8.8.8.8','8.8.4.4']
['8.8.8.8','8.8.4.4']
['8.8.4.4']

这完全是由您在此处生成线程时索引中的 : 运算符引起的:

for i in range(len(ip_list)):
t = Thread(target=ipPinger, args=(ip_list[num + i:],)) #Colon operator in indexing
t.start()

由于您的 IpPing 函数将一个列表作为参数并循环遍历该列表,因此它将循环遍历整个列表并针对每个线程对它们全部进行 ping。

我还希望您考虑,与其为要 ping 的每个 IP 生成一个线程(以防可能提供大列表),不如生成固定数量的线程或变量线程数 由用户指定。

然后让每个线程从同一个列表中弹出值,或者通过锁处理对该列表的访问。由于这里ping的时间很长,访问对象的时间很短

祝你编码顺利! :-)

编辑:措辞。