当我使用--host=1192.168.1.1作为参数时,这个脚本就像一个魅力。当我使用--host_file=asa.hosts时,它会失败,因为它似乎与"if hfile is True:"不匹配。所以这显然是错误的。与我的--host_file=NAME.TXT 相匹配的更好术语是什么
这是我的错误
Traceback (most recent call last):
File "asaos-snmpv3-tool-hostfile.py", line 147, in <module>
main()
File "asaos-snmpv3-tool-hostfile.py", line 138, in main
child = connect(user, host, passwd, en_passwd)
File "asaos-snmpv3-tool-hostfile.py", line 47, in connect
constr = 'ssh ' + user + '@' + host
TypeError: cannot concatenate 'str' and 'NoneType' objects
如果它失败了,我本以为它会使用"child=连接(user,主机,passwd,en_passwd)"出错如果你仔细观察,你会发现在我的"If"下,我使用连接和主机(复数),但它似乎试图解析主连接和主机下的文件。
def connect(user, host, passwd, en_passwd):
...output cut short
def connects(user, hosts, passwd, en_passwd):
...output cut short
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='hfile', type=str, help='specify a target host file')
host = args.host
hfile = args.hfile
hosts = open(hfile, 'r')
for line in hosts.readlines():
if hfile is True:
hosts = line.strip('r').strip('n')
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)
exit()
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)
exit()
非常感谢您的帮助!
首先,您的hfile
要么是字符串,要么是None
。这两个CCD_ 3。这两者都不是== True
。
一根非空的绳子是真的。None
不是。两者都不是非空字符串。因此,如果您想将空字符串(例如--host-file=''
)视为无参数,只需测试hfile
的真实性:
if hfile:
另一方面,如果您想将空字符串视为有效的参数,请测试None
-ness:
if hfile is not None:
--host
没有这个问题的原因很简单:你没有在任何地方测试host
,所以没有地方可以出错。
但是,也许您应该为None
测试host
。我不确定在这种情况下你到底想做什么,但你肯定不想用None
来调用connect(user, host, passwd, en_passwd)
作为host
。这就是为什么会出现异常,因为库试图将所有这些字符串连接在一起,而其中一个字符串不是字符串。
如果它失败了,我本以为它会使用"child=connects(user,hosts,passwd,en_passwd)"出错。如果你仔细观察,你会在我的"If"下看到我使用connects和hosts(复数),但它看起来像是在试图解析主连接和主机下的文件。
但是您的if
从不触发,所以您在该块中做什么并不重要。另一方面,connect
总是运行,所以这就是失败的原因。
最后,您的逻辑从一开始就没有意义。
您将浏览hosts
文件。对于每一行,请选中hfile
。如果它是真的,你将做一个单一的连接,然后exit
。如果它不是真的,它永远不会变成truthy
,所以你也会跳过所有其他行。所以,你不可能处理第一行以外的任何一行。
此外,在该循环中,用每一行替换hosts
。
此外,你正在剥离r
而不是r
,并且在n
之前剥离它,这意味着即使你做对了,也永远不会有任何东西可以剥离。
最后,您得到了main
定义之后的所有顶级代码,并尝试使用main
的局部变量,甚至从未调用main
。我怀疑你可能混合了制表符和空格,所以最后粘贴在这里的内容与你原始脚本中的内容不匹配;如果是这样的话,如果你幸运的话(得到了IndentationError
),几乎可以保证会导致难以调试的问题,如果你不幸运的话,几乎不可能(只是流控制错误)。找到一个文本编辑器,它可以自动将选项卡转换为空格和/或以视觉方式显示选项卡(除了Notepad和TextEdit之外,几乎任何东西都可以…),并使用is True
0标志测试脚本,以防它滑过编辑器。
不管怎样,也许你想要这样的东西,但我真的只是在猜测。
错误是由user
或host
参数导致的,connect
变为None
。
我看不出你在哪里设置了user
。
看起来connect
的host
自变量来自args.host
。如果您没有给它一个--host
参数,那么它的值将是默认的None
。
当使用argparse
调试代码时,我经常使用print args
来确保它按预期解析输入。