2014-01-20 35 views
1

如果我的列表中的主机不响应ssh,脚本就会死亡。我希望它继续下去我的名单,并告诉我"Error Connecting to X.X.X.X"。这样做的最好方法是什么?我在想,Exception应该用在哪里,但我不知道在哪里或如何。python脚本可以继续发生错误吗?

我知道这个错误只是简单地说:“我很期待的东西在属性‘child.sendline(CMD)’,但没有收到”基于现有代码

[-] Error Connecting to 10.26.0.1 
Traceback (most recent call last): 
    File "asaos-snmpv3-tool.py", line 179, in <module> 
    main() 
    File "asaos-snmpv3-tool.py", line 160, in main 
    send_command(child, SNMPGROUPCMD + group + V3PRIVCMD) 
    File "asaos-snmpv3-tool.py", line 48, in send_command 
child.sendline(cmd) 
AttributeError: 'NoneType' object has no attribute 'sendline' 


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 to ' + host 
     return 
    if ret == 1: 
     child.sendline('yes') 
     ret = child.expect([pexpect.TIMEOUT, '[P|p]assword:']) 
     if ret == 0: 
      print '[-] Could not accept new key from ' + host 
      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('--host --host_file --username --password--enable --group --snmp_user --snmp_host\ 
    --snmp_contact --int_name --snmp_v3_auth --snmp_v3_hmac --snmp_v3_priv --snmp_v3_encr') 
    parser.add_argument('--host_file', dest='hosts', type=file, help='specify a target host file') 

hosts = args.hosts 

if hosts: 
    for line in hosts: 
     host = line.rstrip() 
     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, SNMPSRVCONTACTCMD + snmpcontact) 
     send_command(child, SNMPSRVENTRAP) 
     send_command(child, WRME) 


if __name__ == '__main__': 
    main() 
+5

总是一个很好的阅读http://docs.python.org/2/tutorial/errors.html – greole

+0

你应该把你的“for-in”块的insidings放在try-except块中。并赞扬阅读文档。 – Xardas

+0

将读取错误文档greole,谢谢! –

回答

1

:你已经有这个机制,如果连接无法连接返回None,所以:

if hosts: 
    for line in hosts: 
     host = line.rstrip() 
     child = connect(user, host, passwd, en_passwd) 
     if child: 
      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, SNMPSRVCONTACTCMD + snmpcontact) 
      send_command(child, SNMPSRVENTRAP) 
      send_command(child, WRME) 

如果你真的想使异常的使用,你需要让你的连接功能提高一个失败时,取看看评论中的链接。