首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用paramiko检查是否可以完成SSH

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

Stack Overflow用户
提问于 2018-02-02 19:53:22
回答 1查看 5K关注 0票数 2

我试图在路由器的所有端口上进行一个自动以太网带宽测试。我的设置涉及从1连接到路由器的Windows连接到带有7个连接的Linux PC。我正在使用Paramiko模块在Linux中使用SSH启动以太网测试,这很好。

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

代码语言:javascript
复制
    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()    
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-02 20:02:36

避免这一错误的最简单的方法是不去做导致它的事情--拉电缆。但是,您似乎希望能够在您的程序中处理这个问题,下面是一些选项!(我假设这个片段驻留在基于主机列表的某种循环中。)

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

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

代码语言:javascript
复制
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异常的更多信息,请看这里:exception.html

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48589963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档