Disk Space
插入一個信息
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:ttps://www.linuxidc.com/Linux/2011-11/47000.htm
############################################################
正文:
當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::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
在Redbox網頁端設置的SNMP占用了161端口後,想辦法在所在Server上也啟用SNMP監控服務器本身的方法。終究被我找到了。
而且經測試,並不會影響到網頁上設置的SNMP服務。這也說明了網頁端的SNMP並沒有調用Windows Server上的SNMP服務,只是占用了這
個公認的端口。
接下來進行Windows Server的SNMP Service定義。
1.修改service文件裏的SNMP端口
ttps://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: ttps://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上,通過讀取每天導出的日誌內容來分析出已用空間。
下載地址:ttps://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:ttps://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=========================
以上已更新
Disk Space