python 收集ip信息

熟悉python 对字符文本的分割和获取信息的方法。

文章结构:

(1) 对ifconfig 命令输出的信息,进行分析

(2) 用两种方法对输出实现分析,获取系统的ip信息,包括:网卡名,ip地址和MAC地址

1. ifconfig 命令输出信息分析

先上图:

如上图,我们需要统计的三个信息是网卡名,eth0,eth0:1,eth1 这三块网卡,至于‘lo‘ 网卡就不用统计了。每张网卡,还需要记录MAC 地址和ip 地址。

看到上面的信息,它是以每张网卡的信息作为一段的,而且都是以网卡顶行开始,换段落时都是以空行换行。根据这些特点,就可以将每一块网卡的整段信息作为一个分析的对象。通常都可以将所有字符分割,作为一个列表的元素保存。

还有另一种比较普遍的办法,因为并不是每个系统的ifconfig 命令的输出都会以空行作为段落分割,所以上面提到的方法就不太合适了。将所有ifconfig 的输出逐行进行判断,然后将每个网卡的信息组成一个元素,最终也是以列表的形式保存三张网卡的信息。

2. 下面给出两种实现方法:

方法(1):

#!/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)

验证结果:

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

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

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

方法(2):

#!/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)

输出结果:

在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() 函数做最后的处理。

时间: 2024-10-12 03:25:20

python 收集ip信息的相关文章

使用python收集IP信息

[[email protected] systeminformation]# vim devname_1.py  #!/usr/bin/env python from subprocess import Popen,PIPE def getIfconfig():     tuple_addr = ('lo','vir','vnet','em3','em4') #有些网卡以这些字符开头,排除在外     p = Popen(['ifconfig'], stdout=PIPE)     data =

Python:收集IP信息

下面通过两种方法实现收集IP信息 1.通过 ifconfig 命令输出IP信息,并以"\n\n"切片分成不同的网卡块 2.通过 ifconfig 命令输出IP信息,并以第一个字符在顶格的方式切片分成不同的网卡块 # vim ip1.py #!/usr/bin/env python from subprocess import Popen, PIPE def getIfconfig(): p = Popen(['ifconfig'], stdout=PIPE) data = p.stdo

python学习:使用正则收集ip信息

使用正则表达式收集主机信息 #!/usr/bin/env python from subprocess import Popen, PIPE import re def getIfconfig(): p = Popen(['ifconfig'], stdout=PIPE) data = p.stdout.read().split('\n\n') return [i for i in data if i and not i.startswith('lo')] def parseIfconfig(d

Python收集主机信息

Python收集linux主机信息,需要安装dmidecode命令,yum -y install dmidecode #!/usr/bin/env python # coding=utf-8   from subprocess import Popen, PIPE   #获取ifconfig命令信息 def getIfconfig():     p = Popen(['ifconfig'], stdout=PIPE)     data = p.stdout.read().decode()    

收集主机信息

收集主机信息,包括: 1.主机名:hostname 2.IP地址:ip 3.操作系统版本:osver 4.服务器厂商:vendor 5.服务器型号:product 6.服务器序列号:sn 7.cpu型号:cpu_module 8.cpu核心数量:cpu_num 9.内存大小 收集IP信息 [[email protected] systeminformation]# vim sysinformation.py from subprocess import Popen,PIPE def getIfc

使用 python 收集获取 Linux 系统主机信息

使用 python 代码收集主机的系统信息,主要:主机名称.IP.系统版本.服务器厂商.型号.序列号.CPU信息.内存等系统信息. #!/usr/bin/env python #encoding: utf-8 ''' 收集主机的信息: 主机名称.IP.系统版本.服务器厂商.型号.序列号.CPU信息.内存信息 ''' from subprocess import Popen, PIPE import os,sys ''' 获取 ifconfig 命令的输出 ''' def getIfconfig(

使用Python收集获取Linux系统主机信息

爬虫代理IP由芝麻HTTP服务供应商提供 使用 python 代码收集主机的系统信息,主要:主机名称.IP.系统版本.服务器厂商.型号.序列号.CPU信息.内存等系统信息. #!/usr/bin/env python #encoding: utf-8 ''' 收集主机的信息: 主机名称.IP.系统版本.服务器厂商.型号.序列号.CPU信息.内存信息 ''' from subprocess import Popen, PIPE import os,sys ''' 获取 ifconfig 命令的输出

python学习之最简单的获取本机ip信息的小程序

文章是从我的个人博客粘贴过来的,大家可以直接访问我的个人博客哦 http://www.iwangzheng.com 获取本机ip信息的命令ifconfig总是在用,这次拿到pyhton代码里,感觉python好麻烦啊,每次都要import. 可以在程序里直接read出来,也可以先在命令行执行ifconfig > xx.txt,这样可以直接访问倒入后的文本信息. 这个小程序有个问题,与朋友讨论了还没解决彻底,如果用findall是可以匹配所有的,但是怎么解决用match只匹配一次的问题呢,当然如果

201310-安卓收集用户信息样本分析-willj[4st TeAm]

报告更新日期: 2013-10-14 样本发现日期: 2013-01-22 样本类型: Android 样本文件大小/被感染文件变化长度: 1.15 MB (1,209,713 字节) 样本文件MD5 校验值: 001769fd059d829a568b4196f07c6df9 壳信息:无 可能受到威胁的系统: Android OS 已知检测名称: Win32.Backdoor.Ginmaster.x 作者:willJ 简介 该样本为伪装成Android游戏盗取用户信息,病毒推广APP的木马. 详