SNMP学习笔记之SNMP的安装及Python的调用

0x00 概述

本文是介绍SNMP在Windows和Linux(Ubuntu)下的安装,以及通过Python调用其接口的文章。

0x01 开发环境

  • Python 3.5.1
  • Windows 10 64位,Ubuntu 16.04 64位(虚拟机)

0x02 SNMP

SNMP(简单网络管理协议),由一组网络管理的标准组成,包含一个应用层协议(application layer protocol)、数据库模型(database schema)和一组资源对象。该协议能够支持网络管理系统,用以监测连接到网络上的设备是否有任何引起管理上关注的情况。

0x03 MIB

MIB(Management Information Base),管理信息库,由网络管理协议访问的管理对象数据库,它包括SNMP可以通过网络设备的SNMP管理代理进行设置的变量。

0x04 Windows下安装SNMP

下载链接:https://sourceforge.net/projects/net-snmp/

之后直接安装即可,默认安装路径是C:\usr。

安装完后在系统变量下添加:C:\usr\bin,打开cmd输入snmpget测试,没有报错则说明安装成功。

0x05 Ubuntu下安装SNMP和配置

下载

$ sudo apt-get install snmpd snmp snmp-mibs-downloader

查看SNMP服务状态

$ sudo service snmpd status

简单测试SNMP服务是否正常

$ snmpwalk -v 2c -c public localhost 1.3.6.1.2.1.1.1 SNMPv2-MIB::sysDescr.0 = STRING: Linux ubuntu 4.4.0-62-generic #83-Ubuntu SMP Wed Jan 18 14:10:15 UTC 2017 x86_64

默认情况下,snmp服务只是对本地开启,是无法通过远程获取该主机的snmp信息的。所以要设置允许远程主机访问

$ sudo netstat -antup | grep 161
udp        0      0 127.0.0.1:161           0.0.0.0:*                         10698/snmpd     

可以看到,161端口只对本机开放(161端口号是snmp服务的端口号),我们需要修改一下,让snmp服务对外开放。 修改/etc/snmp/snmpd.conf配置文件,大概在15行,将下面一行注释掉:agentAddress udp:127.0.0.1:161 重新启动snmp服务,再通过命令观察:

$ sudo /etc/init.d/snmpd restart $ sudo netstat -antup | grep 161 udp 0 0 0.0.0.0:161 0.0.0.0:* 10763/snmpd

可以看到SNMP服务已经对外开放了,这样之后,我们就能在远程主机进行测试。

由于SNMP默认只能查看两个设备节点,要想查看所有节点还需要进行一些配置。打开/etc/snmp/snmpd.conf

sudo vim /etc/snmp/snmpd.conf # 在大约45行处添加下面一行
view systemonly included .1 
view systemonly included .1.3.6.1.2.1.1 
view systemonly included .1.3.6.1.2.1.25.1

最后配置一下mibs,否则可能会报Unknown Object Identifier错误。打开/etc/snmp/snmp.conf,注释掉mibs:就可以了

sudo vim /etc/snmp/snmp.conf 
# As the snmp packages come without MIB files due to license reasons, loading 
# of MIBs is disabled by default. If you added the MIBs you can reenable 
# loading them by commenting out the following line. #mibs :

0x06 Windows下调用SNMP查看其他主机信息

由于博主使用的是Ubuntu虚拟机,其IP是192.168.132.130。下面是cmd下通过SNMP查看该主机的信息。

打开cmd,输入

snmpwalk -v 2c -c public 192.168.132.130 1.3.6.1.2.1.1.1

返回

SNMPv2-MIB::sysDescr.0 = STRING: Linux ubuntu 4.4.0-62-generic #83-Ubuntu SMP Wed Jan 18 14:10:15 UTC 2017 x86_64

成功。

0x07 Python代码调用示例

Python代码调用系统的snmpwalk指令来查询设备信息。

# coding=utf-8 

"""
filename:snmp_test.py

说明:
使用系统的 snmpwalk 来查询设备信息,需要先安装 snmp
代码 Windows 和 Linux 通用

Windows cmd 调用示例:snmpwalk -v 2c -c public 127.0.0.1 1.3.6.1.2.1.1.1

Windows cmd 下查看某主机(192.168.132.130)信息示例:
snmpwalk -v 2c -c public 192.168.132.130 1.3.6.1.2.1.1.1
""" 

import re 
import os 
import time 
import platform 

if 'Windows' == platform.system(): 
    hosts = ['192.168.132.130'] 
else: # 在虚拟机运行时则查看本地 
    hosts = ['127.0.0.1'] 
    
def snmpWalk(host, oid): 
    result = os.popen('snmpwalk -v 2c -c public ' + host + ' ' + oid).read().split('\n')[:-1] 
    return result 
    
# ------------------------------------------------------------ 
# 获取系统信息 
# ------------------------------------------------------------ 
def getSystem(host): 
    system = ':'.join(snmpWalk(host, 'system')[0].split(':')[3:]).strip() 
    return system 
    
# ------------------------------------------------------------ 
# 获取负载信息 
# ------------------------------------------------------------ 
def getLoad(host, loid): 
"""系统负载""" 
    load_oids = '1.3.6.1.4.1.2021.10.1.3.' + str(loid) 
    return snmpWalk(host, load_oids)[0].split(':')[3] 
    
def getLoads(host): 
    load1 = getLoad(host, 1) 
    load10 = getLoad(host, 2) 
    load15 = getLoad(host, 3) 
    return load1, load10, load15 
    

# ------------------------------------------------------------ 
# 获取网卡流量 
# ------------------------------------------------------------ 
def getNetworkDevices(host): 
"""获取网络设备信息""" 
    device_mib = snmpWalk(host, 'RFC1213-MIB::ifDescr') 
    device_list = [] for item in device_mib: device_list.append(item.split(':')[3].strip()) 
    return device_list 
    
def getNetworkData(host, oid): 
"""获取网络流量""" 
    data_mib = snmpWalk(host, oid) 
    data = [] for item in data_mib: byte = float(item.split(':')[3].strip()) 
    data.append(str(round(byte / 1024, 2)) + ' KB') 
    return data 
    
def getNetworkInfo(host): 
    device_list = getNetworkDevices(host) 
    # 流入流量 
    inside = getNetworkData(host, 'IF-MIB::ifInOctets') 
    # 流出流量 
    outside = getNetworkData(host, 'IF-MIB::ifOutOctets') 
    return device_list, inside, outside 
    
# ------------------------------------------------------------ 
# 内存使用率 
# ------------------------------------------------------------ 
def getSwapTotal(host): 
    swap_total = snmpWalk(host, 'UCD-SNMP-MIB::memTotalSwap.0')[0].split(' ')[3] 
    return swap_total 
    
def getSwapUsed(host): 
    swap_avail = snmpWalk(host, 'UCD-SNMP-MIB::memAvailSwap.0')[0].split(' ')[3] 
    swap_total = getSwapTotal(host) 
    swap_used = str(round(((float(swap_total) - float(swap_avail)) / float(swap_total)) * 100, 2)) + '%' 
    return swap_used 
    
def getMemTotal(host): 
    mem_total = snmpWalk(host, 'UCD-SNMP-MIB::memTotalReal.0')[0].split(' ')[3] 
    return mem_total 
    
def getMemUsed(host): 
    mem_total = getMemTotal(host) 
    mem_avail = snmpWalk(host, 'UCD-SNMP-MIB::memAvailReal.0')[0].split(' ')[3] 
    mem_used = str(round(((float(mem_total) - float(mem_avail)) / float(mem_total)) * 100, 2)) + '%' 
    return mem_used 
    
def getMemInfo(host): mem_used = getMemUsed(host) 
    swap_used = getSwapUsed(host) return mem_used, swap_used 
    
# ------------------------------------------------------------ 
def main(): 
    for host in hosts: 
        print('=' * 10 + host + '=' * 10) 
        start = time.time() 
        print("系统信息") 
        system = getSystem(host) 
        print(system) 
        print("系统负载") 
        load1, load10, load15 = getLoads(host) 
        print('load(5min): %s ,load(10min): %s ,load(15min): %s' % (load1, load10, load15)) 
        print("网卡流量") 
        device_list, inside, outside = getNetworkInfo(host) 
        for i, item in enumerate(device_list): 
            print('%s : RX: %-15s   TX: %s ' % (device_list[i], inside[i], outside[i])) 
        mem_used, swap_used = getMemInfo(host) print("内存使用率") 
        print('Mem_Used = %-15s   
        Swap_Used = %-15s' % (mem_used, swap_used)) 
        end = time.time() 
        print('run time:', round(end - start, 2), 's') 
        
if __name__ == '__main__': 
    main()

Windows下打印:

==========192.168.132.130==========
系统信息
Linux ubuntu 4.4.0-62-generic #83-Ubuntu SMP Wed Jan 18 14:10:15 UTC 2017 x86_64
系统负载
load(5min): 0.03 ,load(10min): 0.03 ,load(15min): 0.00
网卡流量
lo : RX: 1861.91 KB TX: 1861.91 KB
Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) : RX: 5733.84 KB TX: 336.49 KB
内存使用率
Mem_Used = 93.82% Swap_Used = 0.07%
run time: 2.89 s

Ubuntu下打印:

==========127.0.0.1==========
系统信息
Linux ubuntu 4.4.0-62-generic #83-Ubuntu SMP Wed Jan 18 14:10:15 UTC 2017 x86_64
系统负载
load(5min): 0.02 ,load(10min): 0.02 ,load(15min): 0.00
网卡流量
lo : RX: 1861.91 KB TX: 1861.91 KB
Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) : RX: 5738.8 KB TX: 338.76 KB
内存使用率
Mem_Used = 94.14% Swap_Used = 0.07%
run time: 0.26 s

参考

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android学习之路

Android的广播

271120
来自专栏草根专栏

使用Identity Server 4建立Authorization Server (1)

本文内容基本完全来自于Identity Server 4官方文档: https://identityserver4.readthedocs.io/ 官方文档很详...

557100
来自专栏NetCore

Identity Service - 解析微软微服务架构eShopOnContainers(二)

接上一篇,众所周知一个网站的用户登录是非常重要,一站式的登录(SSO)也成了大家讨论的热点。微软在这个Demo中,把登录单独拉了出来,形成了一个Service,...

29150
来自专栏bboysoul

如何黑入安卓手机(ezsploit)

安装很简单clone git clone https://github.com/rand0m1ze/ezsploit.git cd ezsploit ch...

20420
来自专栏Seebug漏洞平台

使用 XML 内部实体绕过 Chrome 和 IE 的 XSS 过滤器

来源:BypassingXSSFiltersusingXMLInternalEntities 原作者:DavidLitchfield (david@davidl...

433100
来自专栏沃趣科技

ASM 翻译系列第三十六弹:ACFS磁盘组的重平衡操作

原作者:Bane Radulovic 译者: 魏兴华 审核: 魏兴华 DBGeeK社区联合出品 原文链接:http://asmsupportguy....

390110
来自专栏互联网杂技

SpringBoot ( 十二 ) :SpringBoot 如何测试打包部署

有很多网友会时不时的问我,spring boot项目如何测试,如何部署,在生产中有什么好的部署方案吗?这篇文章就来介绍一下spring boot 如何开发、调试...

11220
来自专栏AILearning

Apache Zeppelin 中 JDBC通用 解释器

概述 JDBC解释器允许您无缝地创建到任何数据源的JDBC连接。 在运行每个语句后,将立即应用插入,更新和升级。 到目前为止,已经通过以下测试: ...

38670
来自专栏大魏分享(微信公众号:david-share)

用Ansible自动供应vmware虚拟机--构建数据中心一体化运维平台第二篇

1.1 简述 一直以来,打开邮箱被ticket糊一脸的事情时有发生。我一直在想,能不能以一种简单的方案(不花老板的钱)来供应(provisioning)虚拟机呢...

76120
来自专栏乐沙弥的世界

配置共享服务器模式

两者完成相同的任务,即处理所有指定的SQL操作。假定从客户端提交一个任意查询(DQL)到数据库服务器不论是专用模式还是共享

30730

扫码关注云+社区

领取腾讯云代金券