我有一段 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)
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))
不好意思,是我写错了,是 range
as900
你可以用 subprocess 我修改答案了
自动生成 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...
这是我现在的代码:
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"))
用上面的代码,返回的内容就是 ping 的回显,完正的回显。
那 ping 不成功是不是會有 ping 不成功的字樣 用這個字樣去判斷
没有 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}')
可以了,非常感谢!
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")
你好,又遇到了一个新的问题,当那个 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")