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)