使用paramiko检查是否可以完成SSH

时间:2018-02-02 19:53:22

标签: python ubuntu ssh paramiko iperf

我正在尝试在路由器的所有端口上进行自动以太网带宽测试。我的设置涉及从具有1个连接的Windows PC到路由器连接到具有7个连接的Linux PC。我正在使用Paramiko模块通过SSH连接到Linux PC来启动以太网测试,该测试工作正常。

但是,我想看看如果我在测试中移除了以太网电缆会发生什么。这会导致程序崩溃,说“尝试对无法访问的主机执行套接字操作”。我希望能够避免这个错误。有没有办法检查连接是否可能,以便我不会崩溃?理想情况下,我希望代码跳过错误的连接并继续下一个电缆。以下是使用代码的片段:

    ssh.connect( hostname = target_host[i] , username = un, password = pwd )
    stdin, stdout, stderr = ssh.exec_command('iperf -c 192.168.0.98')
    t_read=stdout.read()
    read[i]=t_read[360:375]
    raw_speed[i]=t_read[360:364]
    address[i]=t_read[221:233]
    print('Receieved data on cable %s from %s via IP: %s at %s \n'%(Cable[i],WMI_Port[i],address[i],read[i]))
    stdin, stdout, stderr = ssh.exec_command('sudo ifconfig %s down'%(target_eth[i]))
    print ('Disabling %s : \n\n'%(WMI_Port[i]))
    ssh.close()    

1 个答案:

答案 0 :(得分:0)

避免此错误的最简单方法是不要做导致它的原因 - 拉动电缆。但是,您似乎希望能够在您的程序中处理它,所以这里有一些选项! (我假设此代码段基于主机列表驻留在某种循环中。)

选项1: 在尝试连接之前,您可以抢先检查该地址的主机是否处于活动状态。将{s}连接代码包含在if语句中并以os.system("ping -c 1 " + target_host[i]) is 0作为条件将允许您跳过死宿主上的连接。

选项2: 另一种方法是首先尝试并处理失败。如果您在查看ssh.connect(...)的try-except块中包装从ssh.close()paramiko.ssh_exception.NoValidConnectionsError的所有内容,则可以按照您的喜好处理失败的连接并继续执行该程序。一个例子:

for i in len(target_host):
    try:
        ssh.connect( hostname = target_host[i] , username = un, password = pwd )
        stdin, stdout, stderr = ssh.exec_command('iperf -c 192.168.0.98')
        t_read=stdout.read()
        read[i]=t_read[360:375]
        raw_speed[i]=t_read[360:364]
        address[i]=t_read[221:233]
        print('Receieved data on cable %s from %s via IP: %s at %s \n'%(Cable[i],WMI_Port[i],address[i],read[i]))
        stdin, stdout, stderr = ssh.exec_command('sudo ifconfig %s down'%(target_eth[i]))
        print ('Disabling %s : \n\n'%(WMI_Port[i]))
        ssh.close()    
    except paramiko.ssh_exception.NoValidConnectionsError as error:
        print("Failed to connect to host '%s' with error: %s" % (target_host[i], error))

该异常可能与您转储时无关,因此请将其替换为之前获得的异常。将处理程序与预期异常匹配越接近越好。太宽泛的处理程序可以吞噬您需要查看的异常,从而导致无声失败。

有关Paramiko例外的更多信息,请查看此处:http://docs.paramiko.org/en/2.4/api/ssh_exception.html

有关在Python 3中处理异常的信息: https://docs.python.org/3/tutorial/errors.html