############################################################
插入一个信息
Handy.sh里,Linux下如果要根据read到的nl序号筛选出目录名。
需要用以下表达式:
folder_name=ls -l "$DIR" | awk -F" " ‘{ print $9 }‘ | grep -v Handy.sh | nl | grep ‘\ ‘"$REPLY"$‘\t‘ | a<br/>wk ‘{ print $2 }‘
URL:https://www.linuxidc.com/Linux/2011-11/47000.htm
############################################################
标题:修改SNMP端口并利用snmpwalk测试,nagios监控,脚本读取后筛选出磁盘占用空间的值
正文:
当UDP161端口被网站服务SNMP占用时,如何通过修改SNMP端口来实现双SNMP同时监控?
起因:想用nagios监控Redbox所在的Server,用netstat却发现161端口已被占用,更奇怪的是,services.msc里的SNMP Service却没有
开启。
后来发现,Redbox这个平台的网页上也可以设置SNMP,但是无法修改SNMP的端口号。由于这是仅针对于平台的SNMP监控,所以采集到的
信息并非server的信息。
[[email protected] libexec]# snmpwalk -v1 -c public x.x.0.20
SNMPv2-MIB::sysDescr.0 = STRING: Red Box Recorder
SNMPv2-MIB::sysObjectID.0 = OID: SNMPv2-SMI::enterprises.9854.2
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (261002866) 30 days, 5:00:28.66
SNMPv2-MIB::sysContact.0 = STRING:
SNMPv2-MIB::sysName.0 = STRING: SHARBM01
SNMPv2-MIB::sysLocation.0 = STRING:
SNMPv2-MIB::sysServices.0 = INTEGER: 0
[[email protected] libexec]#
在Redbox网页端设置的SNMP占用了161端口后,想办法在所在Server上也启用SNMP监控服务器本身的方法。终究被我找到了。
而且经测试,并不会影响到网页上设置的SNMP服务。这也说明了网页端的SNMP并没有调用Windows Server上的SNMP服务,只是占用了这
个公认的端口。
接下来进行Windows Server的SNMP Service定义。
1.修改service文件里的SNMP端口
https://blog.csdn.net/liang4571231/article/details/6749833
2.启动services.msc里的SNMP service服务,配置好必要的community和allow IP。
3.用snmpwalk检测连通性时发现,snmpwalk工具没有指定SNMP端口的参数,但是却告诉了我们使用方法。
[[email protected] ~]# snmpwalk -v1 -c public x.x.0.21 -p:16161
Warning: -p option is no longer used - specify the remote host as HOST:PORT
[[email protected] libexec]# snmpwalk -v1 -c public x.x.0.20:16161
SNMPv2-MIB::sysDescr.0 = STRING: Hardware: Intel64 Family 6 Model 63 Stepping 2 AT/AT COMPATIBLE - Software: Windows
Version 6.1 (Build 7601 Multiprocessor Free)
SNMPv2-MIB::sysObjectID.0 = OID: SNMPv2-SMI::enterprises.311.1.1.3.1.2
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (132130) 0:22:01.30
SNMPv2-MIB::sysContact.0 = STRING:
SNMPv2-MIB::sysName.0 = STRING: SHARBM01.xxxx.aspa.xxxx.local
SNMPv2-MIB::sysLocation.0 = STRING:
SNMPv2-MIB::sysServices.0 = INTEGER: 76
IF-MIB::ifNumber.0 = INTEGER: 26
IF-MIB::ifIndex.1 = INTEGER: 1
IF-MIB::ifIndex.2 = INTEGER: 2
IF-MIB::ifIndex.3 = INTEGER: 3
.....
4.用check_snmp_storage.pl的插件来抓取我们要的信息。
[[email protected] libexec]# ./check_snmp_storage.pl -C public -H x.x.0.20 -p16161 -m ^[CD]: -w 1 -c 2 -v
Alarm at 15
SNMP v1 login
Filter : ^[CD]:
OID : 1.3.6.1.2.1.25.2.3.1.3.3, Desc : F:\
OID : 1.3.6.1.2.1.25.2.3.1.3.5, Desc : Physical Memory
OID : 1.3.6.1.2.1.25.2.3.1.3.2, Desc : D:\ Label:DATA Serial Number 4ca023fc
Name : D:\ Label:DATA Serial Number 4ca023fc, Index : 2
OID : 1.3.6.1.2.1.25.2.3.1.3.4, Desc : Virtual Memory
OID : 1.3.6.1.2.1.25.2.3.1.3.1, Desc : C:\ Label: Serial Number 43dd6d28
Name : C:\ Label: Serial Number 43dd6d28, Index : 1
storages selected : 2
Descr : D:\ Label:DATA Serial Number 4ca023fc
Size : 950481663
Used : 189262909
Alloc : 4096
Descr : C:\ Label: Serial Number 43dd6d28
Size : 26188139
Used : 8212374
Alloc : 4096
Perf data : ‘D:_Label:DATA__Serial_Number_4ca023fc‘=739308MB;37128;74256;0;3712819 ‘C:
_Label:__Serial_Number_43dd6d28‘=32080MB;1023;2046;0;102297
D:\ Label:DATA Serial Number 4ca023fc: 20%used(739308MB/3712819MB) C:\ Label: Serial Number 43dd6d28: 31%used
(32080MB/102297MB) (>2%) : CRITICAL
5.接下来就可以用nagios来添加监控项了。
[[email protected] objects]# tail -n2 ../resource.cfg
Sets $USER7$ to be the SNMP community name
$USER7$=public
[[email protected] objects]# vi commands.cfg
define command {
command_name check_snmp_stor
command_line $USER1$/check_snmp_storage.pl -H $HOSTADDRESS$ -C $ARG1$ -m $ARG2$ -w $ARG3$ -c $ARG4$
command_line $USER1$/check_snmp_storage.pl -H $HOSTADDRESS$ -p $ARG1$ -C $USER7$ -m $ARG2$ -w $ARG3$ -c $ARG4$
}
对参数作了一定修改。
[[email protected] objects]# vi windows.cfg
define service {
use generic-service
hostgroup_name windows-servers ; The name of the hostgroup
service_description C:\ Disk Space
check_command check_snmp_stor!public!C:!70!90
check_command check_snmp_stor!161!C:!70!90
}
先验证下修改后的配置文件对于原来的监控是否正常。
6.经验证正常后,开始添加Redbox Server到Nagios。
由于定义的host如果use模板windows-server,那就会被上面定义的service自动生成监控,但段口号却是不对的。
所以我们需要区别对待,为所有16161端口的windows-server定义另一个template.
[[email protected] objects]# vi templates.cfg
新增以下template。
define host {
name redbox-server ; The name of this host template
use generic-host ; Inherit default values from the generic-host template
check_period 24x7 ; By default, Windows servers are monitored round the
clock
check_interval 5 ; Actively check the server every 5 minutes
retry_interval 1 ; Schedule host check retries at 1 minute intervals
max_check_attempts 10 ; Check each server 10 times (max)
check_command check-host-alive ; Default command to check if servers are "alive"
notification_period 24x7 ; Send notification out at any time - day or night
notification_interval 30 ; Resend notifications every 30 minutes
notification_options d,r ; Only send notifications for specific host states
contact_groups admins ; Notifications get sent to the admins by default
hostgroups redbox-servers ; Host groups that Windows servers should be a member of
register 0 ; DON‘T REGISTER THIS - ITS JUST A TEMPLATE
}
主要修改name和hostgroups
然后到windows.cfg里定义redbox的host,use这个template
[[email protected] objects]# vi windows.cfg
define host {
use redbox-server ; Inherit default values from a template
host_name Redbox Media Server ; The name we‘re giving to this host
alias Redbox Windows Server ; A longer name associated with the host
address x.x.0.20 ; IP address of the host
}
并且定义redbox一个新的hostgroup
define hostgroup {
hostgroup_name redbox-servers ; The name of the hostgroup
alias Redbox Servers ; Long name of the group
}
最后添加服务
define service {
use generic-service
hostgroup_name redbox-servers ; The name of the hostgroup
service_description C:\ D:\ Disk Space
check_command check_snmp_stor!16161!^[CD]:!70!90
}
监控效果是OK的。
7.如法炮制的把另外两台Redbox Server也加入到里面来。
8.接下来,由于公司需要定期借特权帐号登录到目标机器察看磁盘空间.
每次都觉得比较麻烦,其实要知道磁盘空间不是只能登录到电脑去查看硬盘空间,还可以利用SNMP抓取的信息进行分析和筛选.
所以想写一个利用snmpwalk来截取磁盘空间信息的脚本.
9.脚本如下
其中变量的计算参考如下:
URL: https://www.jb51.net/article/31232.htm
脚本旨在抓取三台SNMP端口为16161的windows server的磁盘分区C,D盘已用空间,以及一台Windows server的C,D,E盘空间。
======================Script Start=========================
[[email protected] check_disk_space]# cat check_disk_space.sh
#!/bin/bash
#Define Variables
DATE=date ‘+%Y-%m-%d_%H:%M:%S‘
script_dir=$(cd "$(dirname "$0")";pwd)
output=$script_dir/Disk_Space.txt
cd /usr/local/nagios/libexec
echo ‘#######Disk Space(Used Space)#######‘ | tee $output
echo ‘Date: ‘$DATE | tee -a $output
#Check Disk Space
for i in x.x.0.20 x.x.0.21 x.x.0.22
do
Cspace=$(./check_snmp_storage.pl -C public -H $i -p16161 -m ^[CD]: -w 1 -c 2 -v | grep "Perf data" | awk -F"="
‘{print $3}‘ | awk -F";" ‘{print $1}‘ | sed ‘s/MB//g‘)
Dspace=$(./check_snmp_storage.pl -C public -H $i -p16161 -m ^[CD]: -w 1 -c 2 -v | grep "Perf data" | awk -F"="
‘{print $2}‘ | awk -F";" ‘{print $1}‘ | sed ‘s/MB//g‘)
Cspace=$(echo "scale=1;$Cspace/1024" | bc)
Dspace=$(echo "scale=1;$Dspace/1024" | bc)
echo Server‘[‘$i‘]‘ | tee -a $output
echo ‘C Drive: ‘$Cspace GB | tee -a $output
echo ‘D Drive: ‘$Dspace GB | tee -a $output
echo ‘ ‘ | tee -a $output
done
======================Script End=========================
10.这里有个问题,就是有一个IP地址为10.116.x.x的Windows Server,从Nagios所在的Linux电脑不可达。所以我不能在它上面用snmp
抓取信息。手头可达的服务器只有一台Windows Server可达。我从网上下载了snmpwalk.exe到这台电脑。写个执行脚本,每天定时抓取
10.116.x.x的信息。然后再在筛选磁盘已用空间脚本所在的Linux Server上,通过读取每天导出的日志内容来分析出已用空间。
下载地址:https://github.com/PentestBox/snmpwalk
有条件可以去官网下载.
1)在脚本所在的电脑上,脚本是调用nagios的插件check_snmp_storage.pl来筛选已用空间信息的。
这个在Windows电脑上没有。但是本质上snmpwalk也能抓到需要的信息。
根据分析比对和查阅资料,我发现
hrStorageUsed是我们需要的内容,它可以显示每个驱动器的已用空间。根据序号的不同,对应不同的驱动器。
所以理论上只要以下命令就够了,可以抓到所有硬盘的信息:
[[email protected] libexec]# snmpwalk -v2c -c public x.x.0.21:16161 hrStorage
URL:https://my.oschina.net/yisenn/blog/14626
从check_snmp_storage.pl的输出结果来看。
Descr : C:\ Label:SYSTEM Serial Number b6daab5c
Size : 26155775
Used : 7387236
Alloc : 4096
Perf data : ‘D:_Label:DATA__Serial_Number_8c92ea56‘=1584803MB;44760;89521;0;4476035 ‘C:
_Label:SYSTEM__Serial_Number_b6daab5c‘=28856MB;1022;2043;0;102171
这里的计算逻辑是。
28856MB10241024/4096=7387136,很接近Used的数值。
而这个Used的数值其实和snmpwalk结果里的HOST-RESOURCES-MIB::hrStorageUsed.1 = INTEGER等值。
那么反推,想要知道已使用空间多少MB,只要将[Used]*4096/1024/1024就可以得到了。
然后不论从Windows上执行snmpwalk.exe还是linux上的snmpwalk命令,都可以得到这样一个输出结果
OID : 1.3.6.1.2.1.25.2.3.1.3.1, HOST-RESOURCES-MIB::hrStorageDescr.1 = STRING: C:\ Label
OID : 1.3.6.1.2.1.25.2.3.1.3.2, HOST-RESOURCES-MIB::hrStorageDescr.2 = STRING: D:\ Label
OID : 1.3.6.1.2.1.25.2.3.1.3.3, HOST-RESOURCES-MIB::hrStorageDescr.3 = STRING: E:\ Label
OID : 1.3.6.1.2.1.25.2.3.1.4.1, HOST-RESOURCES-MIB::hrStorageAllocationUnits.1 = INTEGER: 4096 Bytes
OID : 1.3.6.1.2.1.25.2.3.1.4.2, HOST-RESOURCES-MIB::hrStorageAllocationUnits.2 = INTEGER: 4096 Bytes
OID : 1.3.6.1.2.1.25.2.3.1.4.3, HOST-RESOURCES-MIB::hrStorageAllocationUnits.3 = INTEGER: 4096 Bytes
OID : 1.3.6.1.2.1.25.2.3.1.5.1, HOST-RESOURCES-MIB::hrStorageSize.1 = INTEGER: 26155775
OID : 1.3.6.1.2.1.25.2.3.1.5.2, HOST-RESOURCES-MIB::hrStorageSize.2 = INTEGER: 1145864959
OID : 1.3.6.1.2.1.25.2.3.1.5.3, HOST-RESOURCES-MIB::hrStorageSize.3 = INTEGER: 124354354
OID : 1.3.6.1.2.1.25.2.3.1.6.1, HOST-RESOURCES-MIB::hrStorageUsed.1 = INTEGER: 7387236
OID : 1.3.6.1.2.1.25.2.3.1.6.2, HOST-RESOURCES-MIB::hrStorageUsed.2 = INTEGER: 405721068
OID : 1.3.6.1.2.1.25.2.3.1.6.3, HOST-RESOURCES-MIB::hrStorageUsed.3 = INTEGER: 43284233
在Windows下的snmpwalk.exe,执行以下命令来缩小抓取的范围。
C:\snmpwalk-master> Snmpwalk.exe -r:10.116.x.x -c:XXXX -v:1 -os:1.3.6.1.2.1.25.2.3.1.2.6 -op:1.3.6.1.2.1.25.2.3.1.7.1
C:\Snmpwalk.txt
我们准备Windows上的snmpwalk命令写成bat,然后放到scheduled task里,每天执行一次。内容就是上文。
这里有两点需要注意。
a)-os是抓取范围的起点OID,-op则是终点OID。但是抓取时不包含着两个OID。
b)有时候会出现以下错误:“snmpwalk.exe failed to get value of SNMP variable.Timeout”.这时可以尝试参数-v换一个version
的SNMP。
2)加入计划任务后,发现可以创建Snmpwalk.txt,但不像双击执行*.cmd脚本时可以导出结果。
经过测试,发现原来是双击执行脚本时默认在当前目录下寻找exe文件,但计划任务不是。
解决方法是,在计划任务里的Actions里,添加Start in(optional)的值为exe所在路径。
3)接下来,试着在Nagios和Linux脚本所在的Linux Server上,挂载Windows Server的目录,然后直接分析刚才导出的Snmpwalk.txt来
获取最终结果。
[[email protected] libexec]# mkdir /C
[[email protected] check_disk_space]# mount -t cifs //10.116.x.x/C$/Cxxxxx/Script_by_xxxx/snmpwalk-master/snmpwalk-master
-o username=‘administrator‘,password="xxxxx",r /C
经验证,可以正常挂载。
[[email protected] check_disk_space]# umount -l /C
经验证,也可以正常卸载。
4)接下来可以追加到脚本里了。
[[email protected] check_disk_space]# vi check_disk_space.sh
追加了以下这段:
======================Script End=========================
#######Output for VRS-Dealing########
mount -t cifs //10.x.x.193/C$/CyberArk/Script_by_Chris/snmpwalk-master/snmpwalk-master -o
username=‘administrator‘,password="[email protected]",r /C
VRS=10.116.x.x
VRS_Cused=$(cat /C/Snmpwalk.txt | grep 1.3.6.1.2.1.25.2.3.1.6.1 | awk -F= ‘{print $4}‘ | tr -d ‘\r‘)
VRS_Dused=$(cat /C/Snmpwalk.txt | grep 1.3.6.1.2.1.25.2.3.1.6.2 | awk -F= ‘{print $4}‘ | tr -d ‘\r‘)
VRS_Eused=$(cat /C/Snmpwalk.txt | grep 1.3.6.1.2.1.25.2.3.1.6.3 | awk -F= ‘{print $4}‘ | tr -d ‘\r‘)
VRS_Cused=$(echo "scale=1;$VRS_Cused4096/1024/1024/1024" | bc)
VRS_Dused=$(echo "scale=1;$VRS_Dused4096/1024/1024/1024" | bc)
VRS_Eused=$(echo "scale=1;$VRS_Eused*4096/1024/1024/1024" | bc)
echo Server‘[‘$VRS‘]‘ | tee -a $output
echo ‘C Drive: ‘$VRS_Cused GB | tee -a $output
echo ‘D Drive: ‘$VRS_Dused GB | tee -a $output
echo ‘E Drive: ‘$VRS_Eused GB | tee -a $output
echo ‘ ‘ | tee -a $output
umount -l /C
======================Script End=========================
原文地址:http://blog.51cto.com/7350550/2348688