【发布时间】:2014-01-15 00:29:24
【问题描述】:
我收到缓冲区错误,但我在第 123 行的“with open()”块中有一个行缓冲区。这是缓冲区的正确位置吗?我是否应该在连接类中也/而不是有一些东西,或者可能是解析器参数。
我正在尝试使用带有地址或主机名的文件,并使用“--host_file”参数在多个 ASA 上运行 SNMP 命令。它使用“--host”参数就可以了。
我们将不胜感激。
Traceback (most recent call last):
File "asaos-snmpv3-tool.py", line 145, in <module>
main()
File "asaos-snmpv3-tool.py", line 124, in main
with open(hosts, mode='r', buffering=-1):
TypeError: coercing to Unicode: need string or buffer, file found
import pexpect
import argparse
PROMPT = ['# ', '>>> ', '>', '\$ ']
SNMPGROUPCMD = ' snmp-server group '
V3PRIVCMD = ' v3 priv '
SNMPSRVUSRCMD = ' snmp-server user '
V3AUTHCMD = ' v3 auth '
PRIVCMD = ' priv '
SNMPSRVHOSTCMD = ' snmp-server host '
VERSION3CMD = ' version 3 '
SHAHMACCMD = ' sha '
SNMPSRVENTRAP = ' snmp-server enable traps all '
WRME = ' write memory '
def send_command(child, cmd):
child.sendline(cmd)
child.expect(PROMPT)
print child.before
def connect(user, host, passwd, en_passwd):
ssh_newkey = 'Are you sure you want to continue connecting?'
constr = 'ssh ' + user + '@' + host
child = pexpect.spawn(constr)
ret = child.expect([pexpect.TIMEOUT, ssh_newkey, '[P|p]assword:'])
if ret == 0:
print '[-] Error Connecting'
return
if ret == 1:
child.sendline('yes')
ret = child.expect([pexpect.TIMEOUT, '[P|p]assword:'])
if ret == 0:
print '[-] Error Connecting'
return
child.sendline(passwd)
child.expect(PROMPT)
child.sendline('enable')
child.sendline(en_passwd)
child.expect(PROMPT)
child.sendline('config t')
child.expect(PROMPT)
return child
def connects(user, hosts, passwd, en_passwd):
ssh_newkey = 'Are you sure you want to continue connecting?'
constr = 'ssh ' + user + '@' + hosts
child = pexpect.spawn(constr)
ret = child.expect([pexpect.TIMEOUT, ssh_newkey, '[P|p]assword:'])
if ret == 0:
print '[-] Error Connecting'
return
if ret == 1:
child.sendline('yes')
ret = child.expect([pexpect.TIMEOUT, '[P|p]assword:'])
if ret == 0:
print '[-] Error Connecting'
return
child.sendline(passwd)
child.expect(PROMPT)
child.sendline('enable')
child.sendline(en_passwd)
child.expect(PROMPT)
child.sendline('config t')
child.expect(PROMPT)
return child
def main():
parser = argparse.ArgumentParser('usage %prog ' + '--host --host_file --username --password--enable --group --snmp_user --snmp_host --int_name --snmp_v3_auth --snmp_v3_hmac --snmp_v3_priv --snmp_v3_encr')
parser.add_argument('--host', dest='host', type=str, help='specify a target host')
parser.add_argument('--host_file', dest='hosts', type=file, help='specify a target host file')
parser.add_argument('--username', dest='user', type=str, help='specify a user name')
parser.add_argument('--password', dest='passwd', type=str, help='specify a passwd')
parser.add_argument('--enable', dest='en_passwd', type=str, help='specify an enable passwd')
parser.add_argument('--group', dest='group', type=str, help='specify an snmp group')
parser.add_argument('--snmp_user', dest='snmpuser', type=str, help='specify an snmp user')
parser.add_argument('--snmp_host', dest='snmphost', type=str, help='specify an snmp server host')
parser.add_argument('--int_name', dest='intname', type=str, help='specify interface name')
parser.add_argument('--snmp_v3_auth', dest='snmpauth', type=str, help='specify the snmp user authentication')
parser.add_argument('--snmp_v3_hmac', dest='snmphmac', type=str, help='set snmp HMAC, md5 or sha')
parser.add_argument('--snmp_v3_priv', dest='snmppriv', type=str, help='specify the snmp priv password')
parser.add_argument('--snmp_v3_encr', dest='snmpencrypt', type=str, help='specify encryption, des, 3des, or aes(128/192/256)')
args = parser.parse_args()
host = args.host
hosts = args.hosts
user = args.user
passwd = args.passwd
en_passwd = args.en_passwd
group = args.group
snmpuser = args.snmpuser
snmphost = args.snmphost
intname = args.intname
snmpauth = args.snmpauth
snmppriv = args.snmppriv
snmpencrypt = args.snmpencrypt
if hosts:
with open(hosts, mode='r', buffering=1):
for line in hosts:
hosts = line.rstrip
child = connects(user, hosts, passwd, en_passwd)
send_command(child, SNMPGROUPCMD + group + V3PRIVCMD)
send_command(child, SNMPSRVUSRCMD + snmpuser + ' ' + group + V3AUTHCMD + SHAHMACCMD + snmpauth + PRIVCMD + snmpencrypt + ' ' + snmppriv)
send_command(child, SNMPSRVHOSTCMD + intname + ' ' + snmphost + VERSION3CMD + snmpuser)
send_command(child, SNMPSRVENTRAP)
send_command(child, WRME)
elif host:
child = connect(user, host, passwd, en_passwd)
send_command(child, SNMPGROUPCMD + group + V3PRIVCMD)
send_command(child, SNMPSRVUSRCMD + snmpuser + ' ' + group + V3AUTHCMD + SHAHMACCMD + snmpauth + PRIVCMD + snmpencrypt + ' ' + snmppriv)
send_command(child, SNMPSRVHOSTCMD + intname + ' ' + snmphost + VERSION3CMD + snmpuser)
send_command(child, SNMPSRVENTRAP)
send_command(child, WRME)
else:
print ('Specify either --host or --host_file or I have nothing to do')
if __name__ == '__main__':
main()
【问题讨论】:
-
哪一行?请显示完整的回溯和相关功能。
-
Traceback(最近一次调用最后):文件“asaos-snmpv3-tool.py”,第 145 行,在
main() 文件“asaos-snmpv3-tool.py”,第 124 行, 在 main with open(hosts, mode='r', buffering=-1): TypeError: coercing to Unicode: need string or buffer, file found -
另外,在你的所有问题中,你一直说所有其他部分都工作正常,但这绝不是真的。例如,如果我用
--host=a.b.c运行它,我会得到一个TypeError来连接str和None(因为你将--user设为可选,默认值为None,但随后盲目地将它连接成一个字符串)。请不要再假装每个新错误都是您的代码唯一的错误。 -
或者,最好不要发布整个程序;发布Minimal, Complete, Valid Example,说明您遇到的问题,并且没有任何不相关的内容。
-
最后一件事:不要在
hosts和host_file案例之间以及connect和connects函数之间复制和粘贴所有代码,而是重构事物,因此您只需要写一次。例如,如所写,connect和connects之间的唯一区别是第二个参数的名称和使用该参数的一行代码。所以他们做同样的事情。这是故意的吗?如果是这样,为什么有两个不同的功能?如果没有,您将如何记住它们是如何应该与那一堆乱七八糟的copypasta不同的?