我想捕獲一個scapy函數(traceroute)到python腳本中的字符串的輸出。我知道我需要管這個函數到stdout(就像你用subproces.call()做的那樣,但是不確定如何用scapy來做到這一點,是否有人能夠提供任何幫助?我是Python新手。 。在Python中捕獲Scapy函數輸出
#!/usr/bin/env python
from scapy.all import traceroute
traceroute('www.google.com')
我想捕獲一個scapy函數(traceroute)到python腳本中的字符串的輸出。我知道我需要管這個函數到stdout(就像你用subproces.call()做的那樣,但是不確定如何用scapy來做到這一點,是否有人能夠提供任何幫助?我是Python新手。 。在Python中捕獲Scapy函數輸出
#!/usr/bin/env python
from scapy.all import traceroute
traceroute('www.google.com')
你可以做到這一點的一個類似文件的對象(例如StringIO
)修補sys.stdout
:
#!/usr/bin/env python
from scapy.all import traceroute
from StringIO import StringIO
import sys
stdout = StringIO()
sys.stdout = stdout
result, unanswered = traceroute('www.google.com')
sys.stdout = sys.__stdout__
print 'Captured stdout:', stdout.getvalue()
無論如何,請注意,您所需要的信息可能已經在對象由返回方法:
print result.summary()
print unanswered.summary()
注意:您可以找到有關答案的標準輸出跳線這一question更多信息。
您也可以撥打路由跟蹤這樣的:
trace, _ = traceroute("www.example.org", verbose=0)
# trace.get_trace() returns a rather impractical format, so we need
# to convert it. First, we only want the first trace available
hosts = trace.get_trace().values()[0]
# hosts will be in the format { 1: ("1.2.3.4", False),
# 2: ("10.20.30.40", False) ... }
# We convert it to ["1.2.3.4", "10.20.30.40", ...] here:
ips = [hosts[i][0] for i in range(1, len(hosts) + 1)]
之後,ips
變量將包含有軌跡的一部分,主機列表。
哦,這很好,看起來像是一個完美的解決方案,你能解釋我的第二行嗎?我不確定你從哪裏得到 – user1112539
的班級'a',當然這應該是'trace'。編輯它並添加一些評論 –