设为首页 收藏本站
查看: 770|回复: 0

[经验分享] python 收集ip信息

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-10-25 10:33:08 | 显示全部楼层 |阅读模式
熟悉python 对字符文本的分割和获取信息的方法。

文章结构:
(1) 对ifconfig 命令输出的信息,进行分析
(2) 用两种方法对输出实现分析,获取系统的ip信息,包括:网卡名,ip地址和MAC地址


1. ifconfig 命令输出信息分析
先上图:
wKioL1gOBceAJ5P-AADYHlDS9MM795.jpg
如上图,我们需要统计的三个信息是网卡名,eth0,eth0:1,eth1 这三块网卡,至于'lo' 网卡就不用统计了。每张网卡,还需要记录MAC 地址和ip 地址。
看到上面的信息,它是以每张网卡的信息作为一段的,而且都是以网卡顶行开始,换段落时都是以空行换行。根据这些特点,就可以将每一块网卡的整段信息作为一个分析的对象。通常都可以将所有字符分割,作为一个列表的元素保存。
还有另一种比较普遍的办法,因为并不是每个系统的ifconfig 命令的输出都会以空行作为段落分割,所以上面提到的方法就不太合适了。将所有ifconfig 的输出逐行进行判断,然后将每个网卡的信息组成一个元素,最终也是以列表的形式保存三张网卡的信息。


2. 下面给出两种实现方法:
方法(1):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/env  python

from subprocess  import  Popen, PIPE

def  getData():
    p = Popen(['ifconfig'], stdout=PIPE, stderr=PIPE)
    data = p.stdout.read().split("\n\n")
    return [i for i in data if i and  not  i.startswith('lo')]

def parseData(data):
    dic = {}
    for lines  in data :
        devname =  lines.split('\n')[0].split()[0]
        ipaddr =  lines.split('\n')[1].split()[1].split(':')[1]
        macaddr =  lines.split('\n')[0].split()[-1]
        dic[devname] = [ipaddr,  macaddr]
    return dic


if  __name__ == "__main__":
    data = getData()
    print parseData(data)



验证结果:
wKiom1gOEAnDUDX-AAAjp7U_7-4540.jpg
在getData() 函数里,用"\n\n" 将p.stdout.read() 读出的字符串进行了分割,基本就是一个列表里保存着各张网卡的信息,然后用列生成式将空的元素和'lo'网卡的元素去掉。

在parseData(data) 函数里,for 循环每次都获取的就是一张网卡的整段信息,然后再把整段的信息用'\n' 分割一下,就可以直接判断了。

最后,将结果保存到字典里,用网卡名作为字典的key ,ip地址和MAC地址组成的列表作为value.



方法(2):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/usr/bin/env  python

from   subprocess  import   Popen, PIPE

def  getIP():
    p = Popen(['ifconfig'], stdout=PIPE, stderr=PIPE)
    stdout,  stderr  =  p.communicate()
    return  [i  for  i  in stdout.split('\n') if i]

def genIP(data):
    lines = []
    new_line = ''
    for line in data:
        if  line[0].strip():
            lines.append(new_line)
            new_line = line + '\n'
        else:
            new_line += line + '\n'
    lines.append(new_line)
    lines = [i for i in lines  if i and not i.starswith('lo')]
    return lines


def parseData(data):
    dic = {}
    for lines in data:
        devname = lines.split('\n')[0].split()[0]
        macaddr = lines.split('\n')[0].split()[-1]
        ipaddr  = lines.split('\n')[1].split()[1].split(':')[1]
        dic[devname] =  [ipaddr,  macaddr]
    return dic   

if  __name__ == "__main__":
    data =  getIP()   
    data_list = genIP(data)
    print parseData(data_list)



输出结果:
wKiom1gOGNvAKrhYAAAqvQCZVfs076.jpg

在getIP() 函数中,简单地将ifconfig 命令输出的字符串以'\n'分割了,并将每一行保存到列表里。

然后,在genIP(data) 函数中对getIP() 返回的列表进行处理,主要是要返回一个,以每张网卡的整段
信息作为元素的列表。同样在判断字符串是否顶格的时候,用line[0].strip() 的布尔值来判断,如果经过strip() 方法处理后,字符仍然为真,则该行字符串是顶格的,就是一张网卡的信息段落的开始。如果是新的一张网卡的信息,那么就将之前保存在new_line 里的字符串,当作一个元素添加到lines 列表保存。如果line[0].strip() 是False,则这一行是空格缩进的,它是网卡段落内的信息,应该添加到new_line 里保存,等读到下一张网卡名的行出现时,再将new_line 添加到lines 里。

最后,由于genIP() 函数已经返回了一个列表,列表里的每个元素就是一张网卡的所有信息,所以,就可以像方法(1)中的parseData() 去处理了,最终返回了一个字典。结果和方法(1) 的一样。

总结:
两种实现方法,相比较,方法(1) 更简洁,容易明白。但是方法(2) 的实现更加普遍,它是对字符串逐行遍历,根据网卡的信息的结构,最后还是将一张网卡信息整合到一个字符串new_line 里,到这里方法(2) 和方法(1) 就开始相同了,都可以用parseData() 函数做最后的处理。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-290954-1-1.html 上篇帖子: python3中实现客户端与服务端交互发送文件 下篇帖子: python redis使用 python 信息
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表