bestjoe 发表于 2018-8-11 11:34:53

python 收集ip信息

  熟悉python 对字符文本的分割和获取信息的方法。
  文章结构:
  (1) 对ifconfig 命令输出的信息,进行分析
  (2) 用两种方法对输出实现分析,获取系统的ip信息,包括:网卡名,ip地址和MAC地址
  1. ifconfig 命令输出信息分析
  先上图:

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

  
from subprocessimportPopen, PIPE
  

  
defgetData():
  
    p = Popen(['ifconfig'], stdout=PIPE, stderr=PIPE)
  
    data = p.stdout.read().split("\n\n")
  
    return
  

  
def parseData(data):
  
    dic = {}
  
    for linesin data :
  
      devname =lines.split('\n').split()
  
      ipaddr =lines.split('\n').split().split(':')
  
      macaddr =lines.split('\n').split()[-1]
  
      dic =
  
    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/envpython  

  
from   subprocessimport   Popen, PIPE
  

  
defgetIP():
  
    p = Popen(['ifconfig'], stdout=PIPE, stderr=PIPE)
  
    stdout,stderr=p.communicate()
  
    return
  

  
def genIP(data):
  
    lines = []
  
    new_line = ''
  
    for line in data:
  
      ifline.strip():
  
            lines.append(new_line)
  
            new_line = line + '\n'
  
      else:
  
            new_line += line + '\n'
  
    lines.append(new_line)
  
    lines =
  
    return lines
  

  

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

  
if__name__ == "__main__":
  
    data =getIP()
  
    data_list = genIP(data)
  
    print parseData(data_list)
  输出结果:

  在getIP() 函数中,简单地将ifconfig 命令输出的字符串以'\n'分割了,并将每一行保存到列表里。
  然后,在genIP(data) 函数中对getIP() 返回的列表进行处理,主要是要返回一个,以每张网卡的整段
  信息作为元素的列表。同样在判断字符串是否顶格的时候,用line.strip() 的布尔值来判断,如果经过strip() 方法处理后,字符仍然为真,则该行字符串是顶格的,就是一张网卡的信息段落的开始。如果是新的一张网卡的信息,那么就将之前保存在new_line 里的字符串,当作一个元素添加到lines 列表保存。如果line.strip() 是False,则这一行是空格缩进的,它是网卡段落内的信息,应该添加到new_line 里保存,等读到下一张网卡名的行出现时,再将new_line 添加到lines 里。
  最后,由于genIP() 函数已经返回了一个列表,列表里的每个元素就是一张网卡的所有信息,所以,就可以像方法(1)中的parseData() 去处理了,最终返回了一个字典。结果和方法(1) 的一样。
  总结:
  两种实现方法,相比较,方法(1) 更简洁,容易明白。但是方法(2) 的实现更加普遍,它是对字符串逐行遍历,根据网卡的信息的结构,最后还是将一张网卡信息整合到一个字符串new_line 里,到这里方法(2) 和方法(1) 就开始相同了,都可以用parseData() 函数做最后的处理。
页: [1]
查看完整版本: python 收集ip信息