无法从文件中 ping 多个 IP 地址

Unable to ping multiple IP addresses from file

我有一个 ip.txt 文件,其中包含一个 IP 地址列表。我想 ping 文件中的每个地址并永远重复此操作。但是我的脚本只对最后一行中包含的地址执行 ping 操作(请参阅下面的输出)。我该如何修改我的脚本来解决这个问题?

import cmd
import time
import sys
import os

my_file = open("ip.txt","rb")
for line in my_file:
        l = [i.strip() for i in line.split(' ')]
        IP = l[0]

def Main():

    while True:
        ping = os.system("ping", "-c", "1", "-n", "-W", "2", IP)
        if ping:
            print IP 'no connection'
            CT =time.strftime("%H:%M:%S %d/%m/%y")
            alert=' No Connection'
            with open('logfile.txt','a+') as f:
                f.write('\n'+CT)
                f.write(alert)

        time.sleep(4)

if __name__ == "__main__":
    Main()

输出:

[root@localhost PythonScript]# python pingloop.py
PING 192.168.1.100 (192.168.1.100) 56(84) bytes of data.
64 bytes from 192.168.1.100: icmp_seq=1 ttl=128 time=0.655 ms
64 bytes from 192.168.1.100: icmp_seq=2 ttl=128 time=1.15 ms
64 bytes from 192.168.1.100: icmp_seq=3 ttl=128 time=1.14 ms
64 bytes from 192.168.1.100: icmp_seq=4 ttl=128 time=0.529 ms
64 bytes from 192.168.1.100: icmp_seq=5 ttl=128 time=0.538 ms

--- 192.168.1.100 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4006ms
rtt min/avg/max/mdev = 0.529/0.805/1.156/0.287 ms
PING 192.168.1.100 (192.168.1.100) 56(84) bytes of data.
64 bytes from 192.168.1.100: icmp_seq=1 ttl=128 time=0.476 ms
64 bytes from 192.168.1.100: icmp_seq=2 ttl=128 time=0.416 ms
64 bytes from 192.168.1.100: icmp_seq=3 ttl=128 time=0.471 ms
64 bytes from 192.168.1.100: icmp_seq=4 ttl=128 time=0.478 ms
64 bytes from 192.168.1.100: icmp_seq=5 ttl=128 time=0.574 ms

ip.txt 文件:

192.168.1.91
192.168.1.92
192.168.1.93
192.168.1.94
192.168.1.95
192.168.1.96
192.168.1.97
192.168.1.98
192.168.1.99
192.168.1.100

IP 定义为全局列表变量并将所有 ip 地址添加到此列表,然后遍历列表:

IP = []
for line in my_file: 
    l = [i.strip() for i in line.split(' ')] 
    IP.append(l[0])

# instead while use for 
for ip in IP: 
    ping = os.system("ping", "-c", "1", "-n", "-W", "2", ip)
    ...
for line in my_file:
        l = [i.strip() for i in line.split(' ')]
        IP = l[0]

在这里,您在每次迭代中用新地址覆盖 先前读取的 IP 地址。所以最后,正如你观察到的,你只有最后一个地址。

相反,构建一个 列表 地址:

addresses = []
for line in my_file:
    IP = line.split()[0].strip()
    addresses.append(IP)

或者干脆

addresses = [line.split()[0].strip() for line in my_file]

稍后,您必须在地址列表上添加一个额外的循环。而不是:

while True:
    ping = os.system("ping", "-c", "1", "-n", "-W", "2", IP)
    # etc.

while True:
    for IP in addresses:
        ping = os.system("ping", "-c", "1", "-n", "-W", "2", IP)
        # etc.