【Python】ping試験の自動化&結果をファイルに保存

Pythonでping試験を一括で実行し、結果をファイルに保存する方法についてソースコード付きで解説します。

ping試験を一括で実行&結果保存

Pythonで、CSVに記録されたIPアドレスのリストを読み込み、ping試験を行って結果をファイルに出力します。

関連記事
1 【ping疎通試験】ネットワーク障害・エラーの原因を調べる
2 【Python】ネットワークプログラミング入門
実行環境
OS Windows10 64bit
Python 3.6
# -*- coding: utf-8 -*-
import subprocess
import csv
import codecs
import datetime

class Ping(object):
    def test(self, hosts):
        result = []
        for host in hosts:
            # pingコマンド
            ping = subprocess.Popen(["ping", host],
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE
            )

            # ping試験
            out, error = ping.communicate()
            print("■" + host)
            print("----------------------")
            print(out.decode('Shift-JIS'))
            print("----------------------")
            result.append(out.decode('Shift-JIS'))

        hosts = [hosts]
        hosts.append(result)
        hosts = list(map(list, zip(*hosts)))  
        return hosts

    def load_csv(self, filepath):
        f = codecs.open(filepath, "r")
        csv_data = csv.reader(f)
        data = [ e[0] for e in csv_data]
        f.close()
        return data
        
    def save_csv(self, filepath, data):
        with open(filepath, 'w', newline='') as f:    #newline=''を追加した
            writer = csv.writer(f)
            writer.writerows(data)   
            

ping = Ping()

# ipアドレスのリストをロード
hosts = ping.load_csv("iplist.csv")   

# ping試験
data = ping.test(hosts)

# 結果を保存
date = datetime.datetime.now()
ping.save_csv("iptest-{0:%Y%m%d_%H%M%S}.txt".format(date), data)    

iplist.csv

■IPアドレスのリスト

127.0.0.1,loopback
192.168.100.100,my host
192.168.100.101,same hub host
192.168.100.1,default gateway
157.112.145.21,destination host
algorithm.joho.info,destination domain

iptest-20190119_213758.csv

■実行結果

127.0.0.1,"
127.0.0.1 に ping を送信しています 32 バイトのデータ:
127.0.0.1 からの応答: バイト数 =32 時間 <1ms TTL=128
127.0.0.1 からの応答: バイト数 =32 時間 <1ms TTL=128
127.0.0.1 からの応答: バイト数 =32 時間 <1ms TTL=128
127.0.0.1 からの応答: バイト数 =32 時間 <1ms TTL=128

127.0.0.1 の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 0ms、最大 = 0ms、平均 = 0ms
"

:

ネットワーク障害が発生した際に、自身のホストに近い順にネットワーク機器のIPアドレスを指定してping試験を実施していくのが原因特定の効果的です。
近いところから順にping試験することで「どこまで問題なく通信できるのか、どこから通信エラーが発生するのか」がわかります。
つまり、問題なく通信できた所と、通信エラーが出たところの間に原因があると推測できます。
そのため、IPアドレスのリストは上から近い順に記載されています。

関連記事
1 【Python】ネットワークプログラミング入門
2 【Python入門】使い方とサンプル集
関連記事