!!!Macアドレス宛にpingを送信するpythonスクリプト !動作フロー +arpを送信し、周囲の端末の情報(ホストネーム、ipアドレス、macアドレス)を取得 +取得した結果をリスト化 +macアドレスを入力 +入力されたmacアドレスを持つ端末を先に生成したリストから検索し、その端末のipアドレスを取得 +取得したipアドレスにpingを送信 !ソースコード *Ubuntu10.04でのみ動作を確認。 *macは恐らく問題ないが、windowsではarpの出力結果の文字列の構成が異なるため、処理を分ける必要がある。 #!usr/bin/python from subprocess import Popen,PIPE NEW_LINE = "\n" class ArpData: def __init__(self,name,ip,mac): self.name = name self.ip = ip self.mac = mac class PingMac: #constructor def __init__(self): self.listData = [] self.sendArp() self.analyzeArpData() self.printArpData() #send arp def sendArp(self): proc = Popen(["arp", "-a"], stdout=PIPE, stderr=PIPE) self.result = proc.communicate()[0] #analyze arp data ( put hostname,ipaddress,macaddress ) def analyzeArpData(self): table = self.result.split(NEW_LINE) index = 0 while index < len(table): line = table[index].split(" ") #analyze #[type] #hostname (Ipaddress) at Macaddress on interface ifscope [ethernet] #[ex(mac)] #? (172.30.10.85) at 0:1f:3b:71:cc:97 [ethernet] on en1 #[ex(ubuntu)] #ywlan010085.sras.sic.shibaura-it.ac.jp (172.30.10.85) at 0:1f:3b:71:cc:97 on en1 ifscope [ethernet] if(len(line)>3): name = line[0] ip = line[1].replace("(","").replace(")","") mac = line[3] #add self.listData.append(ArpData(name,ip,mac)) index= index + 1 #display arp data table def printArpData(self): index = 0 while index < len(self.listData): print "[node] : "+ str(index) print "name : "+self.listData[index].name print "ip address : "+self.listData[index].ip print "mac address :"+self.listData[index].mac index= index + 1 def searchMacIpFromMac(self,macaddr): result ="" index = 0 while index < len(self.listData): if self.listData[index].mac == macaddr: result = self.listData[index].ip break index = index + 1 return result #ping to ipaddress def pingToIpAddress(self,ipaddr): proc = Popen(["ping", ipaddr,"-c 1"], stdout=PIPE, stderr=PIPE) print proc.communicate()[0] #ping to mac address def pingToMacAddress(self,macaddr): #get ip ipaddr = self.searchMacIpFromMac(macaddr) print "send to "+ ipaddr #send ping to ip self.pingToIpAddress(ipaddr) #main if __name__ == '__main__': print "-------------------------------------------------------------" print "[get arp table]" ping = PingMac() print "-------------------------------------------------------------" print "[send ping to mac address]" print "input destination mac : ", mac = raw_input() ping.pingToMacAddress(mac) print "-------------------------------------------------------------" !todo *細かいオプションの設定 *arp情報のキャッシュによる高速手軽化 *gui化(pygameかgtkか)