iT邦幫忙

0

使用 Python ping 一段 IP

我有一段 IP,我想通过 Python 去 ping 这些 IP,看看那些 IP 可以 ping 通。

我的 IP 段是 10.10.240.0 - 10.10.255.255

我通过 os.system("ping" + ip) 去 ping IP;

首先,我想通过 for 循环去生成 IP

for i in range(240,255):
    for j in range(1,255):
        ip = "10.10." + i + j        

但我发现生成的第一个 IP 并不是 10.10.240.1
这个是怎么回事?

当我使用一个 txt 文本文件代替自动生成 IP,我准备了两个 txt 文件,一个是存放需要 ping 的 IP 地址,当可以 ping 通后,写入 ping.txt 文件。

import os

ping = open('ping.txt','a')

f = open("ip.txt")
for i in f:
    PingReturn = os.system("ping -c 1 " + i )
    if PingReturn == 0:
        ping.write(str(i))
    else:
        pass

但,该代码运行后,不管ping 的结果怎么样,都会被写入到 ping.txt.

然后,我用下面代码做了一个测试,发现,不管 IP 可以不可以ping 通,返回的值都 0,也就是这个 a 的值,那么我应该怎么写 if 判断?

import os

ip = "15.83.240.49"
a = os.system("ping " + ip)

print(a)

1 個回答

0
listennn08
iT邦高手 7 級 ‧ 2020-06-05 15:45:29
最佳解答
import subprocess

for i in range(240, 255):
    for j in range(1, 255):
        PingReturn = subprocess.Popen('ping -c 1 -n 1 10.10.%s.%s' % (i, j),stdout=subprocess.PIPE)
        PingReturn.wait()
        if PingReturn.poll() == 0:
            ping.write(str(i))
看更多先前的回應...收起先前的回應...
as900 iT邦新手 1 級 ‧ 2020-06-05 15:48:37 檢舉

不好意思,是我写错了,是 range

as900
你可以用 subprocess 我修改答案了

as900 iT邦新手 1 級 ‧ 2020-06-05 16:49:39 檢舉

自动生成 IP 那个可以了,不过,这个判断好像不对,不管 ping 通,还是 ping 不通,返回的都是 0,所以都会有写入,而且写入的是一样的。

as900
你 os 是 windows?
是的話把 -c 拿掉看看 -c 要管理者權限

我發現 用 subprocess 跟 os.system return 都是 command 執行後的 code 0 是成功

所以可能要改成

# 這邊你可能要看輸出長怎樣跟編碼是什麼
PingReturn = subprocess.check_output(ip)
if '目的地主機無法連線' not in PingReturn.decode('big5'):
    # connect...
    
as900 iT邦新手 1 級 ‧ 2020-06-06 05:53:38 檢舉

这是我现在的代码:

import subprocess

ping = open('p.txt','a')

for i in range(240, 241):
    for j in range(1, 50):
        ip = "10.10.%s.%s" % (i, j)
        PingReturn = subprocess.Popen('ping -c 1 -n 1 ' + ip,stdout=subprocess.PIPE)
        PingReturn.wait()
        if PingReturn.poll() == 0:
            ping.write(str(ip + "\n"))

我使用下面的代码测试:

import subprocess

ip = "10.10.10.35"

PingReturn = subprocess.Popen('ping -c 1 -n 1 ' + ip,stdout=subprocess.PIPE)
PingReturn.wait()

print(PingReturn.poll())

不管给定的 IP 能不能 ping 通,PingReturn.poll() 的值,都是 0,这样就造成了,不管 IP 能不能 ping 通,都会被写入文件。

把上面的 code

import subprocess

ip = "10.10.10.35"

PingReturn = subprocess.check_output('ping -c 1 -n 1 ' + ip)
print(PingReturn)

改成這樣,看他ping 不通 return 回來是什麼
再用

if '{這邊填 ping 不通會有的字樣}' not in PingReturn:
    # in here is connect
    ping.write(str(ip + "\n"))
as900 iT邦新手 1 級 ‧ 2020-06-06 20:06:17 檢舉

用上面的代码,返回的内容就是 ping 的回显,完正的回显。

那 ping 不成功是不是會有 ping 不成功的字樣 用這個字樣去判斷

as900 iT邦新手 1 級 ‧ 2020-06-08 08:53:03 檢舉

没有 ping 不成功的字样,我对比了 ping 和 ping 不通,发现 ping 不通结尾是 “Minimum = 0ms, Maximum = 0ms, Average = 0ms” ,所有结果都是 0,所以我这样写了 if 语句:

if “Minimum = 0ms, Maximum = 0ms, Average = 0ms” in PingReturn:
    pass
else:
    print(ip)

但结果报错了:

TypeError: a bytes-like object is required, not 'str'

幫他做編碼

PingReturn.decode('{big5 or utf-8}')
as900 iT邦新手 1 級 ‧ 2020-06-08 13:47:49 檢舉

可以了,非常感谢!

import subprocess

ip = "10.10.10.49"

PingReturn = subprocess.check_output('ping -c 1 -n 1 ' + ip)

PingFailed = "Minimum = 0ms, Maximum = 0ms, Average = 0ms"

if PingFailed in PingReturn.decode("UTF-8"):
    print(ip)
else:
    print("error")

/images/emoticon/emoticon42.gif

as900 iT邦新手 1 級 ‧ 2020-06-08 16:51:14 檢舉

你好,又遇到了一个新的问题,当那个 IP 返回是 time out 时,会报错,提示“subprocess.CalledProcessError: Command 'ping -c 1 -n 1 10.10.10.75' returned non-zero exit status 1.”
这个怎么处理?我目前是用 try 处理的,还有其他处理方法吗?

用 try except 也行

r = subprocess.call('ping -c 1 -n 1 ' + ip)
if r == 0 :
    PingReturn = subprocess.check_output('ping -c 1 -n 1 ' + ip)

    PingFailed = "Minimum = 0ms, Maximum = 0ms, Average = 0ms"

    if PingFailed in PingReturn.decode("UTF-8"):
        print(ip)
    else:
        print("error")
else:
    print("error")
as900 iT邦新手 1 級 ‧ 2020-06-09 08:43:26 檢舉

使用这个,还是会有这样类似的报错,而且多次运行后,报错的 IP 地址也不同。

那還是用 try except 好了

try:
except subprocess.CalledProcessError as e:
    # record error ip

等全部 ping 完再重 ping error 的 ip

as900 iT邦新手 1 級 ‧ 2020-06-10 15:48:33 檢舉

可以正常运行,非常感谢

我要發表回答

立即登入回答