2012-04-20 7 views
5

पहचान नहीं कर सकते मैं निम्नलिखित सरल स्क्रिप्ट का उपयोग कर रहा हूँ:PySNMP प्रतिक्रिया

from pysnmp.entity.rfc3413.oneliner import cmdgen 

errorIndication, errorStatus, errorIndex, \ 
varBindTable = cmdgen.CommandGenerator().bulkCmd(
      cmdgen.CommunityData('test-agent', 'public'), 
      cmdgen.UdpTransportTarget(('IP.IP.IP.IP', 161)), 
      0, 
      1, 
      (1,3,6,1,2,1,4,24,4,1,2,169,254) 
     ) 

if errorIndication: 
    print errorIndication 
else: 
    if errorStatus: 
     print '%s at %s\n' % (
      errorStatus.prettyPrint(), 
      errorIndex and varBindTable[-1][int(errorIndex)-1] or '?' 
      ) 
    else: 
     for varBindTableRow in varBindTable: 
      for name, val in varBindTableRow: 
       print '%s = %s' % (name.prettyPrint(), val.prettyPrint()) 

इस डिवाइस रिटर्न की उम्मीद परिणाम के लिए कमांड लाइन से snmpwalk का उपयोग करना। लेकिन स्क्रिप्ट रिटर्न टाइमआउट से पहले कोई एसएनएमपी प्रतिक्रिया प्राप्त नहीं हुई। अगर मैं इस ओआईडी को छोड़ देता हूं तो सब कुछ ठीक काम करता है। तो समस्या यह OID में है

यहाँ tcpdump आंकड़े:

/usr/sbin/tcpdump -nn -vv -s0 -A host HOST and udp 

tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 

12:15:31.494920 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto: UDP (17), length: 77) IP.IP.IP.IP.47911 > IP.IP.IP.IP.161: [bad udp cksum 4b7d!] { SNMPv2c { GetBulk(34) R=8993731 N=0 M=1 .1.3.6.1.2.1.4.24.4.1.2.169.254 } } 
[email protected]@.I..]<..]</.'...9.S0/.....public."....;.......0.0...+..........).~.. 

12:15:31.495666 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto: UDP (17), length: 98) IP.IP.IP.IP.161 > IP.IP.IP.IP.47911: [udp sum ok] { SNMPv2c { GetResponse(55) R=8993731 .1.3.6.1.2.1.4.24.4.1.2.169.254.0.0.0.0.255.255.0.0.0.0.0=[inetaddr len!=4]0.0.255.255.0.0.0.0 } } 
[email protected]@.I..]</.]<....'.N.\0D.....public.7....;.......0)0'..+..........)[email protected] 

12:15:32.500226 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto: UDP (17), length: 77) IP.IP.IP.IP.47911 > IP.IP.IP.IP.161: [bad udp cksum 4b7d!] { SNMPv2c { GetBulk(34) R=8993731 N=0 M=1 .1.3.6.1.2.1.4.24.4.1.2.169.254 } } 
[email protected]@.I..]<..]</.'...9.S0/.....public."....;.......0.0...+..........).~.. 

12:15:32.500624 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto: UDP (17), length: 98) IP.IP.IP.IP.161 > IP.IP.IP.IP.47911: [udp sum ok] { SNMPv2c { GetResponse(55) R=8993731 .1.3.6.1.2.1.4.24.4.1.2.169.254.0.0.0.0.255.255.0.0.0.0.0=[inetaddr len!=4]0.0.255.255.0.0.0.0 } } 
[email protected]@.I..]</.]<....'.N.\0D.....public.7....;.......0)0'..+..........)[email protected] 

हम देख सकते हैं, इस उपकरण रिटर्न प्रतिक्रिया .1.3.6.1.2.1.4.24.4.1.2.169.254.0.0.0.0.255.255.0.0.0.0.0=[inetaddr len!=4]0.0.255.255.0.0.0.0, लेकिन कुछ नहीं होता और pysnmp बस बार-बार इस OID का मूल्य की कोशिश करने के लिए जारी .. snmpwalk इस प्रतिक्रिया को IP ADDRESS 0.0.255.255

क्या आप लोग मेरी मदद कर सकते हैं? अग्रिम धन्यवाद और मेरी अंग्रेजी खेद है।

उत्तर

4

आपका एसएनएमपी एजेंट टूटा एसएनएमपी संदेश उत्पन्न करता प्रतीत होता है। जबकि आईपीवी 4 पता चार-ऑक्टेट लंबा है, आपका एजेंट आठ-ऑक्टेट्स मूल्य की रिपोर्ट करता है।

एसएनएमपी आरएफसी के अनुसार, pysnmp खराब एसएनएमपी संदेशों को छोड़ देता है और सही प्रतिक्रिया प्राप्त करने के लिए कुछ बार मूल अनुरोध को पुनः प्राप्त करता है।

विशेष रूप से विकृत आईपी पते मूल्यों के साथ काम कर आप क्रम में अपने IPADDRESS वर्ग पैच सकता है यह एक संभवतः अब प्रारंभकर्ता से सिर्फ चार प्रमुख ओक्टेट्स लेने बनाने के लिए pysnmp करने के लिए:

>>> def ipAddressPrettyIn(self, value): 
... return origIpAddressPrettyIn(self, value[:4]) 
... 
>>> origIpAddressPrettyIn = v2c.IpAddress.prettyIn 
>>> v2c.IpAddress.prettyIn = ipAddressPrettyIn 
>>> 
>>> msg, rest = decoder.decode(wholeMsg, asn1Spec=v2c.Message()) 
>>> print msg.prettyPrint() 
Message: 
version='version-2' 
community=public 
data=PDUs: 
response=ResponsePDU: 
    request-id=6564368 
    error-status='noError' 
    error-index=0 
    variable-bindings=VarBindList: 
    VarBind: 
    name=1.3.6.1.2.1.4.24.4.1.2.169.254.0.0.0.0.255.255.0.0.0.0.0 
    =_BindValue: 
    value=ObjectSyntax: 
     application-wide=ApplicationSyntax: 
     ipAddress-value=0.0.255.255 
+0

आप फिर से धन्यवाद :) –

संबंधित मुद्दे