web-dev-qa-db-ja.com

Pythonの複数のpingスクリプト

pythonとネットワークに関する学習しやすいドキュメントを見つけることができません。この例では、いくつかのリモートマシンにpingを実行できる簡単なスクリプトを作成しようとしています。

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

そのような単純なスクリプトはマシンに正常にpingを送信しますが、スクリプトから「アクティブ」「応答なし」を返すようにしたいので、タイムモジュールも検索する必要があると思います。time.sleep(5)そして、その後にbreakステートメントがあります。 forの中にwhileループがあるべきだと思います。 100%確信はありません。完全に間違った方向に進んでいる可能性があります。誰かが私を助けてくれたり、すばらしいドキュメントの方向性を教えてくれたりすることができれば。

18
kuiper

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!"
26
Roland Smith

このスクリプト:

_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
_

limboを_subprocess.PIPE_で置き換え、Popenオブジェクトでcommunicate()を使用すると、出力をキャプチャできます。

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

これにより、コマンドの戻り値を取得し、テキストをキャプチャできます。 manual に続いて、これは柔軟性が必要な場合にサブプロセスを操作するための好ましい方法です:

このモジュールの基礎となるプロセスの作成と管理は、Popenクラスによって処理されます。開発者が利便性関数でカバーされないあまり一般的でないケースを処理できるように、それは多くの柔軟性を提供します。

10
hochl

本当にありがとうございました。 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を変更するだけです。

5
Robert N

私は初心者で、複数のホストに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")
4
Sumit

複数のホストを一度に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

ルートとして実行できる場合は、 pure Python ping script または 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"))
3
jfs
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")
1
Razi Ahmed

Pythonには、実際に「ネットワークで使用可能なホストのイテレータを返す」という非常に甘い method があります。 (strictを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)は自動化にとって重要な場合があり、1秒のタイムアウト(-t1)でも.0/24を超えると永遠にかかることがあります。

[〜#〜] edit [〜#〜]:したがって、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--かなりクールです!

1
andylukem