2012-06-15 48 views
0

我使用Paramiko嘗試通過主機列表進行爬網。代碼將一直運行,直到列表中的一臺主機不可用。它會產生這個錯誤。在某些不存在的情況下通過主機列表爬行

File "remote.py", line 12, in <module> 
    ssh.connect(i, username='user', password='pass') 
    File "/usr/local/lib/python2.7/dist-packages/paramiko/client.py", line 296, in connect 
    sock.connect(addr) 
    File "/usr/lib/python2.7/socket.py", line 224, in meth 
    return getattr(self._sock,name)(*args) 
    socket.error: [Errno 113] No route to host 

我的代碼:

#!/usr/bin/python 
import paramiko 

host = ['cpu1','cpu2','cpu3'] 

ssh = paramiko.SSHClient() 
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 

for i in host: 
    str(i) 
    ssh.connect(i, username='user', password='pass') 
    stdin, stdout, stderr = ssh.exec_command('w') 
    print stdout.readlines() 
    ssh.close() 

我想腳本運行通過並執行命令。如果它無法連接到主機,則跳過並轉到下一個。我是否缺少一個帶有一些Paramiko參數的if語句?

回答

3

你可以嘗試捕捉異常,處理並可能繼續,如果你願意的話。

import paramiko 

host = ['cpu1','cpu2','cpu3'] 

ssh = paramiko.SSHClient() 
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 

for i in host: 
    str(i) 
    try: 
     ssh.connect(i, username='user', password='pass') 
     stdin, stdout, stderr = ssh.exec_command('w') 
     print stdout.readlines() 
     ssh.close() 
    except Exception as ex: 
     print "Excetion: %s" % str(ex) 

總是能夠正確處理使用pass例外不要一味逃避他們,這可能會導致很難找到的bug。

+0

只要_any_異常發生的次數少於傳遞單個命名異常時的「盲」,如何將某些內容打印到stdout? – Ben

+0

因爲它會以某種方式被記錄下來,所以你可以覆蓋sys.stdout,使其成爲一個文件,或者你可以將輸出傳送到一個文件,然後你可以解析該文件,只是盲目地通過''pass'感覺非常危險,因爲它們程序員沒有辦法檢測到它。 –

1

您錯過了任何錯誤處理;因爲documentation explainsconnect方法引發4個不同的例外。在你的情況下,你點擊socket.error

由於您想忽略任何連接錯誤並跳到下一個主機,您可以使用pass statement忽略這些錯誤並繼續。不是pass每個例外只是那些你想要的。

import paramiko 

hosts = ['cpu1','cpu2','cpu3'] 

ssh = paramiko.SSHClient() 
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 

for i in hosts: 

    try:  
     ssh.connect(i, username='user', password='pass') 
     stdin, stdout, stderr = ssh.exec_command('w') 
     print stdout.readlines() 
     ssh.close() 
    except socket.error as e: 
     pass 
相關問題