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

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

选项 2:
另一种方法是先尝试,然后处理失败。如果你包装所有来自 ssh.connect(...)ssh.close()在监视 paramiko.ssh_exception.NoValidConnectionsError 的 try-except block 中,您可以随心所欲地处理失败的连接并继续执行该程序。一个例子:

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

关于python - 使用 paramiko 检查 SSH 是否可以完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48589963/

相关文章:

linux - 是否可以将文件从本地 windows 目录复制到远程 linux 目录?

java - 如何使用java查找SSH RSA key 的 key 长度

python 参数

python - Selenium Chrome 每隔一段时间就挂一次

ubuntu - 从 OpenLayer 3 获取 Geoserver 获取 '500 (Internal Server Error)'

ubuntu 18.04 LTS/usr/lib/fresh install 中的 python 目录

git - 为什么 GitHub 推荐 HTTPS 而不是 SSH?

Python - 更优雅地清除终端屏幕

python - 如何访问(和修改)python 类层次结构中的任意项

ubuntu - (Ubuntu 10.04) 安装 php5 时如何摆脱安装 apache2?