介绍
作为系统管理员的很大一部分是收集有关您的服务器和基础架构的准确信息。 有许多工具和选项用于收集和处理此类信息。 他们中许多人都在一个名为SNMP技术构建。
SNMP代表简单的网络管理协议。 这是服务器可以共享关于其当前状态的信息的方式,并且还是管理员可以通过其修改预定义值的通道。 虽然协议本身很简单,但是实现SNMP的程序的结构可能非常复杂。
在以前的导游,我们讨论SNMP协议的基础知识以及如何安装和配置在Ubuntu 14.04服务器SNMP组件 。 在本指南中,我们将去了很多附带的工具的基本用法net-snmp
,我们一直在与套件。
我们将讨论如何利用我们在上一个指南中设置的配置,以便实际收集信息和操纵远程主机。 本教程假设您有两台主机设置为他们在年底安装和配置指南 。
使用SNMP客户端命令
在net-snmp
的,我们一直在使用的工具套件包含相当多的实用程序,用于查询或远程主机上设置OID值非常有用。 幸运的是,大多数工具利用一组共享语法并具有类似的使用模式。 我们将在下面讨论一些更流行的基本用法。
对于本指南的目的,我们假定你所熟悉的,你需要提供身份验证部分net-snmp
命令。 我们要指所有的作为认证信息authentication_info
在下面的部分。
如果你已经设置了snmp.conf配置为您的客户为这里讨论,你可以删除命令的这一部分,作为身份验证的详细信息将会从您的配置文件中读取。
如果你没有一个snmp.conf
文件,您将需要连接到远程后台程序所需的信息来替代“authentication_info”,在每个命令。 为了demo
,我们在这个系列设置帐户,下面的值可用于:
-u demo -l authPriv -a MD5 -x DES -A my_new_password -X my_new_password
如果您处于不同的环境中,请在运行这些命令时替换您自己的值。
现在,您知道您将需要的身份验证详细信息,让我们熟悉一些可用的命令。
使用SnmpGet检索单个OID值
这可能是使用SNMP查询信息的最基本的命令。 使用早先讨论的基本认证标志, snmpget
命令可以用来读取用户具有访问任何OID的值。
基本用法是指定已知的数字OID。 例如,我们可以通过键入以下内容来检索系统描述:
snmpget authentication_info host 1.3.6.1.2.1.1.1.0
由于我们安装了snmp-mibs-downloader
最后的指南中我们经理的电脑包上,我们也可以通过它们的名字引用常见的OID。 例如,我们可以通过键入以下内容获得相同的信息:
snmpget authentication_info host sysDescr.0
使用SnmpGetNext检索下一个可用的OID值
此命令用于获取给定的OID之后的OID的值。 由于MIB数据库是可分级层次结构,因此可以顺序检索其值。 通过利用这个属性,我们可以从树中的任何对象中找到下一个对象的值(和OID标签)。
例如,我们在上面看到如何获得系统描述。 要找出一个OID,它的值,我们可以调用相同的命令,但这次与snmpgetnext
命令:
snmpgetnext authentication_info host sysDescr.0
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
这将返回系统ObjectID,这是树中的下一个顺序对象。 我们可以使用返回的OID重复这一遍,以获得每个顺序对象:
snmpgetnext authentication_info host sysObjectID.0
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (114216) 0:19:02.16
这些可以使用字符串OID或数字OID,就像以前一样。
使用SnmpWalk检索MIB层次结构的节
为了让所有的OID的指定OID下,可以使用snmpwalk
命令。 这将返回存在于指定点下面的整个树。
例如,我们可以得到所有的值的system
通过键入树的部分:
snmpwalk authentication_info host system
SNMPv2-MIB::sysDescr.0 = STRING: Linux target 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (126926) 0:21:09.26
SNMPv2-MIB::sysContact.0 = STRING: admin@example.com
SNMPv2-MIB::sysName.0 = STRING: target
SNMPv2-MIB::sysLocation.0 = STRING: Sitting on the Dock of the Bay
SNMPv2-MIB::sysServices.0 = INTEGER: 72
. . .
此命令通过自动向主机发出SNMP getNext请求操作,直到它可以构造所请求的值下面的整个树。
如果您希望基本检索整个MIB树,可以在根上执行以下命令:
snmpwalk authentication_info host .
这将返回用户提供的可访问的整个树。
这可以用于,随着grep
搜索特定的OID名称。 例如,你可能知道sysUpTime.0
OID返回的SNMP守护程序已经在远程主机上运行的长度,但你可能会好奇,本身已经在线多长时间服务器。
我们可以使用snmpwalk
命令来获得的OID的整个层次,然后使用grep进行过滤,以寻找任何有“正常运行时间”之名。 我们将使用-i
标志来关闭大小写在我们的搜索:
snmpwalk authentication_info host . | grep -i uptime
您将收到如下所示的响应:
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (113856) 0:18:58.56
SNMPv2-MIB::sysORUpTime.1 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.2 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.3 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.4 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.5 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.6 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.7 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.8 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.9 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.10 = Timeticks: (0) 0:00:00.00
HOST-RESOURCES-MIB::hrSystemUptime.0 = Timeticks: (9741455) 1 day, 3:03:34.55
NOTIFICATION-LOG-MIB::nlmLogVariableID."default".1.1 = OID: DISMAN-EVENT-MIB::sysUpTimeInstance
NET-SNMP-AGENT-MIB::nsModuleName."".8.1.3.6.1.2.1.1.3.127 = STRING: mibII/sysUpTime
尝试一些这些值后,我们可以发现, hrSystemUptime.0
OID包含正确的正常运行时间的价值。 现在,任何时候,我们想要多长时间,自从机器已经启动,我们可以使用OID:
snmpget authentication_info host hrSystemUptime.0
HOST-RESOURCES-MIB::hrSystemUptime.0 = Timeticks: (9795352) 1 day, 3:12:33.52
正如你所看到的, snmpwalk
可用于发现正确的OID的价值观非常有帮助。
使用SnmpTranslate在数字和字符串OID之间转换
套件中最有用的命令之一实际上不与远程主机通信。 相反,它只是帮助我们发现有关MIB层次结构的信息。
使用snmptranslate
工具,我们可以很容易地转换数字结果他们的文字表述:
snmptranslate 1.3.6.1.2.1.1.1.0
SNMPv2-MIB::sysDescr.0
这给出了定义文本名称的MIB模块,以及OID本身的名称。
我们也可以使用该工具在另一个方向进行翻译。 当我们发现了系统的正常运行时间(文本MIB hrSystemUptime.0
),我们可能是好奇,就在那里被定义的树。 我们可以通过-On
标志,以获得数字地址。
记住包括每当您接收有关OID的信息时提供的MIB模块:
snmptranslate -On HOST-RESOURCES-MIB::hrSystemUptime.0
.1.3.6.1.2.1.25.1.1.0
您还可以使用此工具获取许多有关任何点的其他详细信息。 例如,与-Td
标志,你可以得到一个完整的描述,完成底部的路径:
snmptranslate -Tp 1.3.6.1.2.1.1.1.0
SNMPv2-MIB::sysDescr.0
sysDescr OBJECT-TYPE
-- FROM SNMPv2-MIB
-- TEXTUAL CONVENTION DisplayString
SYNTAX OCTET STRING (0..255)
DISPLAY-HINT "255a"
MAX-ACCESS read-only
STATUS current
DESCRIPTION "A textual description of the entity. This value should
include the full name and version identification of
the system's hardware type, software operating-system,
and networking software."
::= { iso(1) org(3) dod(6) internet(1) mgmt(2) mib-2(1) system(1) sysDescr(1) 0 }
可以修改如何输出通过使一个显示-O_
参数,其中“_”由输出格式替换。 你可以看到完整的列表中的“输出选项”一节中snmpcmd
手册页,但一些较为常见的选择是:
输出标志 | 描述 | 例 |
---|---|---|
-Oa | 以ASCII字符串显示 | SNMPv2-MIB :: sysDescr.0 |
-的 | 显示OID的完整文本路径 | .iso.org.dod.internet.mgmt.mib- 2.system.sysDescr.0 |
-上 | 显示OID的完整数值路径 | .1.3.6.1.2.1.1.1.0 |
-Os | 仅显示结束的文本OID表示 | sysDescr.0 |
请注意,上述格式化选项也可以应用于此套件中的大多数其他工具,以便按照您的需要设置输出格式。
使用SnmpTable检索格式化输出的表格数据
使用SNMP存储的一些信息实际上是表格。 虽然snmpwalk
能够显示所有相关数据的能力,格式是不理想的某些用途。
例如,如果我们使用snmpwalk
上udpTable
OID:
snmpwalk authentication_info host udpTable
我们会得到这样:
UDP-MIB::udpLocalAddress.0.0.0.0.161 = IpAddress: 0.0.0.0
UDP-MIB::udpLocalAddress.0.0.0.0.35679 = IpAddress: 0.0.0.0
UDP-MIB::udpLocalPort.0.0.0.0.161 = INTEGER: 161
UDP-MIB::udpLocalPort.0.0.0.0.35679 = INTEGER: 35679
但是,如果我们用同样的要求snmptable
:
snmptable authentication_info host udpTable
我们会得到一个格式很好的表,像这样:
udpLocalAddress udpLocalPort
0.0.0.0 161
0.0.0.0 35679
这是更好的格式化,更容易为人类读者消费。
使用SnmpSet修改值
此命令用于将值写入OID。 尽管迄今为止的其他命令用于获取信息,但此命令用于修改主机上的数据。
虽然snmpset
命令继承大部分来自其他命令其语法,它需要一些额外的信息来设置值。 基本语法如下所示:
snmpset authentication_info host OID_to_modify data_type new_value
上面的大部分字段是不言自明的。 然而,数据类型需要更多的解释。 每个类型由单个字符表示。 可能的类型列表如下:
- 我 :整数
- U:无符号整数
- 小号 :字符串
- X:十六进制字符串,
- D:十进制字符串
- N:空对象
- ○:对象ID
- T:时间刻度
- 答 :IP地址
- 乙 :位
既然我们已经下载了snmp-mibs-downloader
包,大部分的时间你可以逃脱打字=
代替类型标识符之一。
为了证明此命令,我们可以注释掉在我们设定的值之一snmpd.conf
代理计算机上的文件。 在配置文件中指定值本质上会对其进行硬编码,阻止您使用常规SNMP方法更改值。
在代理计算机上,打开/etc/snmp/snmpd.conf
的文件:
sudo nano /etc/snmp/snmpd.conf
注释掉sysLocation
指令:
#sysLocation Sitting on the Dock of the Bay
保存并关闭文件。 现在重新启动服务:
sudo service snmpd restart
现在,从我们的管理机器,我们可以设置sysLocation
键入此OID为“地球”。 注意指定数据类型是字符串的“s”:
snmpset authentication_info host sysLocation.0 s "Earth"
SNMPv2-MIB::sysLocation.0 = STRING: Earth
我们可以测试是否=
类型说明符将正确通过优化我们的位置设置的值类型:
snmpset authentication_info host sysLocation.0 = "New York City"
SNMPv2-MIB::sysLocation.0 = STRING: New York City
它正确地将我们的值解释为一个常规字符串。
使用SnmpBulkGet和SnmpBulkWalk有效发出请求
反复发出snmpget
和snmpwalk
反复使用时,请求可以创造相当多的网络流量。
削减这一问题,这两个所谓的同伴命令snmpbulkget
和snmpbulkwalk
创建。 这些将包装单个事务中的所有返回值,而不是每个返回的OID值的事务。 您也可以一次传入多个OID。
要使用snmpbulkget
,您在一个或多个OID或分支机构通过和你会得到额外的OID也适合在包尽可能多的价值:
snmpbulkget authentication_info host system
SNMPv2-MIB::sysDescr.0 = STRING: Linux target 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (429891) 1:11:38.91
SNMPv2-MIB::sysContact.0 = STRING: call now
SNMPv2-MIB::sysName.0 = STRING: target
SNMPv2-MIB::sysLocation.0 = STRING: New York City
SNMPv2-MIB::sysServices.0 = INTEGER: 72
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORID.1 = OID: SNMP-MPD-MIB::snmpMPDCompliance
SNMPv2-MIB::sysORID.2 = OID: SNMP-USER-BASED-SM-MIB::usmMIBCompliance
有一点要注意的是, snmpbulkget
的运作就像一个snmpgetnext
命令,这意味着它,它让出来作为参数给出的对象。 在上面的例子中,我们提供了一个分支,而不是提供一个特定的对象。 你能想到的snmpbulkget
为snmpwalk
电话,但该结果将在一个数据包。
该snmpbulkwalk
命令以类似的方式操作,但将继续使BulkGet
指令直到整个子树检索。
结论
正如你所看到的,使用net-snmp
套件,您可以检索并以各种不同的方式处理数据。 通过脚本化这些操作或在应用程序中利用这些实用程序,您可以构建复杂的监控和管理环境。