ここを参考にしたのだが,うまく動かなかった→[Python] Pingコマンド実行 : Edo::World::Blog
上のサイトのスクリプトでは,pingコマンド自体のエラーを見ているため,存在しないFQDNなどを指定した場合にはpingがIPアドレスを引けないことからエラーを返す.
つまりDNSが設定されていないホスト名の検出になっている.
一方で,pingコマンドを使用する通常のケースでは,たとえばあるセグメント配下の全IPアドレスにpingを飛ばすなどの作業を行なう.
この場合,例えばDestination Host Unreachableを返す場合であっても,pingコマンド自体は正常に完了するため,コマンドのエラーではDestination Host Unreachableを検出できない.
ということで,ちょっとだけ手を入れて検出できるようにした.
#!/usr/bin/python # vim: fileencoding=utf-8 import subprocess class Ping(object): def __init__(self, hosts): loss_pat='0 received' msg_pat='icmp_seq=1 ' for host in hosts: ping = subprocess.Popen( ["ping", "-c", "1", host], stdout = subprocess.PIPE, stderr = subprocess.PIPE ) out, error = ping.communicate() msg = '' for line in out.splitlines(): if line.find(msg_pat)>-1: msg = line.split(msg_pat)[1] # エラーメッセージの抽出 if line.find(loss_pat)>-1: # パケット未到着ログの抽出 flag=False break else: flag=True # breakしなかった場合 = パケットは到着している if flag: print('[OK]: ' + 'ServerName->' + host) else: print('[NG]: ' + 'ServerName->' + host + ', Msg->\'' + msg + '\'') if __name__ == '__main__': hosts=map(lambda x:'xxx.xxx.xxx.'+str(x),range(1,255)) Ping(hosts)