美文网首页
运维少年系列 python and cisco (3)

运维少年系列 python and cisco (3)

作者: 运维少年 | 来源:发表于2019-06-09 17:32 被阅读0次

    运维少年系列 python and cisco (3)

    异常处理

    什么是异常处理?

    异常处理通常来说是对程序在执行时(非编译时)出现的各种报错进行处理,如果没有异常处理,那么在程序出错的时候,整个程序会立即退出,而做了异常处理之后,程序会根据异常定义的方式进行错误处理。

    通俗来讲:如果没有异常处理,那程序出错的时候就GG了

    系列文章常见的异常

    这个系列的文章常见的异常有哪些呢?

    • 连接失败

    连接失败的原因有很多种,比如网络不通啦、端口没开啦...

    连接失败抛出的异常如下

    [root@yunwei cisco]# python ywsn_p_c_lab3.py 
    Traceback (most recent call last):
      File "ywsn_p_c_lab3.py", line 9, in <module>
        s.connect(ip,username=user,password=passwd,look_for_keys=False,allow_agent=False)
      File "/usr/lib/python2.7/site-packages/paramiko/client.py", line 362, in connect
        raise NoValidConnectionsError(errors)
    paramiko.ssh_exception.NoValidConnectionsError: [Errno None] Unable to connect to port 22 on 192.168.200.2
    [root@yunwei cisco]# 
    

    做异常处理的时候,我们需要关注的是什么呢?就是异常抛出的代码,比如这里的paramiko.ssh_exception.NoValidConnectionsError

    如何做异常处理?在python中异常处理使用try:... expect...,如

    import paramiko
    import time
    user = 'yunwsn'
    passwd = '123456'
    s = paramiko.SSHClient()
    s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    IP = file('IP.txt','rb')
    
    for ip in IP.xreadlines():
        try:  # 异常处理以下内容
            s.connect(ip,username=user,password=passwd,look_for_keys=False,allow_agent=False)  # 如果这里出现异常,那么直接到execpt代码块中去了,不会打印下面的成功
            print '[ \033[0;32m success\033[0m ] login %s ' %ip
    
        except paramiko.ssh_exception.NoValidConnectionsError:
            print '[ \033[0;32m failed \033[0m ] Unable to connect to %s ' % ip
            
    
    IP.close()
    

    运行一下(动图)

    image
    • socket超时

    异常如下,有时候由于网络质量不好或者IP不存在,导致socket连接超时(任何连接都是基于socket的),出现以下异常

    Traceback (most recent call last):
      File "ywsn_p_c_lab3.py", line 11, in <module>
        s.connect(ip,username=user,password=passwd,look_for_keys=False,allow_agent=False)
      File "/usr/lib/python2.7/site-packages/paramiko/client.py", line 343, in connect
        retry_on_signal(lambda: sock.connect(addr))
      File "/usr/lib/python2.7/site-packages/paramiko/util.py", line 280, in retry_on_signal
        return function()
      File "/usr/lib/python2.7/site-packages/paramiko/client.py", line 343, in <lambda>
        retry_on_signal(lambda: sock.connect(addr))
      File "/usr/lib64/python2.7/socket.py", line 224, in meth
        return getattr(self._sock,name)(*args)
    socket.error: [Errno 110] Connection timed out
    

    这里抛出的异常代码就是socket.error,可以看到这个是socket模块的报错,如果我们要处理这种异常的话,那么需要导入socket模块才可以。

    • 认证失败

    由于我们在这个系列文章中使用的是ssh的办法,所以会有验证的过程,所以验证失败也是常见的一种异常方式。

    来看一下认证失败抛出的异常

      File "ywsn_p_c_lab3.py", line 11, in <module>
        s.connect(ip,username=user,password='123',look_for_keys=False,allow_agent=False)
      File "/usr/lib/python2.7/site-packages/paramiko/client.py", line 437, in connect
        passphrase,
      File "/usr/lib/python2.7/site-packages/paramiko/client.py", line 749, in _auth
        raise saved_exception
    paramiko.ssh_exception.AuthenticationException: Authentication failed.
    

    那么这里的异常代码是什么呢?肯定是paramiko.ssh_exception.AuthenticationException: Authentication failed.啦~

    这里如何做异常处理我就不多说了吧!大家可以参照上面的自己验证一下。

    拓扑说明

    • 拓扑图
    image
    • 说明

    我会在IP.txt中写入4个IP,两个在拓扑图中,一个另两个不在,实现网络不通、超时、验证失败、一切ok着三种情况。

    实现代码

    这里为了方便大家看,我就把所有的异常分开了,其实放在一起也是可以的。以下对新代码进行注释,其余代码注释可以查看前两篇文章。

    import paramiko
    import socket  # 导入socket模块
    import time 
    user = 'yunwsn'
    passwd = '123456'
    s = paramiko.SSHClient()
    s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    IP = file('IP.txt','rb')
    
    for ip in IP.xreadlines():
        try:  # 异常处理
            s.connect(ip,username=user,password=passwd,timeout=5,look_for_keys=False,allow_agent=False)
            print '[ \033[0;32m success\033[0m ] login %s ' %ip
            cmd = s.invoke_shell()
            cmd.send('show ip int bri \n  ')
            time.sleep(0.1)
            output = cmd.recv(65535)
            print output
            cmd.close()
        except paramiko.ssh_exception.NoValidConnectionsError: # 网络/端口不通异常
            print '[ \033[0;31m failed \033[0m ] Unable to connect to %s ' % ip
        except socket.error,err:  # 超时异常,err代表异常代码之后的提示
            print '[ \033[0;31m failed \033[0m ] %s to %s' %(err,ip)
        except paramiko.ssh_exception.AuthenticationException: # 验证失败的异常
            print '[ \033[0;31m failed \033[0m ] Authentication failed on %s' % ip
            
    IP.close()
    
    • IP.txt
    192.168.108.252
    192.168.108.253
    192.168.108.254
    192.168.108.251
    
    • 运行效果(动图)
    image

    微信公众号:运维少年

    相关文章

      网友评论

          本文标题:运维少年系列 python and cisco (3)

          本文链接:https://www.haomeiwen.com/subject/zmpnxctx.html