Python:如何ping一系列IP地址?

时间:2015-01-11 22:52:37

标签: python networking cmd ping

我想在Python中ping一系列IP地址并打印: “IP可以通过X%包丢失率达到”或 “X%程序包丢失无法访问IP”

我想尝试的范围是192.168.0.X,X是0-255的范围

到目前为止,这是我的代码;

import shlex
import subprocess
import os

for x in range(0, 256):
    cmd=shlex.split("ping -cl 192.168.0." + str(x))
    try:
       output = subprocess.check_output(cmd)
    except subprocess.CalledProcessError,e:
       #Will print the command failed with its exit status
       print "The IP {0} isn't reachable".format(cmd[-1])
    else:
       print "The IP {0} is reachable".format(cmd[-1])

我的代码出了什么问题?我也注意到当我尝试命令“ping -cl 192.168.0.2”时,它说-cl是一个仅限管理员的命令。我是我的计算机上的管理员,我作为管理员运行cmd,所以这有什么问题?

我使用的是Windows 8.1 Python v2.7.9

2 个答案:

答案 0 :(得分:1)

如果您使用的是Linux,而您只是希望看到数据包丢失:

import shlex
from subprocess import PIPE, Popen


cmd1 = shlex.split("grep -oP '\d+(?=% packet loss)'")
for x in range(1, 256):
    cmd = "ping  -c 4  192.168.43.{}".format(x).split()
    p1 = Popen(cmd, stdout=PIPE, stderr=PIPE)
    p2 = Popen(cmd1, stdin=p1.stdout, stdout=PIPE)
    p1.stdout.close()
    output = p2.communicate()[0].rstrip()
    if output == "100":
        print("{}% percent packet loss from unreachable ip {}".format(output, cmd[-1]))
    else:
        print("{}% percent packet loss from reachable ip {}".format(output, cmd[-1]))

免责声明我不使用Windows,因此可以进行更正,但这可能有效:

for x in range(1, 256):
    cmd = "ping  -c 1  192.168.43.{}".format(x).split()
    p1 = Popen(cmd, stdout=PIPE, stderr=PIPE)
    lines = p1.communicate()[0].splitlines()
    output = (lines[-2]).rsplit(None,5)
    output = output[-5].rstrip()
    if output == "100%":
        print("{} percent packet loss from unreachable ip {}".format(output, cmd[-1]))
    else:
        print("{} percent packet loss from reachable ip {}".format(output, cmd[-1]))

答案 1 :(得分:0)

如果你安装了scapy模块,你应该尝试使用:

genvar i;
generate
    for(i=0;i<100;i=i+1) begin
        assign arr[i] = 22;
    end
endgenerate

速度很快,还会打印与ip关联的mac地址,因此非常有用。