運維少年系列 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()
運行一下(動圖)
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.
啦~
這裏如何做異常處理我就不多說了吧!大家可以參照上面的自己驗證一下。
拓撲說明
拓撲圖
說明
我會在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
運行效果(動圖)
微信公衆號:運維少年