1. 程式人生 > >修改SNMP端口並利用snmpwalk測試,nagios監控,腳本讀取後篩選出磁盤占用空間的值

修改SNMP端口並利用snmpwalk測試,nagios監控,腳本讀取後篩選出磁盤占用空間的值

通過 奇怪 網上 tails specific bytes 區別 lib sed

############################################################
插入一個信息
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的信息。
[root@ChrisTest 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
[root@ChrisTest 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端口的參數,但是卻告訴了我們使用方法。
[root@ChrisTest ~]# snmpwalk -v1 -c public x.x.0.21 -p:16161
Warning: -p option is no longer used - specify the remote host as HOST:PORT

[root@ChrisTest 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的插件來抓取我們要的信息。

[root@ChrisTest 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來添加監控項了。

[root@ChrisTest objects]# tail -n2 ../resource.cfg

Sets $USER7$ to be the SNMP community name

$USER7$=public

[root@ChrisTest 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$
}

對參數作了一定修改。

[root@ChrisTest 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.
[root@ChrisTest 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
[root@ChrisTest 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=========================
[root@ChrisTest 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是我們需要的內容,它可以顯示每個驅動器的已用空間。根據序號的不同,對應不同的驅動器。
所以理論上只要以下命令就夠了,可以抓到所有硬盤的信息:
[root@ChrisTest 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來

獲取最終結果。
[root@ChrisTest libexec]# mkdir /C
[root@ChrisTest 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
經驗證,可以正常掛載。
[root@ChrisTest check_disk_space]# umount -l /C
經驗證,也可以正常卸載。

4)接下來可以追加到腳本裏了。
[root@ChrisTest 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="P@ssw0rd",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_Dused
4096/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=========================

修改SNMP端口並利用snmpwalk測試,nagios監控,腳本讀取後篩選出磁盤占用空間的值