2011-12-22 61 views
10

Cách lấy giá trị mac và vlan từ bảng fdb sử dụng python?
Trong bash làm việc tốt snmpwalk: Làm cách nào để lấy dữ liệu từ SNMP bằng python?

snmpwalk -v2c -c pub 192.168.0.100 1.3.6.1.2.1.17.7.1.2.2.1.2 

pysnmp:

import os, sys 
import socket 
import random 
from struct import pack, unpack 
from datetime import datetime as dt 

from pysnmp.entity.rfc3413.oneliner import cmdgen 
from pysnmp.proto.rfc1902 import Integer, IpAddress, OctetString 

ip='192.168.0.100' 
community='pub' 
value=(1,3,6,1,2,1,17,7,1,2,2,1,2) 

generator = cmdgen.CommandGenerator() 
comm_data = cmdgen.CommunityData('server', community, 1) # 1 means version SNMP v2c 
transport = cmdgen.UdpTransportTarget((ip, 161)) 

real_fun = getattr(generator, 'getCmd') 
res = (errorIndication, errorStatus, errorIndex, varBinds)\ 
    = real_fun(comm_data, transport, value) 

if not errorIndication is None or errorStatus is True: 
     print "Error: %s %s %s %s" % res 
else: 
     print "%s" % varBinds 

đầu ra: [(ObjectName (1.3.6.1.2.1.17.7.1.2.2.1.2), NoSuchInstance (''))]

import netsnmp 

def getmac(): 
    oid = netsnmp.VarList(netsnmp.Varbind('.1.3.6.1.2.1.17.7.1.2.2.1.2')) 
    res = netsnmp.snmpgetbulk(oid, Version = 2, DestHost='192.168.0.100', 
          Community='pub') 
    return res 

print getmac() 

đầu ra: ('27', '27', '25', '27', '27', '27', '24', '27', '25', '18', '4', '27', '25', '27', '27', '25', '27', '27', '27', '27', '27', '27', '27', ' 27 ',' 27 ',' 27 ',' 27 ',' 27 ',' 27 ',' 27 ',' 27 ',' 27 ',' 23 ', ' 25 ',' 27 ', '27 ',' 27 ',' 25 ',' 27 ',' 25 ',' 27 ',' 27 ',' 25 ',' 27 ', ' 27 ',' 27 ',' 27 ',' 27 ' , '27', '27', '27', '27', '25', '27', '27', '27', '27', '27', '27', '27', '27', '27', '27', '27', '27', '25', '25', '25', '7', '27', '27', '9', ' 25 ',' 27 ',' 20 ',' 19 ',' 27 ',' 27 ', ' 27 ',' 27 ',' 27 ',' 27 ',' 27 ',' 27 ', '27 ',' 27 ',' 27 ',' 27 ',' 27 ', ' 27 ',' 11 ',' 25 ',' 27 ',' 27 ',' 27 ',' 27 ',' 27 ' , '27', '27', '27', '27', '27', '27', '27', '27', '27', '25', '27', '27', '27', '2 7 ', ' 27 ',' 27 ',' 27 ',' 27 ',' 27 ',' 2 ',' 27 ',' 5 ',' 27 ',' 0 ',' 27 ', '27 ', ' 27 ',' 27 ',' 27 ')

Firs script (pysnmp) return NoSuchInstance. Kịch bản lệnh thứ hai (netsnmp) trả về danh sách các cổng nhưng không có mac và vlan. Có gì sai?

Trả lời

8

Trong ví dụ về pysnmp bạn đang thực hiện SNMPGET (snmpget), không phải là GETNEXT (snmpwalk). Nếu bạn thay đổi,

real_fun = getattr(generator, 'getCmd') 

để

real_fun = getattr(generator, 'nextCmd') 

bạn sẽ bắt đầu thấy kết quả hữu ích.

Đối với sự khác biệt bạn thấy trong kết quả giữa snmpwalk và kết quả python net-snmp kết buộc: snmpwalksnmpbulkget hoạt động khác nhau. Nếu bạn thực hiện một số snmpbulkget từ dòng lệnh có cùng các tùy chọn như snmpwalk, bạn sẽ nhận được kết quả tương tự như ví dụ python net-snmp của mình.

Nếu bạn cập nhật các dòng sau trong ví dụ python net-snmp của bạn,

res = netsnmp.snmpgetbulk(oid, Version=2, DestHost='192.168.0.100', 
          Community='pub') 

để

res = netsnmp.snmpwalk(oid, Version=2, DestHost='192.168.0.100', 
         Community='pub') 

thì bây giờ bạn sẽ nhận được cùng một danh sách các kết quả từ ví dụ python net-snmp như bạn thấy khi bạn thực hiện một số snmpwalk trên dòng lệnh.

Các vấn đề liên quan