1. 程式人生 > >snmp4j監控伺服器執行情況

snmp4j監控伺服器執行情況

SNMP是英文“Simple Network Management Protocol”的縮寫,中文意思是“簡單網路管理協議”。SNMP是目前最常用的環境管理協議。SNMP被設計成與協議無關,所以它可以在IP,IPX,AppleTalk,OSI以及其他用到的傳輸協議上被使用。SNMP是一系列協議組和規範,它們提供了一種從網路上的裝置中收集網路管理資訊的方法。SNMP也為裝置向網路管理工作站報告問題和錯誤提供了一種方法。
    目前,幾乎所有的網路裝置生產廠家都實現了對SNMP的支援。領導潮流的SNMP是一個從網路上的裝置收集管理資訊的公用通訊協議。裝置的管理者收集這些資訊並記錄在管理資訊庫(MIB)中。這些資訊報告裝置的特性、資料吞吐量、通訊超載和錯誤等。MIB有公共的格式,所以來自多個廠商的SNMP管理工具可以收集MIB資訊,在管理控制檯上呈現給系統管理員。
    SNMP提供了一種統一的、跨平臺的裝置管理辦法。

概念太抽象,先來看一個例子。
我們來做一個最簡單的Snmp操作:獲取一臺機器的機器名,假設其IP是192.168.1.1。
    首先要給192.168.1.1安裝Snmp環境。Window元件的管理監視工具裡包含Snmp,只需要安裝一下就可以了。Snmp預設的通訊埠是161/162,有的系統需要手動設定,這個可以通過建立篩選器列表來實現,具體怎麼設定網上很多,大家可以去搜索一下。另外需要關閉192.168.1.1的防火牆。

接下來需要一個能夠進行Snmp通訊的工具,比較簡單的有snmputil,大家可以去網上下載。
snmputil的命令規則是:
snmputil [get|getnext|walk] agent community oid [oid ...]
[get|getnext|walk]

為訊息型別,我們此次進行的操作是get
agent指Snmp代理即你想進行操作的網路裝置的ip或名稱,即192.168.1.1
community:分割槽域,即密碼,預設是public
oid:想要操作的MIB資料物件號,裝置名稱對應的MIB物件號是.1.3.6.1.2.1.1.5.0

開啟命令列視窗,進入snmputil所在路徑,鍵入
snmputil get 192.168.1.1 public .1.3.6.1.2.1.1.5.0
如果引數都正確,控制檯就會顯示出192.168.1.1的機器名。

不知道現在大家對snmp有沒有一個感性的認識,通過get、set這樣的操作,我們就可以讀取、控制網路裝置了。

接下來學習一下和Snmp有關的基本概念吧

代理和管理站的模型

Snmp分2種角色:SNMP管理站(manager,我們的本機127.0.0.1)和SNMP代理(agent,我們操作的機器,比如192.168.1.1)。代理是實際網路裝置中用來實現SNMP功能的部分。代理在UDP的161埠接收NMS的讀寫請求訊息,管理站在UDP的162埠接收代理的事件通告訊息。所以,一旦獲取裝置的訪問許可權(community,預設為public),就可以訪問裝置資訊、改寫和配置裝置引數。由於採用UDP協議,不需要在代理和管理站之間保持連線。

SNMP的操作命令

SNMP協議之所以易於使用,這是因為它對外提供了三種用於控制MIB物件的基本操作命令。它們是:Get、Set 和 Trap。

Get:管理站讀取代理者處物件的值。它是SNMP協議中使用率最高的一個命令,因為該命令是從網路裝置中獲得管理資訊的基本方式。

Set:管理站設定代理者處物件的值。它是一個特權命令,因為可以通過它來改動裝置的配置或控制裝置的運轉狀態。它可以設定裝置的名稱,關掉一個埠或清除一個地址解析表中的項等。

Trap:代理者主動向管理站通報重要事件。它的功能就是在網路管理系統沒有明確要求的前提下,由管理代理通知網路管理系統有一些特別的情況或問題發生了。如果發生意外情況,客戶會向伺服器的162埠傳送一個訊息,告知伺服器指定的變數值發生了變化。通常由伺服器請求而獲得的資料由伺服器的161埠接收。Trap 訊息可以用來通知管理站線路的故障、連線的終端和恢復、認證失敗等訊息。管理站可相應的作出處理。

SNMP的命令和報文

SNMP協議定義了資料包的格式,及網路管理員和管理代理之間的資訊交換,它還控制著管理代理的MIB資料物件。因此,可用於處理管理代理定義的各種任務。
    一條SNMP報文由三個部分組成:版本域(version field),分割槽域(community field)和SNMP協議資料單元域(SNMP protocol data unit field),資料包的長度不是固定的。
    版本域:這個域用於說明現在使用的是哪個版本的SNMP協議。目前,version 1是使用最廣泛的SNMP協議。
    分割槽域:分割槽(community)是基本的安全機制,用於實現SNMP網路管理員訪問SNMP管理代理時的身份驗證。類似於密碼,預設值為public。分割槽名(Community name)是管理代理的口令,管理員被允許訪問資料物件的前提就是網路管理員知道網路代理的口令。如果把配置管理代理成可以執行Trap命令,當網路管理員用一個錯誤的分割槽名查詢管理代理時,系統就傳送一個autenticationFailure trap報文。

PDU  : 協議資料單元。是SNMP訊息中的資料區, 即Snmp通訊時報文資料的載體。

MIB  : 管理資訊庫

管理資訊資料庫(MIB)是一個資訊儲存庫,它包含了管理代理中的有關配置和效能的資料,有一個組織體系和公共結構,其中包含分屬不同組的許多個數據物件。
    MIB資料物件以一種樹狀分層結構進行組織,這個樹狀結構中的每個分枝都有一個專用的名字和一個數字形式的識別符號。結構樹的分枝實際表示的是資料物件的邏輯分組。而樹葉,有時候也叫節點(node),代表了各個資料物件。在結構樹中使用子樹表示增加的中間分枝和增加的樹葉。
    使用這個樹狀分層結構,MIB瀏覽器能夠以一種方便而且簡潔的方式訪問整個MIB資料庫。MIB瀏覽器是這樣一種工具,它可以遍歷整棵MIB結構樹,通常以圖形顯示的形式來表示各個分枝和樹葉物件。可以通過其數字識別符號來查詢MIB中的資料物件,這個數字識別符號號從結構樹的頂部(或根部)開始,直到各個葉子節點(即資料物件)為止。這種訪問方式和檔案系統的組織方式一致。兩者的主要區別在於檔案系統中的路徑名可以以絕對也可以以相對方式表示,而MIB資料物件只能以絕對方式表示,不能使用相對方式。
    每一個節點都有一個物件識別符號(OID)來唯一的標識,每個節點用數字和字元兩種方式顯示,其中物件識別符號OID是由句點隔開的一組整數,也就是從根節點通向它的路徑。一個帶標號節點可以擁有包含其它帶標號節點為它的子樹,如果沒有子樹它就是葉子節點,它包含一個值並被稱為物件。比如網路裝置名的oid是.1.3.6.1.2.1.1.5.0,其值為裝置名稱的字串。
    網路資源被抽象為物件進行管理。但SNMP中的物件是表示被管資源某一方面的資料變數。物件被標準化為跨系統的類,物件的集合被組織為管理資訊庫(MIB)。MIB作為設在代理者處的管理站訪問點的集合,管理站通過讀取MIB中物件的值來進行網路監控。管理站可以在代理者處產生動作,也可以通過修改變數值改變代理者處的配置。

以上就是一些Snmp最基本概念了,更深入的應用下次講!

java使用例子

接下來直接貼程式碼:

import java.io.IOException;

import java.util.Vector;

import org.snmp4j.CommunityTarget;

import org.snmp4j.PDU;

import org.snmp4j.Snmp;

import org.snmp4j.TransportMapping;

import org.snmp4j.event.ResponseEvent;

import org.snmp4j.mp.SnmpConstants;

import org.snmp4j.smi.Address;

import org.snmp4j.smi.GenericAddress;

import org.snmp4j.smi.OID;

import org.snmp4j.smi.OctetString;

import org.snmp4j.smi.VariableBinding;

import org.snmp4j.transport.DefaultUdpTransportMapping;

publicclass SnmpUtil {

private Snmp snmp = null;

private Address targetAddress = null;

publicvoid initComm() throws IOException {

// Agent方的IP和埠

targetAddress = GenericAddress.parse("udp:127.0.0.1/161");

TransportMapping transport = new DefaultUdpTransportMapping();

snmp = new Snmp(transport);

transport.listen();

}

publicvoid sendPDU() throws IOException {

// target

CommunityTarget target = new CommunityTarget();

target.setCommunity(new OctetString("public"));

target.setAddress(targetAddress);

// 通訊不成功的重次數

target.setRetries(2);

// 時時間

target.setTimeout(1500);

target.setVersion(SnmpConstants.version1);

// PDU

PDU pdu = new PDU();

pdu.add(new VariableBinding(new OID(newint[] { 1, 3, 6, 1, 2, 1, 1, 5, 0 })));

// MIB訪問方式

pdu.setType(PDU.GET);

// AgentPDU,並接收Response

ResponseEvent respEvnt = snmp.send(pdu, target);

// 解析Response

if (respEvnt != null && respEvnt.getResponse() != null) {

Vector<VariableBinding> recVBs = respEvnt.getResponse()

.getVariableBindings();

for (int i = 0; i < recVBs.size(); i++) {

VariableBinding recVB = recVBs.elementAt(i);

System.out.println(recVB.getOid() + " : " + recVB.getVariable());

}

}

}

publicstaticvoid main(String[] args) {

try {

SnmpUtil util = new SnmpUtil();

util.initComm();

util.sendPDU();

} catch (IOException e) {

e.printStackTrace();

}

}

}


上面的這段程式碼直接參考snmp4j API說明文件中提供的例子,是一個最簡單的snmp4j的應用。只要你的機器裡安裝了snmp通訊元件,上面的程式碼應該可以執行成功。

在上一個例子中,我們只做了讀取的工作,接下來,我們進行一下設定操作,通過Snmp修改讀取的機器名。
    public的預設許可權是隻讀,要想進行寫操作,我們必須進行手動的設定。具體的做法是:進入管理工具→服務,找到Snmp Service→屬性→安全。在這個選項卡中我們可以看到public的許可權是隻讀,你可以修改public的許可權,也可以重新建立一個community。從安全形度來講當然應該新建一個,在這裡為了測試方便,我就直接給public新增寫入許可權了。
    接下來就可以編寫程式碼了,我把上面的例子重構一下,程式碼如下:

import java.io.IOException;

import java.util.Vector;

import org.snmp4j.CommunityTarget;

import org.snmp4j.PDU;

import org.snmp4j.Snmp;

import org.snmp4j.TransportMapping;

import org.snmp4j.event.ResponseEvent;

import org.snmp4j.mp.SnmpConstants;

import org.snmp4j.smi.Address;

import org.snmp4j.smi.GenericAddress;

import org.snmp4j.smi.OID;

import org.snmp4j.smi.OctetString;

import org.snmp4j.smi.VariableBinding;

import org.snmp4j.transport.DefaultUdpTransportMapping;

publicclass SnmpUtil {

private Snmp snmp = null;

private Address targetAddress = null;

publicvoid initComm() throws IOException {

// Agent方的IP和埠

targetAddress = GenericAddress.parse("udp:127.0.0.1/161");

TransportMapping transport = new DefaultUdpTransportMapping();

snmp = new Snmp(transport);

transport.listen();

}

public ResponseEvent sendPDU(PDU pdu) throws IOException {

// target

CommunityTarget target = new CommunityTarget();

target.setCommunity(new OctetString("public"));

target.setAddress(targetAddress);

// 通訊不成功的重次數

target.setRetries(2);

// 時時間

target.setTimeout(1500);

target.setVersion(SnmpConstants.version1);

// AgentPDU,並返回Response

returnsnmp.send(pdu, target);

}

publicvoid setPDU() throws IOException {

// set PDU

PDU pdu = new PDU();

pdu.add(new VariableBinding(new OID(newint[] { 1, 3, 6, 1, 2, 1, 1, 5, 0 }), new OctetString("SNMPTEST")));

pdu.setType(PDU.SET);

sendPDU(pdu);

}

publicvoid getPDU() throws IOException {

// get PDU

PDU pdu = new PDU();

pdu.add(new VariableBinding(new OID(newint[] { 1, 3, 6, 1, 2, 1, 1, 5, 0 })));

pdu.setType(PDU.GET);

readResponse(sendPDU(pdu));

}

publicvoid readResponse(ResponseEvent respEvnt) {

// 解析Response

if (respEvnt != null && respEvnt.getResponse() != null) {

Vector<VariableBinding> recVBs = respEvnt.getResponse()

.getVariableBindings();

for (int i = 0; i < recVBs.size(); i++) {

VariableBinding recVB = recVBs.elementAt(i);

System.out.println(recVB.getOid() + " : " + recVB.getVariable());

}

}

}

publicstaticvoid main(String[] args) {

try {

SnmpUtil util = new SnmpUtil();

util.initComm();

util.setPDU();

util.getPDU();

} catch (IOException e) {

e.printStackTrace();

}

}

}

如果控制檯打出“1.3.6.1.2.1.1.5.0 : SNMPTEST”的訊息,就說明我們的操作成功啦!

以上程式碼在WindowsXP下測試成功。

相關推薦

snmp4j監控伺服器執行情況

SNMP是英文“Simple Network Management Protocol”的縮寫,中文意思是“簡單網路管理協議”。SNMP是目前最常用的環境管理協議。SNMP被設計成與協議無關,所以它可以在IP,IPX,AppleTalk,OSI以及其他用到的傳輸協議上被使用。S

使用SNMP監控伺服器執行情況

系統監測的基本概念及分類:a.系統監測的概述:如何對現有IT架構的整體以及細節執行情況進行科學、系統和高效地監測是目前各企業運維和管理部門一項非常重要的工作內容。隨著當前企業IT環境中伺服器、應用數量和型別的不斷地增加,運維部門需要通過科學和高效的手段儘可能詳細、實時和準確地

Linux crontab的使用方式,sh指令碼的編寫,sh指令碼自動啟動tomcat伺服器,sh監控系統執行情況

1、如果想使用Linux crontab(類似java quartz),需要先啟動crontab.關於crontab的啟動、關閉、重啟、重新載入配置的方式如下: /sbin/service crond start //啟動服務 /sbin/service crond s

使用JProfiler監控JBoss執行情況

JProfiler 是一個著名的用於 java 系統監控分析的軟體,功能很強大,可以監控普通的 java application, applet, java web start, application server 等等。除了可以監控本地的程式,還可以對遠端伺服器上跑的應用

使用Spring定時任務並且通過AOP監控任務執行情況

本文講的是通過Spring註解的方式實現任務排程。只要引入了spring-context包就能夠在專案中使用註解方式的任務排程。 下面看具體配置 需要在Spring配置檔案中加入task的schema。 <xmlns:task="http://www.sprin

應用Druid監控SQL語句的執行情況

itl log .net pan href 轉載 執行 net sql 轉載:1、應用Druid監控SQL語句的執行情況 2、http://blog.csdn.net/wind520/article/details/9202555 應用Druid監控SQ

通過Spark Rest 服務監控Spark任務執行情況

com 理想 ask cin *** lib add pan etime 1、Rest服務   Spark源為了方便用戶對任務做監控,從1.4版本啟用Rest服務,用戶可以通過訪問地址,得到application的運行狀態。   Spark的REST API返回的信息是JS

遠端執行命令,監控伺服器

http://a.scwy.net/blog/doc/177 通過ssh,遠端監控伺服器,獲取伺服器資訊。這裡主要是作一下記錄,怕忘。 for ((c=1;;i++)); do sshpass -p 1234567 ssh [email protected] "uptime

egg 伺服器叢集情況下的定時任務執行操作(2種方式)

第一種做法不是很好 但是可以花很少成本解決定時器多臺伺服器執行的一些問題 disable:該引數為 false時,定時任務會被啟動。 這樣的話多臺機器上面都會執行,相當於增加了一個開關當執行到改機器主機名和配置主機名相同時 執行定時任務。(如果服務是部署在doc

監控伺服器磁碟使用情況

1、檢視伺服器磁碟使用情況   df -h :檢視系統掛載的目錄以及檔案系統   du -sh :檢視資料夾的大小   df: ‘/run/user/1000/gvfs’: Permission denied:為linux系統的bug可以忽略 2、監控指令碼

Jstatd方式遠端監控Linux下 JVM執行情況

 最近一個專案部署在伺服器上執行時出現了問題,經過排查發現是java記憶體溢位的問題,所以為了實時監控伺服器java記憶體的情況,需要遠端檢視伺服器上JVM記憶體的一些情況。另外伺服器系統是CentOS 7 最小安裝,沒有圖形化介面,不能採用vnc遠端。所以只能通過Visua

mysql的遠端監控,可以知道mysql的執行情況

在網上找了好多自動化檢測mysql的工具,但是大多要執行在php環境下,在就難為情了,因為公司的環境是apach和tomcat有不好意思安裝一個php所以就先找了個用著,發現還不錯。 軟體名:Spotlight 可以在本地檢視伺服器mysql的執行,如果是linux伺服器可

將shell指令碼執行情況寫入Rsyslog日誌伺服器

在運維工作中,免不了編寫一些指令碼交由計劃任務(cron)去定時執行完成一些日常工作,實現運維工作自動化。比如在我的日常工作中備份資料是一項重要的工作,需要定時將資料備份到備份服器和一些其他的備份介質中。其中大部分的備份工作都是寫到腳本當中,並編輯/etc/cr

Tomcat記憶體監控 JConsole / JProfiler 監控遠端linux tomcat執行情況的配置

步驟如下: 1.編輯tomcat/bin/catalina.sh Bash程式碼  vi catalina.sh     在其中“ # ----- Execute The Requested Command -----------------------------------------”

jconsole監控遠端linux tomcat執行情況的配置 (轉)

步驟如下: 1.編輯tomcat/bin/catalina.sh Bash程式碼  vi catalina.sh     在其中“ # ----- Execute The Requested Command ----------------------------------

Apache 伺服器執行一段時間後本地無法通過外網訪問的情況問題解決描述(轉)

轉自:http://www.52codes.net/article/338.html 最近從虛擬主機轉到了VPS之後自由了許多,但是也多了不少問題。在弄好了MySQL之後Apache又出了問題,具體表現是網站每過一定時間就無法開啟,靜態頁面也無法訪問。重啟Apache後

【Linux運維入門】Jstatd方式遠端監控Linux下 JVM執行情況

前言 最近一個專案部署在伺服器上執行時出現了問題,經過排查發現是java記憶體溢位的問題,所以為了實時監控伺服器java記憶體的情況,需要遠端檢視伺服器上JVM記憶體的一些情況。另外伺服器系統是Cen

【Linux運維入門】JMX方式遠端監控Linux下JVM執行情況

這篇部落格以JBoss伺服器為例,介紹JMX以方式如何配置,以遠端連線伺服器,檢視JVM執行情況。其他伺服器如Tomcat等類似。 執行環境 1. 伺服器:CentOS 7(最小化安裝) i

win10下通過jconsole監控遠端centos tomcat執行情況

最近在阿里雲上的執行的BS系統過一段時間就down機。突然想到在pc上經常用到jconsole和jvisualvm監控專案的執行情況。 今天先配置jconsole的遠端監控。 1、伺服器系統centos6.5 64位、jdk1.8.0_65、tomcat-7.0.65。 2

workerman怎樣統計框架裏的函數執行情況

bst php文件 init trap nbsp ini 不同 pan vendor 不同的框架,略有不同。首先,在index.php文件中,需要加入。 // 加載vendor,統計服務、RPC Client等. require __DIR__ . ‘/../vendor