traceroute несколько хостов в python

Я пишу сценарий, чтобы сделать traceroute для списка имен хостов. я пытаюсь прочитать имя хоста из текстового файла, построчно, выполнить tracert для каждого хоста с помощью подпроцесса и записать результат в другой файл. вот мой код

    # import subprocess
    import subprocess
    # Prepare host and results file
    Open_host = open('c:/OSN/host.txt','r')
    Write_results = open('c:/OSN/TracerouteResults.txt','a')
    host = Open_host.readline()
    # while loop: excuse trace route for each host
    while host:
       print host
    # execute Traceroute process and pipe the result to a string 
       Traceroute = subprocess.Popen(["tracert", '-w', '100', host],  
     stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
       while True:    
           hop = Traceroute.stdout.readline()
           if not hop: break
           print '-->',hop
           Write_results.write( hop )
       Traceroute.wait()  
    # Reading a new host   
       host = Open_host.readline()
    # close files
    Open_host.close()
    Write_results.close() 

Моя проблема в том, что этот скрипт работает только для файла хоста с 1 именем хоста (или 1 строкой). когда файл хоста содержит несколько строк, например: hostname1.com hostname2.com hostname3.com Это даст мне это уведомление для первой двухстрочной строки

"Не удалось разрешить имя целевой системы hostname1.com"

"Не удалось разрешить имя целевой системы hostname2.com"

И только дать tracert результат для последней строки.

Я не уверен, что не так с моим сценарием, пожалуйста, помогите мне исправить это. Большое спасибо.

Стивен

2 ответа

Решение

Пытаться host = host.strip() перед звонком; tracert, кажется, задыхается от новых строк.

Тебе лучше использовать scapy.

 #! /usr/bin/env python

# Set log level to benefit from Scapy warnings
import logging
logging.getLogger("scapy").setLevel(1)

from scapy.all import *

if __name__ == "__main__":
    hosts   = raw_input('Hostnames you would like to traceroute sepearated by a comma: ')
    ttl     = raw_input("Time To Live: ")
    if not ttl: ttl = 20
    traceroute([x.strip() for x in hosts.split(',')],maxttl=ttl)

Ссылка: https://gist.github.com/mwatts272/6192900

Другие вопросы по тегам