天天看點

linux net-snmp agent manager windows snmp

這段時間一直在弄snmp相關的東西,網上的資料有用的很少,在這說下自己遇到的問題避免很多人都走回彎路。

snmp分為manager管理端(一般為一台主機),和agent代理端(一般為一些運作SNMP的裝置);對應到net-snmp為client 和 server端(agent對應server)。

windows下snmp測試驗證最好使用MG-SOFT Mib Browser 9破解版,有可能會遇到相容性問題,右鍵相容性疑難解答就可以了,這個軟體使用可以參考: http://pan.baidu.com/share/link?shareid=3554272301&uk=389306673&fid=4210277839

windows本機需要開啟SNMP Service,在服務中屬性

linux net-snmp agent manager windows snmp
linux net-snmp agent manager windows snmp
linux net-snmp agent manager windows snmp
linux net-snmp agent manager windows snmp

其中安全頁h3c代表通路這台機器的密碼,很多預設是public,如無加密需求改成public即可。 當你通路很多裝置時,很有可能不是snmpget ... public,而是這台裝置對應的加密字元。

windows下也可以使用snmputil.exe這個工具來驗證。

重點說下linux下net-snmp,我用的是ubuntu12.04系統,這裡安裝的是net-snmp-5.5.1。

首先按這個網址安裝http://blog.csdn.net/yinjiabin/article/details/7564241第一步;之後參考 http://wenku.baidu.com/link?url=Z94_Up5dMA9kaH85zDt1iyJ46A-_nlYxQCzRjeBkts3vRd_9yRdiOIeeT0LMRSgdxiR9zDyXAWLwRQGvo4t78IMqfeV6TJ1oRfo6536ijnK;其中第6步snmpd.conf參考 http://www.linuxidc.com/Linux/2012-12/76837.htm,其中忽略第5步。

如果是manager開發可以參考下這兩個網址:http://net-snmp.sourceforge.net/tutorial/tutorial-5/toolkit/asyncapp/asyncapp.c  和 http://zhubangbing.blog.163.com/blog/static/526092702011728102831294/  都是可以編譯的,  我參照這兩個也封裝了一下snmpget和snmpset函數可以參考下

#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;
}
           

agent裝置可以參考: http://blog.csdn.net/shanzhizi/article/details/11769491  http://blog.csdn.net/zhulinfeiba/article/details/4202935

遇到了問題可以到它的官網去搜尋下關鍵字http://net-snmp.sourceforge.net/tutorial/tutorial-5/toolkit/ ,我是沒測試成功...

我的隻是manager部分,agent部分不涉及,祝你好運