zoukankan      html  css  js  c++  java
  • 解决paramiko获取远程脚本延时返回数据的问题

    最近写一个tcp连接测试的脚本,用到了paramiko模块,遇到了一些让自己非常头疼的问题,在此记录。

    常规的paramiko初始化和连接等操作网上已经有很多文章,不再赘述,下面主要说明自己遇到的问题和解决方法。

    需求:从跳板机连接机器池,任意一台做启server,任选数十台启client,client不停向server发送包,测试连接是否中断

    问题1:因为client端需要不断向server传送数据,paramiko执行的命令没有终止,所以直接用stdout和stderr的read() 方法读不到脚本的返回值(read()方法只能读取已经执行完毕的命令的结果)

      解决方法:用stdout(stderr)的readline() 方法,可以逐行读取脚本返回值(建议多读paramiko官方文档):

    问题2:用readline()可以读取stderr和stdout的实时打印值,但是因为脚本的执行可能有出现stderr,也有正常的stdout,当你监测的buffer file没有值得时候,线程会阻塞,会一直等待监测的buffer file,直到有值为止,而一般情况是,这条线程不会执行其他程序,永久阻塞了

      解决方法:将脚本中的error错误通过try...except...转化成正常输出,当监测到错误后重新执行循环,重新执行脚本核心部分;print时最好加上flush,增加方法2和3有不同

      其他的解决思路:可以再起两个线程,一个监测stderr,一个监测stdout

    补充:获取paramiko exec_command(cmd)执行命令的状态

           当通过ssh_client连接到远端服务器后,需要调用exec_command() 来执行远端命令,执行会返回三个FIle Descriptor(文件描述符):

                   stdin,stdout,stderr = ssh.exec_command(cmd) 

    运行cmd的返回值(或者pytho脚本等的print值)会被写入stdout,执行cmd的错误信息会写入stderr,我们通过FD的方法read()或者readline()等等(可见官方文档http://docs.paramiko.org/en/2.4/api/file.html)读取命令的返回值,另外一种表示,如果cmd是非延时的,可以通过channel = stdout.channel ===>status = channel.recv_exit_status()获取cmd命令的状态码

  • 相关阅读:
    C#学习之委托和事件
    ArcGIS许可启动问题
    空间插值——克里金插值
    maven 问题解决 tools以及jconsole两个jar包 无效
    JDBC代码示例
    mysql 同一IP 产生太多终端的数据库连接导致阻塞
    apache 反向代理配置
    oracle、mysql、sql server等;流行数据库的链接驱动配置
    POI XSSF与HSSF的 使用区别
    使用IDEA开发Activiti工作流
  • 原文地址:https://www.cnblogs.com/liushi-Oscar/p/8252534.html
Copyright © 2011-2022 走看看