Python中的多个ping脚本

我无法find任何很好的学习python和networking文档。 在这种情况下,我只是想制作一个简单的脚本,我可以ping一些远程机器。

for ping in range(1,10): ip="127.0.0."+str(ping) os.system("ping -c 3 %s" % ip) 

这样一个简单的脚本就可以很好地ping通机器,但是我想让脚本返回“active”“no response”。这让我想我也得查找时间模块,我想time.sleep(5)之后,会有一个断言。 这让我觉得应该有一个while循环里面。 我不是100%肯定的,我可能完全错误的方向:/如果任何人能够帮助或指向一些文件的方向,那将是伟大的。

尝试subprocess.call 。 它保存了使用的程序的返回值。

根据我的ping手册,成功返回0,ping发送2,但没有收到回复,其他值表示错误。

 # typo error in import import subprocess for ping in range(1,10): address = "127.0.0." + str(ping) res = subprocess.call(['ping', '-c', '3', address]) if res == 0: print "ping to", address, "OK" elif res == 2: print "no response from", address else: print "ping to", address, "failed!" 

这个脚本:

 import subprocess import os with open(os.devnull, "wb") as limbo: for n in xrange(1, 10): ip="192.168.0.{0}".format(n) result=subprocess.Popen(["ping", "-c", "1", "-n", "-W", "2", ip], stdout=limbo, stderr=limbo).wait() if result: print ip, "inactive" else: print ip, "active" 

会产生这样的输出:

 192.168.0.1 active 192.168.0.2 active 192.168.0.3 inactive 192.168.0.4 inactive 192.168.0.5 inactive 192.168.0.6 inactive 192.168.0.7 active 192.168.0.8 inactive 192.168.0.9 inactive 

如果用limboreplacelimbo ,并在Popen对象上使用communicate() ,则可以捕获输出:

 p=Popen( ... ) output=p.communicate() result=p.wait() 

这样你可以得到命令的返回值,并可以捕获文本。 按照手册,如果您需要灵活性,这是操作子过程的首选方法:

Popen类处理本模块中的基础过程创build和pipe理。 它提供了很大的灵活性,以便开发人员能够处理不属于便利function的不常见的情况。

非常感谢你。 我已经修改它与Windows一起工作。 我也放了一个很低的超时时间,那些没有回报的IP将不会坐等5秒钟。 这是来自hochl源代码。

 import subprocess import os with open(os.devnull, "wb") as limbo: for n in xrange(200, 240): ip="10.2.7.{0}".format(n) result=subprocess.Popen(["ping", "-n", "1", "-w", "200", ip], stdout=limbo, stderr=limbo).wait() if result: print ip, "inactive" else: print ip, "active" 

只要改变你的计划的ip =和主机的xrange。

我是一个初学者,写了一个脚本来ping多个主机。要ping多个主机,你可以使用ipaddress模块​​。

 import ipaddress from subprocess import Popen, PIPE net4 = ipaddress.ip_network('192.168.2.0/24') for x in net4.hosts(): x = str(x) hostup = Popen(["ping", "-c1", x], stdout=PIPE) output = hostup.communicate()[0] val1 = hostup.returncode if val1 == 0: print(x, "is pinging") else: print(x, "is not responding") 

要一次ping多个主机,你可以使用subprocess.Popen()

 #!/usr/bin/env python3 import os import time from subprocess import Popen, DEVNULL p = {} # ip -> process for n in range(1, 100): # start ping processes ip = "127.0.0.%d" % n p[ip] = Popen(['ping', '-n', '-w5', '-c3', ip], stdout=DEVNULL) #NOTE: you could set stderr=subprocess.STDOUT to ignore stderr also while p: for ip, proc in p.items(): if proc.poll() is not None: # ping finished del p[ip] # remove from the process list if proc.returncode == 0: print('%s active' % ip) elif proc.returncode == 1: print('%s no response' % ip) else: print('%s error' % ip) break 

如果你可以作为root运行,你可以使用纯Python的脚本或scapy

 from scapy.all import sr, ICMP, IP, L3RawSocket, conf conf.L3socket = L3RawSocket # for loopback interface ans, unans = sr(IP(dst="127.0.0.1-99")/ICMP(), verbose=0) # make requests ans.summary(lambda (s,r): r.sprintf("%IP.src% is alive")) 
 import subprocess import os ''' servers.txt contains ip address in following format 192.168.1.1 192.168.1.2 ''' with open('servers.txt', 'r') as f: for ip in f: result=subprocess.Popen(["ping", "-c", "1", "-n", "-W", "2", ip],stdout=f, stderr=f).wait() if result: print(ip, "inactive") else: print(ip, "active") 

Python实际上有一个非常可爱的方法 ,它将'返回一个遍历networking中可用主机的迭代器'。 (严格设置为false遍历所有IP)

例如:

 import subprocess import ipaddress subnet = ipaddress.ip_network('192.168.1.0/24', strict=False) for i in subnet.hosts(): i = str(i) subprocess.call(["ping", "-c1", "-n", "-i0.1", "-W1", i]) 

等待间隔(-i0.1)对于自动化来说可能是重要的,甚至一秒钟超时(-t1)可以永远超过0.0 / 24

编辑 :所以,为了跟踪ICMP(ping)请求,我们可以做这样的事情:

 #!/usr/bin/env python import subprocess import ipaddress alive = [] subnet = ipaddress.ip_network('192.168.1.0/23', strict=False) for i in subnet.hosts(): i = str(i) retval = subprocess.call(["ping", "-c1", "-n", "-i0.1", "-W1", i]) if retval == 0: alive.append(i) for ip in alive: print(ip + " is alive") 

这将返回像这样的东西:

 192.168.0.1 is alive 192.168.0.2 is alive 192.168.1.1 is alive 192.168.1.246 is alive 

即对整个/ 23的ICMP进行响应的所有IP–非常酷!

 import subprocess,os,threading,time from queue import Queue lock=threading.Lock() _start=time.time() def check(n): with open(os.devnull, "wb") as limbo: ip="192.168.21.{0}".format(n) result=subprocess.Popen(["ping", "-n", "1", "-w", "300", ip],stdout=limbo, stderr=limbo).wait() with lock: if not result: print (ip, "active") else: pass def threader(): while True: worker=q.get() check(worker) q.task_done() q=Queue() for x in range(255): t=threading.Thread(target=threader) t.daemon=True t.start() for worker in range(1,255): q.put(worker) q.join() print("Process completed in: ",time.time()-_start) 

我认为这会更好。