作者 主題: [肉腳分享]SNMP偵測主機資訊程式  (閱讀 6095 次)

0 會員 與 1 訪客 正在閱讀本文。

特級大肉腳

  • 憂鬱的高中生
  • ***
  • 文章數: 113
    • 檢視個人資料
[肉腳分享]SNMP偵測主機資訊程式
« 於: 2011-01-11 17:00 »
這是肉腳在學習分析snmpwalk所產生的大量資料,邊try資料邊寫支程式把它們撈出來。
因為網路上非常少人有寫介紹這些資料意涵的文件,於是肉腳只好自己目測。
因為Linux跟Unix吐出資料還是有差,所以部份有價值的資料並沒有寫入程式去撈。
(例如Unix/BSD連底下裝什麼套件都看的到,雖然snmpd偵測出來的資料有些會誤判
(例如FAT32檔案系統空間用量很怪),但能夠偵測出這麼多東西已經夠恐怖了。)
並且比對三種作業系統的樣本:Solaris 10、FreeBSD 7.2、Debian 5,
扣除掉部份系統會產生的異常結構資料,才寫出來一部分。
肉腳對於這些資料還在學習階段,如果程式有寫錯也希望各位大師多多指點。
謝謝......
============================================================================
#!/usr/bin/tclsh8.5
puts "請輸入要偵測的主機IP"
gets stdin IP
set resultat [exec snmpwalk -v 2c -c public $IP]
set splitre [split $resultat '\n']
set lrres [llength $splitre]
puts "SNMP擷取總資料量:$lrres 筆"
set f [open tmp w+]
set cpun 0
set nonhd 0

for { set i 0 } { $i<$lrres } {incr i } {
  set line [lindex $splitre $i]
  puts $f $line

#0.清除奇怪資料
  if {[lindex $line 0]=="HOST-RESOURCES-MIB::hrSystemInitialLoadDevice.0"} {
  #這行的引號很討厭會斷兩行,讓程式判斷錯誤。
  incr i 3
  set line [lindex $splitre $i]
  #puts $line
  }
#1.測試系統
  if { [lindex $line 0]=="SNMPv2-MIB::sysDescr.0" } {
  set sys [lindex $line 3]
  set kernel [lindex $line 5]
  set sysname [lindex $line 4]
  puts "作業系統:$sys $kernel"
  puts "主機名稱:$sysname"
  }
#2.網路介面
  if { [string range $line 0 14]=="IF-MIB::ifDescr" } {
  lappend netin [lindex $line 3]
  }
  if { [string range $line 0 20]=="IF-MIB::ifPhysAddress" } {
  lappend macaddr [lindex $line 3]
  }
  if { [string range $line 0 19]=="IF-MIB::ifOperStatus" } {
  lappend instat [lindex $line 3]
  }
  if { [string range $line 0 21]=="IP-MIB::ipAdEntIfIndex" } {
  set linaddr [lindex $line 0]
  set indexaddr [lindex $line 3]
  set inaddr [string range $linaddr 23 end]
  lappend laddr "$indexaddr $inaddr"
  }
  if { [string range $line 0 17]=="IF-MIB::ifInOctets" } {
  set inoct [lindex $line 3]
  lappend inoctmb [format %.2f [expr $inoct/1024.0/1024.0]]
  }
  if { [string range $line 0 18]=="IF-MIB::ifOutOctets" } {
  set outoct [lindex $line 3]
  lappend outoctmb [format %.2f [expr $outoct/1024.0/1024.0]]
  }
  if { [string range $line 0 28]=="TCP-MIB::tcpConnState.0.0.0.0" } {
    if {[lindex $line 3]=="listen(2)"} {
    lappend listenp [lindex [split [string range [lindex $line 0] 30 end] . ] 0]
    }
  }
#3.處理器
  if { [string range $line end-16 end]=="hrDeviceProcessor" } {
  incr cpun
  lappend node_cpu [string range [lindex $line 0] 33 end]
  }
  if { [string range $line 0 32]=="HOST-RESOURCES-MIB::hrDeviceDescr" } {
  foreach var $node_cpu {
    if {[string range [lindex $line 0] 34 end]==$var} {
      lappend cputype [lrange $line 3 end]
      }
    }
  }

#3.系統資源
  if { [string range $line 0 33]=="HOST-RESOURCES-MIB::hrFSMountPoint" } {
  lappend mountp1 [lindex $line 3]
  }
  if {[string range [lindex $line 0] 0 27]=="HOST-RESOURCES-MIB::hrFSType"} {
  set orifs [lindex $line 3]
  if {[string range $orifs 24 end]=="FSSys5FS"} { lappend fstype "UFS" }
  if {[string range $orifs 24 end]=="FSNFS"} { lappend fstype "NFS" }
  if {[string range $orifs 24 end]=="FSFat"} { lappend fstype "FAT(Windows)" }
  if {[string range $orifs 24 end]=="FSLinuxExt2"} { lappend fstype "Ext2(Linux)" }
  if {[string range $orifs 24 end]=="FSOther"} { lappend fstype "unknown/devfs" }
  }
  if { [string range $line 0 31]=="HOST-RESOURCES-MIB::hrMemorySize" } {
  set memsize [lindex $line 3]
  lappend memsizem [expr $memsize/1024]
  }
  if { [string range $line 0 32]=="HOST-RESOURCES-MIB::hrStorageSize" } {
  lappend node_storsize [string range [lindex $line 0] 34 end]
  set storsize [lindex $line 3]
  lappend storsizemb [expr $storsize/1024 ]
  }
  if { [string range $line 0 33]=="HOST-RESOURCES-MIB::hrStorageDescr" } {
      lappend node_mount [string range [lindex $line 0] 35 end]
      lappend mountp [lindex $line 3]
  }
  if { [string range $line 0 32]=="HOST-RESOURCES-MIB::hrStorageUsed" } {
  lappend node_storuse [string range [lindex $line 0] 34 end]
  set storuse [lindex $line 3]
  lappend storusemb [expr $storuse/1024]
  }

}
set stori [llength $node_storsize]
set storj [llength $node_storuse]
for { set i 0 } {$i<$stori} {incr i} {
  set stor1 [lindex $storsizemb $i]
  set stor3 [lindex $mountp $i]
  set index_stor1 [lindex $node_storsize $i]
  for {set j 0} {$j<$storj } { incr j} {
  set stor2 [lindex $storusemb $j]
  set index_stor2 [lindex $node_storuse $j]
  if { $index_stor1==$index_stor2 } {
    lappend storage "$stor3 $stor1 $stor2"
    }
  }
}
set addr [lsort -index 0 $laddr]

puts "網路介面:(裝置: IP位址  MAC位址)"
set lnet [llength $netin]
for { set i 0 } { $i<$lnet } {incr i} {
set netin1 [lindex $netin $i]
set macaddr1 [lindex $macaddr $i]
set addr1 [lindex $addr $i]
puts "$netin1: $addr1 $macaddr1"
}

puts "連線狀態:$instat"
puts "網路總下載流量:$inoctmb"
puts "網路總上傳流量:$outoctmb"
puts "Listen Port:$listenp"
puts "處理器數目:$cpun"
puts "CPU類型:"
set lcputype [llength $cputype]
for {set i 0} {$i<$lcputype} { incr i} {
puts [lindex $cputype $i]
}
puts "磁碟空間用量:(全部/已使用)"
set lstorage [llength $storage]
for { set i 0 } { $i<$lstorage } { incr i} {
set storage1 [lindex $storage $i]
puts "$storage1 MB "
}

puts "檔案系統:"
set lfstype [llength $fstype]
for {set i 0} { $i<$lfstype } {incr i} {
set fstype1 [lindex $fstype $i]
set mountp11 [lindex $mountp1 $i]
puts "$fstype1 $mountp11"
}

apage

  • 活潑的大學生
  • ***
  • 文章數: 337
    • 檢視個人資料
回覆: [肉腳分享]SNMP偵測主機資訊程式
« 回覆 #1 於: 2011-01-12 00:04 »
難得的分享,但感覺到有點可惜...為什麼不是Bash...
我的筆記
啊,就我的筆記阿...
-----以下兩個是屍體-----
AegisHK
Aegis
eAthena屍體
eathena

特級大肉腳

  • 憂鬱的高中生
  • ***
  • 文章數: 113
    • 檢視個人資料
回覆: [肉腳分享]SNMP偵測主機資訊程式
« 回覆 #2 於: 2011-01-12 10:02 »
難得的分享,但感覺到有點可惜...為什麼不是Bash...
bash shell script雖然是所有Unixer的基本功,但是它不是萬靈丹。
拿來寫一堆程式run起來的命令搞是堪用,但是做複雜的字串處理真的不好用。
同樣實做一個功能,用bash shell script寫需要先熟悉Unix下有哪些工具可用(例如find、awk、sed、grep等)。
組合這些工具本身就比學單一程式語言難多了。
用bash shell script寫程式,需要不斷的把這個輸出結果導入到下一個執行句,導致程式碼橫向發展,
變得很難以閱讀,也很難繼續思考下去......
遇到某些用grep提出來的需要字串又黏了一堆不必要字元,要花時間想如何切?
如何把一篇文章或是某程式輸出結果整個導入到一個變數中,再一行一行讀來檢驗該行是否有符合字串、文字標籤,
表示程式來到正確區域,然後直接再跳N行抓出某區域的符合字串。
這類的事情在tcl很簡單,lindex、lrange、string range等等list工具,一下就指到確定位置了。
但是這如果改用bash shell script要怎麼寫?肉腳真的不知道要怎麼寫。

當然如果肉腳寫的是自己公司用的程式,不到萬不得已不會用tcl,
因為還有讓別人也看得懂這個因素也要考慮進去,但就要被bash慘電就是了。

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
回覆: [肉腳分享]SNMP偵測主機資訊程式
« 回覆 #3 於: 2011-01-12 10:53 »
難得的分享,但感覺到有點可惜...為什麼不是Bash...
bash shell script雖然是所有Unixer的基本功,但是它不是萬靈丹。
拿來寫一堆程式run起來的命令搞是堪用,但是做複雜的字串處理真的不好用。
同樣實做一個功能,用bash shell script寫需要先熟悉Unix下有哪些工具可用(例如find、awk、sed、grep等)。
組合這些工具本身就比學單一程式語言難多了。

我也是比較偏向能夠直接使用 bash shell script 來管理主機
舉個例子,我的某兩台主機(ubuntu 8.04, centos 5.x) 都有 tclsh

(ubuntu 8.04)
$ ls /usr/bin/tclsh*
/usr/bin/tclsh  /usr/bin/tclsh8.4

(centos 5.x)
$ ls /usr/bin/tclsh*
/usr/bin/tclsh  /usr/bin/tclsh8.4

但是另外有幾台只安裝最基本的 lamp 環境預設卻是未安裝 tclsh

(ubuntu10.04)
$ ls /usr/bin/tclsh*
ls: cannot access /usr/bin/tclsh*: No such file or directory
$ ls /bin/tclsh*
ls: cannot access /bin/tclsh*: No such file or directory
$ ls /sbin/tclsh*
ls: cannot access /sbin/tclsh*: No such file or directory
$ whereis tclsh
tclsh:

雖然是最基本的安裝, 但是一些基本的指令都會有啊
所以如果是用 shell script 做管理的話, 就不用另外再安裝東西  ;D