+ -
当前位置:首页 → 问答吧 → Perl监控Windows主机功能实现(原创)

Perl监控Windows主机功能实现(原创)

时间:2011-01-24

来源:互联网

本帖最后由 jiannma 于 2011-01-24 10:47 编辑

看到坛子里面有很多介绍如何使用Perl来监控Windows的例子:

可以通过Win32::OLE和DBD::WMI模块来获取Windows机器的
CPU等信息,但是这些模块应该都是在Windows上运行的,因此在Linux上,无法安
装这两个模块。那有没有其他的方法来实现此功能?自己摸索了下,发现可以使用
Perl 自带的Net::SNMP模块来实现。 (这里感谢flw老大的提醒 ^-^)


下面就是我自己的解决方式,如果有那些方面讲的不对,欢迎大家进行修改:

一. 首先介绍下 实验环境:



QUOTE:
Server : CentOS 5.5 x86_64 (perl 5.8.8  )
IP : 192.168.7.67

Client : Windows XP SP3 (使用VBOX虚拟机)
IP: 192.168.56.101



二.解决步骤:

1.Client端设置
由于Server要使用Net::SNMP模块,所以Client需要安装SNMP服务,安装方法如下:
使用管理员帐号登录,依次选择:”开始“->“控制面板”-> “添加/删除程序”->”添加/删除
Windows组件“,选择里面的”管理和监视工具”,然后点击“下一步”进行安装即可。
安装完成后,点击“我的电脑”,右键点击选择”管理“->”服务和应用程序”->“服务”,
选择里面的“SNMP Service”,如下图所示:

下载 (75.06 KB)
2011-01-24 10:33



右键点击该服务选择”属性”,选择”陷井”,如下图所示:

下载 (50.73 KB)
2011-01-24 10:35


这里进行如下的设置:
团体名称: MysnmpComm
然后选择”添加到列表“->”添加“-> 添加主机IP,这里就填写192.168.7.67,如下图所示
下载 (53.79 KB)
2011-01-24 10:36


填写完成后选择”添加“即可,然后右键点击该服务,选择”重新启动”即可。这样,
Client端的设置就基本完成了。

2.SNMP原理
这里先简单描述下SNMP的原理,如下所示:

下载 (109.67 KB)
2011-01-24 10:37



说明:
1、snmp代理程序(Linux的常用代理程序是net-snmp)把从设备读到的各种数据(比
如网卡数据包的进出情况)以SMI规定的格式 (这种格式要求MIB变量必 须以
1.3.6.1.2.1开头)写到MIB库中(MIB库就像抽屉一样,有很多变量,每一个变量存储
着设备的信息。比如 1.3.6.1.2.1.7.1,这个变量里存储了收到了多少UDP协议包)
2、snmp管理器程序(MRTG、SolarWinds等软件)通过snmp协议与snmp代理程序联
系,以便间接读取MIB库中的数据。
简单的来说就是:SNMP是依据对象的OID( Object Identifiers)号来区别每个对象的。



3.Server端设置
明白了上面的原理后,接下来Server端的设置就比较的容易了,使用Perl来编写程序
即可。在此之前,可以先测试下,看Client服务是否配置正确。
在Server端运行下面的命令:


QUOTE:
test@camlit ~: snmpwalk -v2c -c MysnmpComm 192.168.56.101 1.3.6.1.2.1.11.29



QUOTE:
SNMPv2-MIB::snmpOutTraps.0 = Counter32: 3
参数说明:
-v2c:SNMP 版本2
-c :COMMUNITY 名字,就是前面设置的”MysnmpComm”
192.168.56.101 : 客户端IP
1.3.6.1.2.1.11.29:OID,
查资料发现它的MIB就是(.iso.org.dod.internet.mgmt.mib-2.snmp.snmpOutTraps)


根据上面的结果我们可以得知客户端的设置是正确的。


在这里我们可以用工具查看设备的OID,附件为相应的工具,

mibbrowser.zip (653.01 KB)
下载次数: 1
2011-01-24 10:42


使用方法:
解压到本地,然后打开里面的"MIbrowser.exe"即可:

附上我自己使用该工具的截图:
下载 (40.57 KB)
2011-01-24 10:41


测试脚本如下:
test@camlit ~: vi snmp_win.pl
  1. #!/usr/bin/perl
  2. #This program is used to gather the Windows Server Information

  3. use strict;
  4. use Net::SNMP;

  5. my $desc = '1.3.6.1.2.1.2.1.0'; ## The interfaces oid

  6. #Create a new object
  7. my ($session, $error ) = Net::SNMP->session(
  8. -hostname => "192.168.56.101",
  9. -community => "MysnmpComm",
  10. -timeout => "30",
  11. -port => "161"
  12. );


  13. die "Session error: $error\n" unless ($session);

  14. my $response = $session->get_request($desc);
  15. die "Request error:" . $session->error unless (defined $response);

  16. $session->close;
  17. print "Number of interfaces : ". $response->{$desc};
复制代码


QUOTE:
test@camlit ~: chmod +x snmp_win.pl
test @camlit ~: ./!$
Number of interfaces : 2



总结:只要知道对象的OID号就可以显示出Windows里面的各种信息。

目前还在思考怎么监控CPU/Memory的使用情况....

作者: jiannma   发布时间: 2011-01-24

学习了~

作者: x9x9   发布时间: 2011-01-24