linux net-snmp agent manager windows snmp
阿新 • • 發佈:2019-02-17
這段時間一直在弄snmp相關的東西,網上的資料有用的很少,在這說下自己遇到的問題避免很多人都走回彎路。
snmp分為manager管理端(一般為一臺主機),和agent代理端(一般為一些執行SNMP的裝置);對應到net-snmp為client 和 server端(agent對應server)。
windows本機需要開啟SNMP Service,在服務中屬性
其中安全頁h3c代表訪問這臺機器的密碼,很多預設是public,如無加密需求改成public即可。 當你訪問很多裝置時,很有可能不是snmpget ... public,而是這臺裝置對應的加密字元。
windows下也可以使用snmputil.exe這個工具來驗證。
重點說下linux下net-snmp,我用的是ubuntu12.04系統,這裡安裝的是net-snmp-5.5.1。
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include <iostream>
using namespace std;
#ifdef HAVE_WINSOCK_H
#include <winsock.h>
#endif
int netsnmp_get(char *vision, char *community, char *ip, char *oid_name, netsnmp_variable_list **vars)
{
SOCK_STARTUP;
init_snmp("asynchapp");
struct snmp_session ss, *sp;
struct oid1 *op;
snmp_sess_init(&ss);
if("1" == vision)
ss.version = SNMP_VERSION_1;
else if("2c" == vision)
ss.version = SNMP_VERSION_2c;
else if("3" == vision)
ss.version = SNMP_VERSION_3;
ss.peername = strdup(ip);
ss.community = (u_char *)(community);
ss.community_len = strlen(community);
if(!(sp = snmp_open(&ss)))
{
std::cout << "snmp_open ip : " << ip << " oid :" << oid_name << " failed\n";
snmp_perror("snmp_open failed\n");
SOCK_CLEANUP;
return STAT_ERROR;
}
oid Oid[MAX_OID_LEN];
int OidLen = MAX_OID_LEN;
if(!read_objid(oid_name, Oid, (size_t *)&OidLen))
{
std::cout << "read_objid ip : " << ip << " oid :" << oid_name << " failed\n";;
snmp_perror("read_objid failed\n");
snmp_close(sp);
SOCK_CLEANUP;
return STAT_ERROR;
}
else
{
struct snmp_pdu *req, *resp;
int status;
req = snmp_pdu_create(SNMP_MSG_GET);
snmp_add_null_var(req, Oid, (size_t)OidLen);
status = snmp_synch_response(sp, req, &resp);
*vars = resp->variables;
snmp_free_pdu(resp);
snmp_close(sp);
switch (status) {
case STAT_SUCCESS:
if(resp->errstat == SNMP_ERR_NOERROR){}
else
{
std::cout << "Error in packet\nReason: " << snmp_errstring(resp->errstat) << "\n";
}
break;
case STAT_TIMEOUT:
std::cout << "Timeout: No Response from " << sp->peername << "\n";
break;
case STAT_ERROR:
std::cout << "snmpget Error from " << sp->peername << "\n";
snmp_perror(sp->peername);
break;
}
SOCK_CLEANUP;
return status;
}
}
int netsnmp_set(char *vision, char *community, char *ip, char *oid_name, char type, char *value)
{
SOCK_STARTUP;
init_snmp("asynchapp");
struct snmp_session ss, *sp;
struct oid1 *op;
snmp_sess_init(&ss);
if("1" == vision)
ss.version = SNMP_VERSION_1;
else if("2c" == vision)
ss.version = SNMP_VERSION_2c;
else if("3" == vision)
ss.version = SNMP_VERSION_3;
ss.peername = strdup(ip);
ss.community = (u_char *)(community);
ss.community_len = strlen(community);
if(!(sp = snmp_open(&ss)))
{
std::cout << "snmp_open ip : " << ip << " oid :" << oid_name << " failed\n";
snmp_perror("snmp_open failed\n");
SOCK_CLEANUP;
return STAT_ERROR;
}
oid Oid[MAX_OID_LEN];
int OidLen = MAX_OID_LEN;
if(!read_objid(oid_name, Oid, (size_t *)&OidLen))
{
std::cout << "read_objid ip : " << ip << " oid :" << oid_name << " failed\n";;
snmp_perror("read_objid failed\n");
snmp_close(sp);
SOCK_CLEANUP;
return STAT_ERROR;
}
else
{
struct snmp_pdu *req, *resp;
int status;
req = snmp_pdu_create(SNMP_MSG_SET);
snmp_add_var(req, Oid, (size_t)OidLen, type, value);
status = snmp_synch_response(sp, req, &resp);
snmp_free_pdu(resp);
snmp_close(sp);
switch (status) {
case STAT_SUCCESS:
if(resp->errstat == SNMP_ERR_NOERROR){}
else
{
std::cout << "Error in packet\nReason: " << snmp_errstring(resp->errstat) << "\n";
}
break;
case STAT_TIMEOUT:
std::cout << "Timeout: No Response from " << sp->peername << "\n";
break;
case STAT_ERROR:
std::cout << "snmpset Error from " << sp->peername << "\n";
snmp_perror(sp->peername);
break;
}
SOCK_CLEANUP;
return status;
}
}
int main(int argc, char **argv)
{
netsnmp_variable_list *vars;
char buf[1024];
if(netsnmp_get("2c", "public", "192.168.1.50", "1.3.6.1.4.1", &vars) == STAT_SUCCESS)
{
while(vars)
{
snprint_variable(buf, sizeof(buf), vars->name, vars->name_length, vars);
std::cout << buf << std::endl;
vars = vars->next_variable;
}
}
netsnmp_set("2c", "public", "192.168.1.50", "1.3.6.1.4.1", 'i', "6");
if(netsnmp_get("2c", "public", "192.168.1.50", "1.3.6.1.4.1", &vars) == STAT_SUCCESS)
{
while(vars)
{
snprint_variable(buf, sizeof(buf), vars->name, vars->name_length, vars);
std::cout << buf << std::endl;
vars = vars->next_variable;
}
}
return 0;
}
我的只是manager部分,agent部分不涉及,祝你好運