Python 当某些主机不';不存在

Python 当某些主机不';不存在,python,ssh,paramiko,Python,Ssh,Paramiko,我正在使用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 soc

我正在使用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

我想让脚本运行并执行命令。如果无法连接到主机,请跳过并转到下一个。我是否缺少带有一些Paramiko参数的if语句?

您可以尝试捕获异常、处理,如果愿意,还可以继续

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

您可以尝试捕获异常,处理,如果您愿意,还可以继续

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

您缺少任何错误处理;由于
connect
方法引发了4种不同的异常。在您的情况下,您点击了
套接字。错误

如果要忽略任何连接错误并跳到下一台主机,可以使用忽略这些错误并继续。重要的是不要
只传递你想传递的异常

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

您缺少任何错误处理;由于
connect
方法引发了4种不同的异常。在您的情况下,您点击了
套接字。错误

如果要忽略任何连接错误并跳到下一台主机,可以使用忽略这些错误并继续。重要的是不要
只传递你想传递的异常

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

当任何异常发生时,如何将某些内容打印到标准输出,而不是传递单个命名的异常?因为它将以某种方式记录,所以您可以覆盖sys.stdout使其成为一个文件,或者您可以将输出传输到一个文件,然后您可以解析该文件,如果只是盲目地
传递
感觉非常危险,因为程序员根本无法检测到它。当任何异常发生时,如何在stdout上打印内容比传递单个命名的异常更少“盲目”呢?因为它将以某种方式被记录,您可以覆盖sys.stdout,使其成为一个文件,或者您可以通过管道将输出传输到一个文件,然后您可以解析该文件,尽管如此,盲目地传递感觉非常危险,因为程序员根本无法检测到它。