2010-07-27 101 views
1

我想寫一個用於網絡安全IP掃描的腳本,這種工具可能需要僞裝主機的NIC狀態才能進行測試,例如, 設置網卡的IP地址, 設置DNS地址, ,同時設置主機名, MAC地址和 啓用/禁用NIC適配器。如何在python中設置「ip地址」,「DNS」,「主機名」,「MAC地址」?

我用Google搜索,發現大多數soultion使用現有的工具「POPEN」調用系統如

>>> import os 
>>> p=os.popen("/sbin/ifconfig eth0") 
>>> t=p.read() 
>>> p.close() 

獲得來自系統的回報。還有一些模塊可以讀取NIC的狀態,例如netifaces,但似乎它們都是「只讀」,但不能直接提供。

由於我發現沒有模塊可以直接設置NIC狀態,因此我在這裏請求幫助以查看是否有人可以舉手或展示更好的方式。

任何提示將被appricated。 謝謝!

RGS KC

回答

0

我這樣做之前,有沒有明確的Python OS界面,這樣低級別的操作系統特定的東西。你只需要寫一個(操作系統特定的)包裝到UNIX(/ Windows/Mac)命令。這並不難,只是單調乏味。

os.popen*() is very deprecated (since 2.4), use subprocess module

interface to subprocess.Popen() is admittedly irritating,你幾乎可以肯定最終會爲自己的理智編寫一個包裝,以提供理智的默認arg值和整理代碼。顯然要密切關注命令的退出狀態,路徑前綴等。不知道你對可移植性的關心程度。

0
#!/usr/bin/env python 
# -*- coding:utf-8 -*- 
# 
# Copyright 2014 by mimvp.com 


def get_valid_ip(cls, ip_str): 
    ip_str_new = '' 
    ip_re = re.compile(r'\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b') 
    ipList = ip_re.findall(ip_str) 
    if len(ipList) >= 1: 
     ip_str_new = ipList[0] 
     ip_str_new = ip_str_new.lstrip("0")  # '05.9.87.163' ==> '5.9.87.163' 
    return ip_str_new 


if __name__ == '__main__': 
    result = os.popen("/sbin/ifconfig en0 | grep broadcast") 
    ip_inet = result.read() 
    for ip_str in ip_inet.split(" "): 
     if self.get_valid_ip(ip_str) : 
      print ip_str 
+2

雖然此代碼段可以解決的問題,[包括一個解釋](// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)確實有助於提高質量您的帖子。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。也請儘量不要用解釋性註釋來擠佔代碼,這會降低代碼和解釋的可讀性! – Machavity 2017-08-11 13:11:18