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 语句?

4

2 回答 2

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,这可能会导致难以发现错误。

于 2012-06-15T21:25:05.910 回答
1

您缺少任何错误处理;正如文档解释的那样,该connect方法引发了 4 个不同的异常。在你的情况下,你击中了socket.error.

当您想忽略任何连接错误并跳到下一个主机时,您可以使用该pass语句忽略这些错误并继续。重要的是,并非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
于 2012-06-15T21:27:17.377 回答