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

Using paramiko to check if an SSH can be done

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

但是,我想看看如果我在测试中移除其中一根以太网电缆会发生什么。这会导致程序崩溃,显示 "socket operation was attempted to an unreachable host"。我希望能够避免这个错误。有没有办法检查连接是否可行,这样我就不会崩溃?理想情况下,我希望代码跳过不良连接并继续处理下一根电缆。这是使用的代码片段:

    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: 您可以在尝试连接之前抢先检查该地址的主机是否处于活动状态。将 ssh 连接代码包装在 if 语句中,以 os.system("ping -c 1 " + target_host[i]) is 0 作为条件将允许您跳过死机上的连接。

选项 2: 另一种方法是先尝试然后处理失败。如果将 ssh.connect(...)ssh.close() 的所有内容都包装在监视 paramiko.ssh_exception.NoValidConnectionsError 的 try-except 块中,您可以根据需要处理失败的连接并继续执行该程序。这方面的一个例子:

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