解决paramiko获取远程脚本延时返回数据的问题

Posted 爱吃橘子的司徒弘和

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决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获取远程脚本延时返回数据的问题的主要内容,如果未能解决你的问题,请参考以下文章

paramiko的简单使用(ssh远程执行脚本和上传文件)

从 Paramiko SSH exec_command 连续获取输出

python远程连接脚本

python3使用paramiko操作远程机器

使用paramiko执行远程linux主机命令

当按下 Ctrl+C 时,优雅地中止从 Windows Python Paramiko 脚本通过 SSH 执行的远程 Windows 命令