Python Paramiko stdout 多进程 阻塞 卡住 问题解决

news2024/11/28 20:40:40

使用paramiko进程远程操作时,如果缓冲区满了,exec_command在写入该缓冲区时会产生阻塞并一直保持阻塞状态,直到缓冲区被清空为止。

使用multiprocessing无疑会加重这种情况,其中一种解决办法是设置exec_command的get_pty参数为True:

def ssh_command(cmd, ip, port, user, passwd, out):
    ssh = paramiko.SSHClient()
    # ssh._transport = transport
    """
    The authenticity of host '172.25.254.221 (172.25.254.221)' can't be established.
    ECDSA key fingerprint is 4c:98:51:43:65:46:66:fd:af:5b:ea:cc:d9:97:c0:74.
    Are you sure you want to continue connecting (yes/no)?
    """
    # 自动选择yes
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    try:
        print('ssh.connect: {} port: {}, command: {}'.format(ip, port, cmd))
        ssh.connect(ip, port, user, passwd, allow_agent=False)
    except Exception as e:
        ssh.close()
        out.append(e)
        return ERROR_SSH_CONNECT_FAILED

    stdin, stdout, stderr = ssh.exec_command(cmd, get_pty=True)
    # 实时输出
    while not stdout.channel.exit_status_ready():
        result = stdout.readline()
        out.append(result)
        if stdout.channel.exit_status_ready():
            result = stdout.readline()
            out.append(result)
    ssh.close()

    return 0

SSHClient的相关介绍:

https://www.cnblogs.com/caesar-id/p/12873557.html

class paramiko.client.SSHClient

SSHClient是与SSH服务器回话的高级封装,其内部实现了身份验证,执行命令等大多数基础功能。

exec_command(
command,
bufsize=-1,
timeout=None,
get_pty=False,
environment=None,
)

command(str):要执行的命令,多条命令用分号隔开。

bufsize(int):0 表示不缓冲,如果为 1 表示进行行缓冲,大于 1 为缓冲区大小。

timeout(float):命令执行的超时时间,单位秒。

get_pty(bool):如果为True相当于Channel.get_pty,向服务器请求一个伪终端。

environment(dict):在执行命令时附加环境变量。

返回值:返回一个元组 (stdin, stdout, stderr)

class paramiko.channel.Channel(chanid)

channel是一个SSH传输的安全隧道。一个通道类似于一个socket,由于SSH2有一种窗口式的流控制,如果停止从channel中读取数据,并且其缓冲区已满,服务器将无法向channel发送更多的数据,直到从channel中读取其中一些数据。(注意:这不会影响同一传输上的其他channel,单个传输上的所有channel都是独立的流控制。)同样,如果服务器不读取channel发送的数据,则除非设置超时,否则发送调用会一直处于阻塞。

get_pty(term="vt100",width=80,height=24,width_pixels=0,height_pixels=0)

功能:向服务器请求获取一个伪终端,通常在创建channel后,立即调用get_pty()请求一个伪终端,在使用invoke_shell想要创建一个交互式shell环境时需要提前调用get_pty(),如果调用的是exec_command执行命令,不需要使用get_pty()。

参考资料:

https://www.cnblogs.com/xiaofeng91/p/15070097.html

paramiko的get_pty=True参数_莺声门径的博客-CSDN博客_get_pty=true

关于python:读取大输出时,Paramiko通道卡住 | 码农家园

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/344987.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

商城业务:购物车

人生在世如身处荆棘之中,心不动,人不妄动,不动则不伤;如心动则人妄动,伤其身痛其骨,于是体会到世间诸般痛苦。 1、购物车需求 1)、需求描述: - 用户可以在登录状态下将商品添加到购…

【项目】---快速搜索工具

目录 一、项目背景 二、项目需求分析 三、项目涉及的知识点 四、项目实现的基础理论 五、项目框架 六、增加系统工具模块 6.1、扫描本地的文件的功能 七、增加数据管理模块 7.1、先了解数据库sqlite 7.2 封装sqlite数据库管理类 7.3、封装数据管理类 7.3.1增加搜索…

成都女子情人节给东莞男子送巧克力,却被后者典当后换成望京卡牌

一年一度的情人节已经来临,每年的这个时候,都是少男少女们欢庆的节日,因为他们可以借助送礼物,各自表达对另一半的爱慕之情。然而由于中国人的传统观念,一般都是男方给女方送礼物,女方给男方送礼物的就凤毛…

宝塔搭建实战php开源likeadmin通用管理移动端uniapp源码(四)

大家好啊,我是测评君,欢迎来到web测评。 上一期给大家分享了pc端的部署方式,今天来给大家分享uniapp端在本地搭建,与打包发布到宝塔的方法。感兴趣的朋友可以自行下载学习。 技术架构 vscode node16 vue3 uniapp vite types…

PageHelper分页查询

分页查询分页查询的优点所谓分页,就是查询结果数据较多时,采用按页显示的方法,而不是一次性全部显示分页的优点:服务器:一次性查询所有信息,服务器压力大,分页查询服务器压力小客户端:一次性显示所有信息,需要更多流量,加载时间也会更长,分页显示没有这个问题用户体验上:一般最…

Hot 100 | 287. 寻找重复数

LeetCode 287. 寻找重复数 给定一个包含 n 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。假设 nums 只有 一个重复的整数 ,返回 这个重复的数 。 你设计的解决方案必须&…

【Spring Cloud Alibaba】(三)OpenFeign扩展点实战 + 源码详解

系列目录 【Spring Cloud Alibaba】(一)微服务介绍 及 Nacos注册中心实战 【Spring Cloud Alibaba】(二)微服务调用组件Feign原理实战 本文目录系列目录前言一、Feign扩展点配置二、OpenFeign扩展点配置1. 通过配置文件配置有效范…

二维码数据压缩实践 | 使用python对二维码数据进行压缩 |不乱码,支持中文

当前二维码的应用越来越广泛,包括疫情时期的健康码也是应用二维码的典型案例,最近需要通过一张二维码显示较多文本数据,也就是对二维码数据进行压缩,使用CSDN搜索了半天居然没有能简单使用的代码,很多事例代码解决不了…

机器连接和边缘计算

以一种高效、可扩展的方式进行连接和边缘计算的结合,解决了在工业物联网应用中的机器数据集成问题。 一 边缘计算 边缘计算描述了由中央平台管理的数据分散式处理。边缘计算对于工业物联网而言非常重要。在许多应用程序中,由于数据量非常大,…

C++STL剖析(十)—— 位图(bitset)

文章目录1. 位图的介绍2. 位图的概念3. 位图的实现🍑 构造函数🍑 设置指定位🍑 清除指定位🍑 获取指定位的状态🍑 打印函数4. 总结1. 位图的介绍 在介绍位图之前先来看一道面试题吧 给 40 亿个不重复的无符号整数&…

【网络原理2】---TCP协议的格式

传输层重点协议TCP 协议TCP 协议段格式TCP内部的工作机制1. 确认应答2.超时重传TCP 协议 TCP 协议相对于 UDP 是复杂不少的。 在网络编程这里已经讲了 TCP 的特点: 有链接 可靠传输 面向字节流 全双工 可靠传输 是 TCP内部的机制,和编码关系不大&#x…

[oeasy]python0083_十进制数如何存入计算机_八卦纪事_BCD编码_Binary_Coded_Decimal

编码进化 回忆上次内容 上次 研究了 视频终端的 演化 从VT05 到 VT100从 黑底绿字 到 RGB 24位真彩色形成了 VT100选项 从而 将颜色 数字化 了 生活中我们更常用 10个数字 但是 计算机中 用二进制 日常计数的十进制数 是如何存储进计算机的呢?🤔 从10进制到2进…

Java学习笔记-03(API阶段-2)集合

集合 我们接下来要学习的内容是Java基础中一个很重要的部分:集合 1. Collection接口 1.1 前言 Java语言的java.util包中提供了一些集合类,这些集合类又称之为容器 提到容器不难想到数组,集合类与数组最主要的不同之处是,数组的长度是固定的,集合的长度是可变的&a…

思科网络部署,(0基础)入门实验,超详细

♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的绽放&#xff0…

如何让一起打拼的员工有持续的动力

我们的工作都要靠团队的每一个人努力,如何持续让老员工也能有持续的动力完成任务是我们非常重要的管理目标。 方法一:提供稀缺的学习机会。很多企业的培训都是针对新员工或者管理层的,容易让老员工意识不到自己应该学习,接触不到新…

Echarts 雷达图设置拐点大小和形状,tooltip后文字不居中对齐

第017个点击查看专栏目录Echarts的雷达图的拐点大小和形状是可以设置的,在series中设置symbol 相应的属性即可。 使用tooltip的时候,默认状态文字是居中对齐的,不好看。需要在tooltip属性中设置一下,如图所示,效果比较…

记录robosense RS-LIDAR-16使用过程4

一、时隔一个月,再次记录激光雷达的使用,一个月不碰生疏了好多,如鲠在喉,先来个基本操作熟悉一下找找感觉。连接在线雷达:https://github.com/RoboSense-LiDAR/rslidar_sdk/blob/main/doc/howto/06_how_to_decode_onli…

selenium--验证码识别,一文教会你回答面试官

相信大家在日常划水,培训,工作中都遇到这样的问题,验证码怎么处理?也有一些面试官会这么问。这里大致的说说,最常见的处理方式。1、万能验证码:所谓的万能验证码也就是找开发固定一个验证码,比如…

jenkins下配置maven

1. 先在jenkins服务器上安装maven 下载-解压-重命名-启动 [rootVM-0-12-centos local]# wget https://mirrors.aliyun.com/apache/maven/maven-3/3.9.0/binaries/apache-maven-3.9.0-bin.tar.gz [rootVM-0-12-centos local]# tar xf apache-maven-3.9.0-bin.tar.gz [rootVM-0…

嵌入式ARM设计编程(一) 简单数据搬移

文章和代码已归档至【Github仓库:hardware-tutorial】,需要的朋友们自取。或者公众号【AIShareLab】回复 嵌入式 也可获取。 一、实验目的 熟悉实验开发环境,掌握简单ARM汇编指令的使用方法。 二、实验环境 硬件:PC机 软件&am…