我正在编写一个充当 snmp pass_persist 处理程序的小脚本。我希望它读取一个文件(称为“数字”,现在在同一个目录中),它只包含一些整数并将这些作为 oid 树返回。
我已经坚持了几天了,现在我意识到这是由于对 snmpd 工作原理的根本误解。我正在使用 snmpd.conf 手册页,它没有提到处理“get”和“getnext”请求的方式有任何区别,但我假设有一个。我一辈子都无法让 snmpwalk 使用这个脚本。
对 snmp 有更多了解的人可以看一下这段代码吗?我已经看过其他几个版本的 pass 脚本,包括一些在 python 中的版本,但我无法通过查看代码看到它们如何以与我的代码不同的方式处理协议。我看到了一个处理空白命令( '' )的实现,但其他显然没有。
基本上,我在这一点上很困惑!- 调试 snmpd 也非常困难,因为它是调用我的脚本的那个,而不是我。我正在记录我所能记录的内容,并在前台运行 snmpd,但除此之外,这有点“黑匣子”。
任何人都可以解释一下吗?
即:数字文件:
101 102 103 我想返回为: .1.3.6.1.4.1..[剪辑]..1 = 101 .1.3.6.1.4.1..[剪辑]..2 = 102 .1.3.6.1.4.1..[剪辑]..3 = 103
我的脚本(我不担心返回整数以外的任何内容,而且我知道永远无法关闭文件,但这让我感觉更好):
#!/bin/python -u
import os,sys, syslog
def getLine():
return sys.stdin.readline().strip()
def getFileLine(sub_oid, lines):
sub_oid = int(sub_oid)
if sub_oid >= len(lines):
return 'NONE'
else:
return lines[sub_oid]
def printOutput(oid, var_type, varbind_value):
if varbind_value == 'NONE':
print 'NONE'
else:
print oid
print var_type
print varbind_value
######################################################
sub_oid = 0
FH = open('numbers','r')
lines = FH.readlines()
while True:
command = getLine()
syslog.syslog("command: %s" % command)
if command == 'PING':
syslog.syslog('got a ping')
print 'PONG'
elif command == 'get':
given_oid = getLine()
sub_oid = int(given_oid.split('.')[-1])
varbind_value = getFileLine(sub_oid, lines)
printOutput(given_oid, 'integer', varbind_value.strip())
elif command == 'getnext':
given_oid = getLine()
syslog.syslog("got a requested oid of: %s" % given_oid)
sub_oid = int(given_oid.split('.')[-1])
varbind_value = getFileLine(sub_oid, lines)
printOutput(given_oid, 'integer', varbind_value.strip())
else:
syslog.syslog("Unknown command: %s" % command)
FH.close()