1

我正在编写一个脚本来为主机名列表执行跟踪路由。我要做的是逐行从文本文件中读取主机名,使用子进程为每个主机执行跟踪并将结果写入另一个文件。这是我的代码

    # 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 结果。

我不确定我的脚本有什么问题,请帮助我修复它。非常感谢。

史蒂文

4

2 回答 2

3

host = host.strip()拨打电话前先试一下;tracert 似乎在换行符上窒息。

于 2012-08-08T10:55:40.363 回答
1

你最好只使用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

于 2013-08-09T21:14:36.187 回答