1. 程式人生 > >linux下snmp4j獲取net-snmp的基本資訊

linux下snmp4j獲取net-snmp的基本資訊

linux下,net-snmp已經提供了完整的snmp服務和框架,尤其是基本的snmp資訊,如sysObjectId、CPU、記憶體等。通過標準的snmp的oid,可以很容易的從net-snmp所提供的服務中獲取這些資訊。但net-snmp的trap功能需要通過指令碼來配置和實現,這對於很多做web或java開發的人來說,比較陌生。藉助snmp4j,很多熟悉java的人,可以快速的實現基於snmp4j的trap功能。 trap就是基於snmp的agent,執行在被檢測的伺服器節點上,檢測所需要的服務執行狀態,當某些指標超過所配置的告警指標,就自動想所配置的網管彙報告警資訊。 通常情況下,對於不同的agent,網管中會有獨立的標識,也即是sysObjectId。網管與agent之間也會保持心跳資訊。net-snmp提供了基本的心跳服務。在心跳資訊中,會包含sysObjectId,如果是V3協議,還需要在所有通訊互動的協議頭中包含msgAuthoritativeEngineID、msgAuthoritativeEngineBoots、msgAuthoritativeEngineTime,這些資訊,snmp4j預設是不對外提供的,也就是沒有現成的介面供我們使用(至少目前我沒找到,如果有人找到了,告訴我一下)。 msgAuthoritativeEngineID:是trap的ID,唯一標識一個trap,網管通過該值區分不同的trap。該值可以通過net-snmp的配置檔案中配置,如在snmpd.conf中增加一下配置項: oldEngineID 0x8000bee9043133363134313438383733
oldEngineID為配置項名稱,固定。 0x8000bee9043133363134313438383733的編碼有固定格式,第一個位元組0x80表示協議版本號為V3;00bee9是企業ID號,也就PEN號碼,04表示EngineID的產生方式,04為配置方式,80為隨機生成方式;後面3133363134313438383733為ASCII編碼的數字,對應為13614148873。 msgAuthoritativeEngineBoots:是trap服務啟動的次數,net-snmp自動提供該值,但snmp4j獲取的話,需要特別方式,下面有介紹。 msgAuthoritativeEngineTime:trap本次執行的時間,net-snmp也會自動提供該值。 網管與trap之間通訊,會自動進行協商,並從trap上獲取上述資訊,請看下面的抓包分析:


請求訊息中,msgAuthoritativeEngineID、msgAuthoritativeEngineBoots、msgAuthoritativeEngineTime值都是空的。接下來看伺服器對該請求的返回訊息:

應答訊息中自動攜帶了請求中為空的訊息的值。接下來真正互動時(請求oid:1.3.6.1.2.1.1.2.0),就要攜帶這些引數:

再看伺服器的返回訊息:

伺服器正確的返回了我們所請求的企業ID。 如果我們用snmp4j想伺服器傳送同樣的請求訊息,從抓包分析可以看出,snmp4j後臺也會與伺服器進行同樣的資訊交換,那我們如果基於snmp4j構建自動的trap時,如何在傳送trap訊息時獲取到所需要的這三個資訊呢?如何在trap訊息頭上新增上這樣的資訊呢? 首先,我們先來看看org.snmp4j.security下面的USM類,主要看下processIncomingMsg方法。 該方法就是snmp4j後臺與伺服器互動時,處理從伺服器返回訊息的方法,securityParameters引數就是存放了從伺服器端接收到的訊息,因此,只要我們把該物件拋到外面,我們就可以獲取到伺服器所返回給我們的資訊。 因此,我們需要修改USM類,增加一個變數,儲存securityParameters資訊,並提供一個get方法獲取即可。 如: private UsmSecurityParameters myUsp;


public UsmSecurityParameters getMyUsp() { return myUsp; } 這樣,在用snmp4j向伺服器傳送PDU請求後,只要伺服器返回了訊息,我們就可以從Snmp控制代碼的USM物件中獲取到伺服器返回的資訊。

這樣我們就可以通過snmp4j順利的獲取到伺服器端返回的msgAuthoritativeEngineID、msgAuthoritativeEngineBoots、msgAuthoritativeEngineTime值。 有了上述的引數值,在傳送trap訊息時,就可以新增到snmp訊息協議頭中了。 snmp.getUSM().setEngineDiscoveryEnabled(true); UsmTimeEntry usmTimeEntry = new UsmTimeEntry(engineID,bootTimes,engineTime); snmp.getUSM().getTimeTable().addEntry(usmTimeEntry); engineID,bootTimes,engineTime為從伺服器端獲取到底msgAuthoritativeEngineID、msgAuthoritativeEngineBoots、msgAuthoritativeEngineTime引數對應的值。 通過USM的TimeTable中增加UsmTimeEntry引數,就可以設定msgAuthoritativeEngineID、msgAuthoritativeEngineBoots、msgAuthoritativeEngineTime引數的值。 至此,我們就完成了通過修改snmp4j的原始碼來獲取net-snmp所提供的V3協議互動中所必須的引數,並在傳送trap訊息時,正確設定協議頭中的引數。 有關snmp4j如何傳送V3協議的trap訊息,就不羅嗦了。如果需要,請留言。

相關推薦

linuxsnmp4j獲取net-snmp基本資訊

linux下,net-snmp已經提供了完整的snmp服務和框架,尤其是基本的snmp資訊,如sysObjectId、CPU、記憶體等。通過標準的snmp的oid,可以很容易的從net-snmp所提供的服務中獲取這些資訊。但net-snmp的trap功能需要通過指令碼來配置

linux安裝配置Net-Snmp

一、安裝  系  統:CentOS 6.2(與RedHat Enterprise Linux 6.2操作一樣) [[email protected]]#tar -zxvf net-snmp-5.3.3.tar.gz [[email protecte

LinuxC獲取所有可用網絡卡資訊

在Linux下開發網路程式時,經常會遇到需要取本地網路介面名、IP、廣播地址、子網掩碼或者MAC地址等資訊的需求,最常見的辦法是配合巨集SIOCGIFHWADDR、SIOCGIFADDR、SIOCGIFBRDADDR與SIOCGIFNETMASK作為引數呼叫函式

Linuxioctl獲取介面資訊

一、ifconf和ifreq結構 //ifconf通常是用來儲存所有介面資訊的 //if.h struct ifconf { int ifc_len; /* size of buffer */ union { char *ifcu_buf; /* input fr

linuxC獲取文件的大小

錯誤代碼 返回 system sys string 文件系統 識別碼 連接 chm 獲取文件大小這裏有兩種方法: 方法一、 範例: unsigned long get_file_size(const char *path) { unsigned lo

linux的DHCP服務器基本配置

linuxlinux下的DHCP服務器基本配置:首先進入網卡配置網卡的IP地址,設置相關的網絡信息配置的網卡信息如下:安裝dhcp軟件包查看dhcp軟件包是否已經安裝進入/etc/dhcp/目錄下,編輯dhcp.conf配置文件語法檢測,檢測配置文件中的語法是否存在語法錯誤重啟dhcp服務,並設置服務為開機自

Linuxmemcache編譯安裝與基本使用

清空 .tar.gz 報錯 關閉window eas -- 編譯 url 圖片 memcache是一套分布式的高速緩存系統,特點為key-value 存儲 一、在 linux 編譯安裝memcache、redis等,需要 gcc,make,cmake,autoconf,

Linux程式設計獲取本地IP地址的常見方法

轉載於:http://blog.csdn.net/k346k346/article/details/48231933   在進行linux網路程式設計時,經常用到本機IP地址。本文羅列一下常見方法,以備不時之需。 獲取本機IP地址,是一個相當靈活的操作,原因是網路地址的設定非常靈活而且都是允

Linuxat 和 crontab的基本運用以及臨時檔案基本管理

一、at的基本運用 在終端輸入watch -n 1 ls -R /mnt/           //監控檔案每秒檢視一次並以第歸的方式列出來 使用at命令制定延時任務 

Linuxjava獲取CPU、記憶體、磁碟IO、網路頻寬使用率

原文地址:https://www.cnblogs.com/gisblogs/p/3985393.html 一、CPU 使用proc檔案系統,"proc檔案系統是一個偽檔案系統,它只存在記憶體當中,而不佔用外存空間。它以檔案系統的方式為訪問系統核心資料的操作提供介面。使用者和應用程式可以通過p

如何在Linux系統上獲取命令的幫助資訊,請詳細列出,描述man文件的章節是如何劃分的

由於Linux系統的命令繁多,無論是初學者還是資深人士,很多時候都需要檢視幫助。 1.幫助命令 1)獲取幫助的能力決定了技術的能力 2)多層次的幫助 whatis command --help man and info /usr/share/doc/ Red

OpenCV獲取視訊檔案基本資訊

import cv2 cameraCapture = cv2.VideoCapture('./res/test.mp4') print(cameraCapture.get(cv2.CAP_PROP_POS_MSEC)) print(cameraCapture

Linux檢視作業系統當前登入使用者資訊的四種方法

作為系統開發或維護人員,你可能經常會(在某個時候)需要檢視系統中有哪些使用者正在活動。有些時候,你甚至需要知道他(她)們正在做什麼。本文為我們總結了4種檢視系統使用者資訊(通過編號(ID))的方法。 1. 使用w命令檢視登入使用者正在使用的程序資訊 w命令用於顯示已經登入系統的使用者的名稱,以及他們

Linux部署ASP.NET服務連線oracle遇到的問題記錄

一、如何解除安裝MONO Q:mono是linux系統上跨平臺軟體,解除安裝它有兩種方式: 1、知道mono安裝路徑,安裝原來的路徑直接覆蓋安裝(最為簡單); 2、不知道mono安裝路徑,首先通過sudo find / -name mono命令查詢路徑,  也可進入mono安裝資料夾sudo make

分享在Linux使用OSGi.NET外掛框架快速實現一個分散式服務叢集的方法

在這篇文章我分享瞭如何使用分層與模組化的方法來設計一個分散式服務叢集。這個分散式服務叢集是基於DynamicProxy、WCF和OSGi.NET外掛框架實現的。我將從設計思路、目標和實現三方面來描述。 1 設計思路 首先,我來說明一下設計思路。我們先來看看目前OSGi.NET外掛框架的服務。在這裡,服務不

Python獲取rpm包基本資訊[import rpm]

在進行測試之前,必須先檢查開發的rpm包資料 包括安裝目錄,許可權,檔案結構,是否包含某些檔案等資訊 寫了個指令碼自動化 python的rpm包,在網上資料實在不多,時間倉促,也就簡單看了下 首先,import import rpm 獲取hdr def get_h

Linux啟動Tomcat顯示控制檯日誌資訊

Linux下直接啟動./startup.sh但是檢視不到啟動日誌資訊,通過ps –ef|grep tomcat檢視,實際已經啟動 但是可以通過執行./catalina.sh run啟動

linuxC/C++網路程式設計基本:socket實現tcp和udp的例子

簡單的linux下socket程式設計,分別基於TCP和UDP協議實現的簡單程式 linux下socket程式設計可以概括為以下幾個函式的運用: socket() bind() listen

ftp使用1——Linuxwget獲取ftp目錄檔案

如果某個目錄下有一個檔案可以使用ftp命令: get xxx 如果是某個目錄下有多個檔案(且不需要獲取目錄下子資料夾下的內容): mget * 如果是某個目錄下有子目錄希望獲取所有子目錄: wget -nH -m --ftp-user=myusername--f

linuxC獲取系統時間的方法

asctime(將時間和日期以字串格式表示)   相關函式  time,ctime,gmtime,localtime   表頭檔案  #include<time.h>   定義函式  char * asctime(const struct tm * ti