当我使用--host = 192.168.1.1作为参数时,此脚本就像一个魅力。当我使用--host_file = asa.hosts时,它会失败,因为它似乎与“if hfile为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 = 连接(用户,主机,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()
非常感谢您的帮助!
答案 0 :(得分:1)
首先,您的hfile
要么是字符串,要么是None
。这些都不是is True
。这些都不是== True
。
非空字符串是真的。 None
不是。两者都不是非空字符串。因此,如果您想将空字符串(例如--host-file=''
)视为与无参数相同,则只需测试hfile
的真实性:
if hfile:
另一方面,如果您想将空字符串视为有效参数,请测试None
- ness:
if hfile is not None:
--host
没有这个问题的原因很简单:你没有在任何地方测试host
,所以没有地方可以测试错误。
但是,也许应该为host
测试None
。在这种情况下,我不确定你真正想做什么,但你绝对不希望connect(user, host, passwd, en_passwd)
用None
来host
。这就是你得到异常的原因,因为库试图将所有这些字符串连接在一起,其中一个字符串不是字符串。
如果它失败了,我会用“child = connected(user,hosts,passwd,en_passwd)”来预期它会出错。如果你仔细观察,你会看到我在“if”下使用连接和主机(复数),但看起来它试图解析主连接和主机下的文件。
但是你的if
永远不会触发,所以你在那个街区做什么并不重要。另一方面,connect
始终运行,因此失败了。
最后,你的逻辑首先没有任何意义。
您浏览hosts
文件。对于每一行,请检查hfile
。如果它真的很简单,你将进行一次连接,然后exit
。如果它不是真的,它永远不会变成truthy
,所以你也会跳过所有其他行。所以,你无法处理超越第一行的任何行。
此外,在该循环内,您将每行替换为hosts
。
此外,您正在剥离r
而不是\r
,并且您在 \n
之前剥离,这意味着永远不会有任何内容即使你做对了也要剥离。
最后,您已经获得main
定义之后的所有顶级代码,并尝试使用main
的局部变量,甚至从不调用main
。我怀疑你可能正在混合制表符和空格,所以最终粘贴在这里的内容与原始脚本中的内容不符;如果是这样的话,几乎可以肯定会导致难以调试的问题,如果你很幸运(并得到一个IndentationError
)而且几乎不可能,如果你不是(并且只是有错误的流量控制)。找到一个文本编辑器,可以自动将标签转换为空格和/或直观地显示标签(几乎除了Notepad和TextEdit之外的所有内容......),并使用-tt
标志测试您的脚本,以防它滑过编辑器。< / p>
无论如何,也许你想要像this这样的东西,但我真的只是在这里猜测。
答案 1 :(得分:0)
错误导致user
的{{1}}或host
个参数为connect
。
我看不到您设置None
的位置。
user
的{{1}}参数似乎来自host
。如果您没有给它connect
参数,则该值将是默认值args.host
。
使用--host
调试代码时,我经常None
只是为了确保它按照我的预期解析输入。