Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >SNMP学习笔记之SNMP TRAP简介、流程以及使用Python实现接受Trap信息

SNMP学习笔记之SNMP TRAP简介、流程以及使用Python实现接受Trap信息

作者头像
Jetpropelledsnake21
发布于 2018-12-04 08:27:44
发布于 2018-12-04 08:27:44
10.4K00
代码可运行
举报
文章被收录于专栏:JetpropelledSnakeJetpropelledSnake
运行总次数:0
代码可运行

0x00 SNMP TRAP简介

SNMP(Simple Network Management Protocol) trap是一种很有用,但是也容易让人难以理解的协议。

虽然名字叫做简单网络管理协议,但实际上并不是字面上的意思,尤其是看到.1.3.6.1.2.1.1.1.0这样一串串诡异的数字时候,就会有点让人崩溃。

不管怎么说,现在所有的网络设备的都需要支持SNMP。而且现在还有很多的开源的网络管理系统,所以就有利于我们来学习和理解SNMP。

SNMP trap是由被管理的设备主动的向管理服务器发送设备的异常情况,可以看成是管理服务器被动的去接收的过程。

所以会有很多的工具会把snmptrap集成到自己的工具中,对网络设备进行监控。

把SNMP trap集成的到Nagios当中的,大体的工作流程是:

1. 由snmptrapd来接收网络设备发出的trap 2. snmptrapd调用snmptt(snmp trap translator 翻译器) 3. snmptt中定义了每一种trap的级别,以及什么样的trap才有必要写入到syslog中 4. SEC(simple event correlator是一个事件收集器)从syslog中读取每一个事件,并把调用用户的脚本snmptraphandling.py 来处理。 5. snmptraphandling.py 会调用根据主机名和trap的级别来调用相当的Nagios命令行。 这个过程包含了很多层,所以感觉很复杂,还是深入进去看看snmptrapd是怎么工作的。从而尽可能简化snmptrap的使用方法。

snmptrapd来自开源软件Net-SNMP. Net-SNMP会有很多的用途,当然使用trap也是一个很有用的用途。当snmptrapd接收到trap以后,可以调用用户自定义的脚本或者命令行来处理trap。如果想使用这个功能就需要在snmptrapd的配置文件中设置traphandle。 snmptrapd接收到的trap信息格式是:

1. 数据包来源的主机名字。 2. 数据包来源的ip地址。 3. 数据包中的内容。 traphandle的工作就是读取这些内容并进行处理就可以了。

Trap信息例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cisco2611.lon.altinity
192.168.10.20
RFC1213-MIB::sysUpTime.0 0:18:14:45.66
SNMPv2-MIB::snmpTrapOID.0 IF-MIB::linkDown
RFC1213-MIB::ifIndex.2 2
RFC1213-MIB::ifDescr.2 "Serial0/0"
RFC1213-MIB::ifType.2 ppp
OLD-CISCO-INTERFACES-MIB::locIfReason.2 "administratively down"
SNMP-COMMUNITY-MIB::snmpTrapAddress.0 192.168.10.20
SNMP-COMMUNITY-MIB::snmpTrapCommunity.0 "public"
SNMPv2-MIB::snmpTrapEnterprise.0 CISCO-SMI::ciscoProducts.186

因为snmptt对trap信息中的OID进行了翻译,如果不进行翻译的话,那么trap信息的样子应该是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cisco2611.lon.altinity
192.168.10.20
.1.3.6.1.2.1.1.3.0 0:18:13:59.95
.1.3.6.1.6.3.1.1.4.1.0 .1.3.6.1.6.3.1.1.5.3
.1.3.6.1.2.1.2.2.1.1.2 2
.1.3.6.1.2.1.2.2.1.2.2 "Serial0/0"
.1.3.6.1.2.1.2.2.1.3.2 ppp
.1.3.6.1.4.1.9.2.2.1.1.20.2 "administratively down"
.1.3.6.1.6.3.18.1.3.0 192.168.10.20
.1.3.6.1.6.3.18.1.4.0 "public"
.1.3.6.1.6.3.1.1.4.3.0 .1.3.6.1.4.1.9.1.186

这就说明了,snmptt拥有自己的配置文件,文件中包含了OID和对应的属性名,并且是使用OID来进行索引的。如果snmptt在配置文件中无法找到对应的OID的话,那么snmptt也就无法对信息进行翻译,我们看到的信息内容也就是原始的格式了。 snmptt使用的配置文件叫做MIBs(Management Information Base管理信息基础),在MIBs以OID为索引的key,可以快速查找到对应的文字形式和警告的级别。每一个MIB都有自己固定的定义格式,其中会包含一个宏(用来说明要显示信息的内容)。

可是为什么要有MIBs的存在呢?直接由snmptrapd来完成OID到信息的翻译不可以么? 1. MIBs是可以由用户自己来定义,使用的。因为各厂商对trap信息定义的内容肯定是不同的,所以想要snmp有一定的扩展性,那么就必须要支持用户自定义MIBs文件。这也就是MIBs存在的原因。 2. 如果由snmptrapd自己来完成翻译也是可以的,因为如果每次都去通过检索OID对应的消息的话,那对性能的影响是非常的大的,因此snmptrapd就需要读入MIBs。问题也就出现了,如果更新MIBs话,就要把snmptrapd重新启动,必定会影响到trap消息的接收。所以把snmptt作为一个独立的deamon存在是很正确的选择。 最后要做的事情就是添加traphandle了,handle会影响到snmptrap的接收性能,所以处理的速度要快,因为handle有可能1秒中会有数百次的调用。  这样以来上面的处理流程就可以进行简化的: 1. snmptrapd接收到trap的信息 2. snmptrapd调用handle(如果不是调用现有的命令的话,在handle中就可以完成所有的处理了,就没有下面的处理了。又节省了一步,哈哈) 3. handle中再调用Nagios的命令行就可以了 这样一看流程就简单许多了,以后再使用snmptrap的时候也可以参考这个处理的流程

0x01 SNMP TRAP流程

SNMP Trap流程可参考这篇文章

0x02 SNMP Trap接受用Python实现

下载 安装pysnmp-4.2.5.tar.gz (md5)

https://pypi.python.org/pypi/pysnmp/

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from pysnmp.carrier.asynsock.dispatch import AsynsockDispatcher
from pysnmp.carrier.asynsock.dgram import udp, udp6
from pyasn1.codec.ber import decoder
from pysnmp.proto import api
from test_case_common import *
 
def cbFun(transportDispatcher, transportDomain, transportAddress, wholeMsg):
    while wholeMsg:
        msgVer = int(api.decodeMessageVersion(wholeMsg))
        if msgVer in api.protoModules:
            pMod = api.protoModules[msgVer]
        else:
            print('Unsupported SNMP version %s' % msgVer)
            return
        reqMsg, wholeMsg = decoder.decode(
            wholeMsg, asn1Spec=pMod.Message(),
            )
        print('Notification message from %s:%s: ' % (
            transportDomain, transportAddress
            )
        )
        reqPDU = pMod.apiMessage.getPDU(reqMsg)
        if reqPDU.isSameTypeWith(pMod.TrapPDU()):
            if msgVer == api.protoVersion1:
                print('Enterprise: %s' % (
                    pMod.apiTrapPDU.getEnterprise(reqPDU).prettyPrint()
                    )
                )
                print('Agent Address: %s' % (
                    pMod.apiTrapPDU.getAgentAddr(reqPDU).prettyPrint()
                    )
                )
                print('Generic Trap: %s' % (
                    pMod.apiTrapPDU.getGenericTrap(reqPDU).prettyPrint()
                    )
                )
                print('Specific Trap: %s' % (
                    pMod.apiTrapPDU.getSpecificTrap(reqPDU).prettyPrint()
                    )
                )
                print('Uptime: %s' % (
                    pMod.apiTrapPDU.getTimeStamp(reqPDU).prettyPrint()
                    )
                )
                varBinds = pMod.apiTrapPDU.getVarBindList(reqPDU)
            else:
                varBinds = pMod.apiPDU.getVarBindList(reqPDU)
            print('Var-binds:')
            for oid, val in varBinds:
                a = oid.prettyPrint().strip()
                b = val.prettyPrint().strip().split('\n')
                print a
                for line in b:
                    item = line.strip()
                    if item.startswith('string-value'):
                        print 'string-value='+item.replace('string-value=0x','').decode('hex')
                    else:
                        print item
    return wholeMsg
 
if __name__ == '__main__':
    transportDispatcher = AsynsockDispatcher()
 
    transportDispatcher.registerRecvCbFun(cbFun)
 
    # UDP/IPv4
    transportDispatcher.registerTransport(
        udp.domainName, udp.UdpSocketTransport().openServerMode(('0.0.0.0', 162))
    )
 
    # UDP/IPv6
    transportDispatcher.registerTransport(
        udp6.domainName, udp6.Udp6SocketTransport().openServerMode(('::1', 162))
    )
 
    transportDispatcher.jobStarted(1)
 
    try:
        # Dispatcher will never finish as job#1 never reaches zero
        transportDispatcher.runDispatcher()
    except:
        transportDispatcher.closeDispatcher()
        raise
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-10-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
第三方平台告警接入、翻译、关联恢复
本文档描述了如何通过SNMPTT,将中兴云桌面以及中兴云桌面存储SnmpTrap告警接入Zabbix,并对产生的告警汉化翻译,通过Zabbix标签功能实现自动关联恢复告警。
Zabbix
2021/09/29
1.8K0
snmp的trap_web scraping
SNMP(Simple Network Management Protocol) trap是一种很有用,但是也容易让人难以理解的协议。虽然名字叫做简单网络管理协议,但实际上并不是字面上的意思,尤其是看到.1.3.6.1.2.1.1.1.0这样一串串诡异的数字时候,就会有点让人崩溃。
全栈程序员站长
2022/09/24
4080
linux抓取snmp trap告警命令,linux snmptrap的发送与接收
由于需要管理服务器的一些参数,比如CPU使用率,IOwait之类的指标,管理方通过snmpwalk进行五分钟一次对受管服务器的轮询。
全栈程序员站长
2022/09/24
3.7K0
SNMP学习笔记之SNMP介绍,OID及MIB库
1.1.    SNMP概览  SNMP的基本知识介绍 简单网络管理协议(SNMP-Simple Network Management Protocol)是一个与网络设备交互的简单方法。该规范是由IETF在1990年五月发布的RFC 1157中定义的。SNMP通常被认为相当难懂,并且过于复杂,其可用的API似乎在本来非常简单的东西外面封装了大量的东西。现在关于SNMP的书籍又往往只是把它更加复杂化了,而没有解释清楚。 SNMP对于任何程序设计人员来说是特别易于理解的。总体的简化能够很好地把这个系统简化。一个网络设备以守护进程的方式运行SNMP代理,该守护进程能够响应来自网络的各种请求信息。该SNMP代理提供大量的对象标识符(OID-Object Identifiers)。一个OID是一个唯一的键值对。该代理存放这些值并让它们可用。一个SNMP管理器(客户)可以向代理查询键值对中的特定信息。从程序员的角度看,这和导入大量的全局变量没有多少区别。SNMP的OID是可读或可写的。尽管向一个SNMP设备写入信息的情况非常少,但它是各种管理应用程序用来控制设备的方法(例如针对交换机的可管理GUI)。SNMP中有一个基本的认证框架,能够让管理员发送公共名来对OID读取或写入的认证。绝大多数的设备使用不安全的公共名 "public" 。 SNMP协议通过UDP端口161和162进行通信的。 注意,我还没有提到MIB!MIB的重要性被大大地夸大了。刚开始时,MIB显得非常复杂,但是它们其实非常简单。OID是数字的和全局的键值对。一个OID看起来和一个IPv6的地址很象,并且不同的厂商有不同的前缀等信息。OID都非常长,使得人们难以记住,或者对他非常感冒。因此,人们就设计了一种将数字OID翻译为人们可读的格式。这种翻译映射被保存在一个被称为 “管理信息基础"(Management Infomation Base) 或MIB的、可传递的无格式文本文件里。使用SNMP或者向SNMP设备查询,你不需要使用MIB,但是,如果没有MIB,你就得猜测你正在查看的数据是什么。某些情况下,不使用MIB也非常简单,例如查看主机名、磁盘使用率数字,或者端口状态信息。其他情况下,就非常困难了,这个时候使用MIB就非常有帮助。对于准备编写的应用程序来说,为了让用户避免妥当安装MIB带来的麻烦,而严格使用数字OID很常见。安装一个MIB的动作,只是将他放置到你的SNMP客户端应用软件能够搜索到并进行上述翻译映射工作的某个位置而已。 SNMP可以按照两种方式来使用:轮询和陷阱。轮询就是说你编写一个应用程序能够设置一个发送给一个SNMP代理查看某些值的SNMP GET请求。这种方法非常有用,因为如果该设备响应了请求,你就得到了你需要的信息,如果该设备没有响应请求,你就能够知道存在某些问题。轮询是网络监控的一种主动形式。另一方面,SNMP陷阱能够被用来进行被动形式的网络监控。SNMP陷阱是通过配置SNMP设备的代理,让他在某些动作发生时联系另一个SNMP代理来实现的。 备,可以配置为在某些事件发生时发送SNMP陷阱。例如,你可以配置Cisco的IOS在某个独立事件(例如链路断开)发生时,或者在任何定义的陷阱事件发生时,发送SNMP陷阱。(IOS:snmp服务器开启了链路断开的snmp陷阱)。当陷阱事件发生时,设备中的snmp代理会发送该陷阱到一个预先配置好的通常成为陷阱主机的目标上。陷阱主机会运行有自己的SNMP代理,该代理能够接受并处理传入的陷阱。这些陷阱的处理由陷阱处理器来完成。陷阱处理器可以用任何语言编写,并且可以通过STDIN(标准输入)传入的来自发送陷阱的信息。该处理器之后可以根据陷阱进行任何想作的事情,例如发送邮件或者你想要的任何事情。 SNMP被广泛应用在NMS网络管理系统中(Network Management System)。知名的NMS包括BMC的Patrol、CA的Unicenter、Sun Mangegement控制台、IBM的Tivoli Netview、以及全球著名的HP Openview。NMS的目标是提供一个监控和管理所有开启SNMP功能的设备的单一入口。通过配置你的设备代理来接受写访问,你可以从一个应用程序中处理你的网络环境。如果你的整个环境围拢NMS解决方案架构你的环境,你就能无限制地控制、查看你的整个网络。尽管Net-SNMP提供了可用来构建你自己的NMS网管系统的所有工具,我们不会再进一步讨论关于NMS的话题。不过请记住,如果你认为你的SNMP设备厂商没有提供SNMP代理方面的详细信息,很可能是因为他们希望你购买他们的NMS网络管理系统,或者购买能够在另一个NMS平台上使用的插件。 1.2. SNMP的三大版本  SNMP的常用版本有三个:SNMPv1、SNMPv2、SNMPv3 SNMPv1是为基于公共管理的初始标准。SNMPv
Jetpropelledsnake21
2018/11/22
5.8K0
snmp trap日志「建议收藏」
SNMP是网络管理领域中事实上的工业标准,并被广泛支持和应用,大多数网络管理系统和平台都是基于SNMP的。SNMP采用UDP协议在管理端和agent之间传输信息, SNMP采用UDP 161端口接收和发送请求,162端口接收trap。
全栈程序员站长
2022/09/24
4.7K0
snmp trap日志「建议收藏」
SNMP Trap调试记录[通俗易懂]
SNMP Inform Requests功能允许路由器向SNMP管理器发送通知请求。
全栈程序员站长
2022/09/24
3.8K0
SNMP Trap调试记录[通俗易懂]
【老张监控技术】Zabbix监控设备SNMP Trap消息
Cacti集成版本Cactifans制作者,2013年开始使用Zabbix,2014-2016年负责Zabbix的二次开发及公司监控产品架构设计,目前任烽火科技应用软件部运维总监,从事PaaS平台的开发和运维工作,精通Zabbix/Cacti/Prometheus/Open-falcon等开源监控软件及解决方案,开源软件爱好者。
Zabbix
2021/02/03
6.8K1
SNMP学习笔记之SNMP 原理与实战详解
原文地址:http://freeloda.blog.51cto.com/2033581/1306743
Jetpropelledsnake21
2018/11/22
12.2K0
SNMP TRAP_Bootstrapping
四、TRAP MIB编写及编译 NET-SNMP中TRAP的实现是基于一个由NOTIFICATION-TYPE 定义的MIB对象实现的。该对象在TrapPDU中头部位置,后续紧跟着该Trap携带的其他节点的信息,这些节点信息是Trap中有意义的信息,体现本次“告警”的真正内容,这些节点一般为普通的MIB对象。其中OBJECTS 子句中可以包含多个对象。
全栈程序员站长
2022/09/24
2.2K0
Python 封装SNMP调用接口
PySNMP 是一个纯粹用Python实现的SNMP,用PySNMP的最抽象的API为One-line Applications,其中有两类API:同步的和非同步的,都在模块pysnmp.entity.rfc3413.oneliner.cmdgen 中实现,如下是Get方式与Walk方式的基本实现.
微软技术分享
2022/12/28
2.3K0
Python 封装SNMP调用接口
SNMP学习笔记之SNMP的安装及Python的调用
本文是介绍SNMP在Windows和Linux(Ubuntu)下的安装,以及通过Python调用其接口的文章。
Jetpropelledsnake21
2018/12/04
5.9K1
SNMP学习笔记之Python的netsnmp和pysnmp的性能对比
用python获取snmp信息有多个现成的库可以使用,其中比较常用的是netsnmp和pysnmp两个库。网上有较多的关于两个库的例子。
Jetpropelledsnake21
2018/12/04
3.9K0
SNMP学习笔记之Python的netsnmp和pysnmp的性能对比
SNMP学习笔记之iReasoning MIB Browser
iReasoning MIB浏览器是一个强大和易于使用的工具由iReasoning SNMP API提供支持。 MIB浏览器是工程师管理启用SNMP的网络设备和应用程序不可或缺的工具。 它允许用户加载标准的,专有的MIB,甚至一些错误的MIB。 它还允许它们发出SNMP请求以检索代理的数据,或对代理进行更改。 内置陷阱接收器可以根据其规则引擎接收和处理SNMP陷阱。
Jetpropelledsnake21
2018/12/04
7.1K0
SNMP学习笔记之iReasoning MIB Browser
SNMP学习笔记之SNMP4J介绍(Java)
  SNMP4J是一个用Java来实现SNMP(简单网络管理协议)协议的开源项目.它支持以命令行的形式进行管理与响应。SNMP4J是纯面向对象设计与SNMP++(用C++实现SNMPv1/v2c/v3)相类似。
Jetpropelledsnake21
2018/11/22
5.5K0
SNMP学习笔记之SNMP报文协议详解
简单网络管理协议(SNMP)是TCP/IP协议簇的一个应用层协议。在1988年被制定,并被Internet体系结构委员会(IAB)采纳作为一个短期的网络管理解决方案;由于SNMP的简单性,在Internet时代得到了蓬勃的发展,1992年发布了SNMPv2版本,以增强SNMPv1的安全性和功能。现在,已经有了SNMPv3版本。 一套完整的SNMP系统主要包括管理信息库(MIB)、管理信息结构(SMI)及SNMP报文协议。
Jetpropelledsnake21
2018/11/22
6.3K0
snmp协议的trap操作采用基于_maven批量导入jar包
SNMP是英文”Simple Network Management Protocol”的缩写,中文意思是”简单网络管理协议”。SNMP是一种简单网络管理协议,它属于TCP/IP五层协议中的应用层协议,用于网络管理的协议。SNMP主要用于网络设备的管理。由于SNMP协议简单可靠 ,受到了众多厂商的欢迎,成为了目前最为广泛的网管协议。
全栈程序员站长
2022/09/23
1.6K0
snmp协议的trap操作采用基于_maven批量导入jar包
SNMP学习笔记之Linux服务器SNMP常用OID
System Group sysDescr 1.3.6.1.2.1.1.1 sysObjectID 1.3.6.1.2.1.1.2 sysUpTime 1.3.6.1.2.1.1.3 sysContact 1.3.6.1.2.1.1.4 sysName 1.3.6.1.2.1.1.5 sysLocation 1.3.6.1.2.1.1.6 sysServices 1.3.6.1.2.1.1.7 Interfaces Group ifNumber 1.3.6.1.2.1.2.1 ifTable 1.3.6.1.2.1.2.2 ifEntry 1.3.6.1.2.1.2.2.1 ifIndex 1.3.6.1.2.1.2.2.1.1 ifDescr 1.3.6.1.2.1.2.2.1.2 ifType 1.3.6.1.2.1.2.2.1.3 ifMtu 1.3.6.1.2.1.2.2.1.4 ifSpeed 1.3.6.1.2.1.2.2.1.5 ifPhysAddress 1.3.6.1.2.1.2.2.1.6 ifAdminStatus 1.3.6.1.2.1.2.2.1.7 ifOperStatus 1.3.6.1.2.1.2.2.1.8 ifLastChange 1.3.6.1.2.1.2.2.1.9 ifInOctets 1.3.6.1.2.1.2.2.1.10 ifInUcastPkts 1.3.6.1.2.1.2.2.1.11 ifInNUcastPkts 1.3.6.1.2.1.2.2.1.12 ifInDiscards 1.3.6.1.2.1.2.2.1.13 ifInErrors 1.3.6.1.2.1.2.2.1.14 ifInUnknownProtos 1.3.6.1.2.1.2.2.1.15 ifOutOctets 1.3.6.1.2.1.2.2.1.16 ifOutUcastPkts 1.3.6.1.2.1.2.2.1.17 ifOutNUcastPkts 1.3.6.1.2.1.2.2.1.18 ifOutDiscards 1.3.6.1.2.1.2.2.1.19 ifOutErrors 1.3.6.1.2.1.2.2.1.20 ifOutQLen 1.3.6.1.2.1.2.2.1.21 ifSpecific 1.3.6.1.2.1.2.2.1.22 IP Group ipForwarding 1.3.6.1.2.1.4.1 ipDefaultTTL 1.3.6.1.2.1.4.2 ipInReceives 1.3.6.1.2.1.4.3 ipInHdrErrors 1.3.6.1.2.1.4.4 ipInAddrErrors 1.3.6.1.2.1.4.5 ipForwDatagrams 1.3.6.1.2.1.4.6 ipInUnknownProtos 1.3.6.1.2.1.4.7 ipInDiscards 1.3.6.1.2.1.4.8 ipInDelivers 1.3.6.1.2.1.4.9 ipOutRequests 1.3.6.1.2.1.4.10 ipOutDiscards 1.3.6.1.2.1.4.11 ipOutNoRoutes 1.3.6.1.2.1.4.12 ipReasmTimeout 1.3.6.1.2.1.4.13 ipReasmReqds 1.3.6.1.2.1.4.14 ipReasmOKs 1.3.6.1.2.1.4.15 ipReasmFails 1.3.6.1.2.1.4.16 ipFragsOKs 1.3.6.1.2.1.4.17 ipFragsFails 1.3.6.1.2.1.4.18 ipFragCreates 1.3.6.1.2.1.4.19 ipAddrTable 1.3.6.1.2.1.4.20 ipAddrEntry 1.3.6.1.2.1.4.20.1 ipAdEntAddr 1.3.6.1.2.1.4.20.1.1 ipAdEntIfIndex 1.3.6.1.2.1.4.20.1.2 ipAdEntNetMask 1.3.6.1.2.1.4.20.1.3 ipAdEntBcastAddr 1.3.6.1.2.1.4.20.1.4 ipAdEntReasmMaxSize 1.3.6.1.2.1.4.20.1.5 ICMP Group icmpInMsgs 1.3.6.1.2.1.5.1 icmpInErrors 1.3.6.1.2.1.5.2 icmpInDestUnreachs 1.3.6.1.2.1.5.3 icmpInTimeExcds 1.3.6.1.2.1.5.4 icmpInParmProbs 1.3.6.1.2.1.5.5 icmpInSrcQuenchs 1.3.6.1.2.1.5.6 icmpInRedirects
Jetpropelledsnake21
2018/12/04
5.4K0
python常用运维脚本实例
file是一个类,使用file('file_name', 'r+')这种方式打开文件,返回一个file对象,以写模式打开文件不存在则会被创建。但是更推荐使用内置函数open()来打开一个文件 .
菲宇
2019/06/12
1.8K0
Snmp学习笔记
相关链接: Snmp学习笔记 使用snmp4j实现Snmp功能(一) 使用snmp4j实现Snmp功能(二) 使用snmp4j实现Snmp功能(三)
全栈程序员站长
2022/07/12
3900
python 运维常用脚本
path = "D:/UASM64/include/" dirs = os.listdir(path) temp=[];
用户5760343
2019/07/31
3.5K0
相关推荐
第三方平台告警接入、翻译、关联恢复
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文