2013-10-23 43 views
0

我需要從我的python腳本發送一個數據包。 我有一個目標IP地址。 我需要:
- 這通常是默認的路由出口接口名(我需要它嗅探響應)
- IP地址的接口(我需要使用它在我的應用有效載荷)

python:如何檢查出口接口

如何我從python做到這一點?

感謝,

+0

我知道scapy的conf.route - 但我需要很多代碼才能找出使用哪一個。我希望重用已經存在的代碼(可能在scapy中)。 – user2913139

+0

LOL出口 - 是那些非母語英語人士將永遠不會谷歌:) – Bohdan

回答

1

Pynetinfo似乎是你最好的選擇。這是我機器上的一個小樣本。你的結果會有所不同,但你當然會有一個默認網關。

>>> import netinfo 
>>> netinfo.get_routes() 
({'dest': '0.0.0.0', 'netmask': '0.0.0.0', 'gateway': '192.168.0.1', 'dev': 'wlan1'}, 
{'dest': '169.254.0.0', 'netmask': '255.255.0.0', 'gateway': '0.0.0.0', 'dev': 'wlan1'}, 
{'dest': '192.168.0.0', 'netmask': '255.255.255.0', 'gateway': '0.0.0.0', 'dev': 'wlan1'}) 
>>> default_gateway = 
...[route for route in netinfo.get_routes() if route['dest'] == '0.0.0.0'][0] 
>>> default_gateway['gateway'] 
'192.168.0.1' 
>>> default_gateway['dev'] 
'wlan1' 

至於獲得該接口的IP地址...

>>> import netifaces 
>>> netifaces.ifaddresses(default_gateway['dev'])[netifaces.AF_INET] 
[{'broadcast': '192.168.0.255', 'netmask': '255.255.255.0', 'addr': '192.168.0.9'}] 

爲了得到一個IP數據包將與給定目標使用,我的Linux系統上的接口。我不確定另一種方式。

>>> dst = "127.0.0.1" 
>>> p = subprocess.Popen(["ip", "route", "get", dst], stdout=subprocess.PIPE) 
>>> p.stdout.read() 
'local 127.0.0.1 dev lo src 127.0.0.1 \n cache <local> \n' 
+0

謝謝,看起來不錯,但我有很多路由表中的條目(因爲許多接口和動態路由)。默認路線不會總是被選中。你知道任何方法來輕鬆地執行路由查找選擇正確的路由條目/接口嗎? (我知道目標IP,需要找到最好/最具體的匹配項) – user2913139

+0

增加了兩段代碼。讓我知道你的想法。 – RyPeck

+0

RyPeck - 你是我的男人:)謝謝 - 它解決了我所有的問題:) – user2913139