2010-07-27 100 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