【问题标题】:Using paramiko to check if an SSH can be done使用 paramiko 检查 SSH 是否可以完成
【发布时间】:2018-07-13 09:13:39
【问题描述】:

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

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

    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()    

【问题讨论】:

    标签: python ubuntu ssh paramiko iperf


    【解决方案1】:

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

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

    选项 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

    【讨论】:

    • 感谢您的快速回复我想我必须尝试选项 2。我已经在代码的早期部分中执行了选项 1,但这并不能很好地工作。如果我拔下 linux 机器上的 7 个连接之一,即使我指定了差异 IP 地址,它仍然会通过其他行之​​一传递 ping 响应。
    • 另一个棘手的事情是我需要跟踪的是 linux 机器上的路由表。因此,如果一个通道不起作用,我还需要能够将 eth# 端口之一设置为关闭,以便我可以绕过坏通道并相应地 ping/iperf/我会尝试尝试命令
    • 这很有趣。每个接口都有自己的IP,对吧?你是通过IP ping,而不是通过主机名?如果您 p​​ing 一个无法访问的 IP,它应该会失败...
    • Linux 电脑上有 7 个以太网端口,它们都有自己的 IP。稍后我可能需要对此进行更深入的研究,但我认为尝试和例外可能会奏效
    • 酷。如果是这样,请接受答案,以便人们知道它有效,并且您也可以获得一些免费代表!
    猜你喜欢
    • 2015-04-02
    • 2023-04-05
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多