Python Paramiko 使用交互方式获取终端输出报错

        近期接到一个需求,要批量登录网络设备获取配置。

        原计划使用 Paramiko exec即可,但是后来发现,有些设备命令也执行了,但是没有回显。

于是尝试使用 invoke_shell() 方式。

        前期调试倒是OK,直到遇见一个输出内容较长的设备,问题出现了,报错:

utf-8 codec can't decode byte 0×e5 in position 1023: Unexpected end of data.

原始的功能片段如下:

import paramiko# 创建一个SSH客户端
ssh_client = paramiko.SSHClient()# 加载本地 known_hosts 文件,Windows不需要,使用自动添加策略
ssh_client.load_system_host_keys()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 连接登录
ssh_client.connect(hostname="127.0.0.1", username="admin", password="passw0rd", port=22)# 创建交互式shell
channel = ssh_client.invoke_shell()
channel.send(("某条命令" + '\n').encode('utf-8'))# 接收命令输出
command_output = ""
while not channel.recv_ready():time.sleep(1)
while channel.recv_ready():# 问题就出在这一行:command_output += channel.recv(1024).decode("utf-8")channel.close()
ssh_client.close()

想得很好,但是在1024这个位置一旦decode失败,就会报错。

搜索查阅了其他的一些相类似内容,好像没有直接的解决方案。

既然问题出在截断处的字符编码,那么如果截断处先不编码,等后面的部分全部接起来,以后,在一次性编码不就行了么。于是:

import paramiko# 创建一个SSH客户端
ssh_client = paramiko.SSHClient()# 加载本地 known_hosts 文件,Windows不需要,使用自动添加策略
ssh_client.load_system_host_keys()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 连接登录
ssh_client.connect(hostname="127.0.0.1", username="admin", password="passw0rd", port=22)# 创建交互式shell
channel = ssh_client.invoke_shell()
channel.send(("某条命令" + '\n').encode('utf-8'))# 接收命令输出
command_output = b''
# 指定 command_output 类型为byte
while channel.recv_ready():
# 此处不做decode转换,彻底避免在字符切断处报错command_output += channel.recv(1024)
# 全部接收拼接后,一次性编码,搞定!!!
command_output = command_output.decode('utf-8')channel.close()
ssh_client.close()

就是这样↑

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[VulnHub靶机渗透] dpwwn: 1

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏…

CV | Medical-SAM-Adapter论文详解及项目实现

******************************* 👩‍⚕️ 医学影像相关直达👨‍⚕️******************************* CV | SAM在医学影像上的模型调研【20240207更新版】-CSDN博客 CV | Segment Anything论文详解及代码实现 本文主要讲解Medical-SAM-Adapter论文及项…

ELAdmin 的 CRUD

数据表结构 弄个测试的数据表,不同类型的几个字段,表名位 mp_reply。 生成代码 ELAdmin 可以自动生成代码。 左侧目录系统工具–代码生成,点开以后可以看到上面创建的数据表mp_reply,点击配置。 进入的页面内容有两部分&#…

单片机无线发射的原理剖析

目录 一、EV1527编码格式 二、OOK&ASK的简单了解 三、433MHZ 四、单片机的地址ID 五、基于STC15W104单片机实现无线通信 无线发射主要运用到了三个知识点:EV1527格式;OOk;433MHZ。下面我们来分别阐述: EV1527是数据的编…

IAR报错:Error[Pa045]: function “halUartInit“ has no prototype

在IAR工程.c文件末尾添加一个自己的函数,出现了报错Error[Pa045]: function "halUartInit" has no prototype 意思是没有在开头添加函数声明,即void halUartInit(void); 这个问题我们在keil中不会遇到,这是因为IAR编译器规则的一…

Electron实战(二):将Node.js和UI能力(app/BrowserWindow/dialog)等注入html

文章目录 设置webPreferences参数安装electron/remotemain进程中初始化html中使用dialog踩坑参考文档 上一篇:Electron实战(一):环境搭建/Hello World/打包exe 设置webPreferences参数 为了能够在html/js中访问Node.js提供fs等模块,需要在n…

NLP_语言模型的雏形 N-Gram 模型

文章目录 N-Gram 模型1.将给定的文本分割成连续的N个词的组合(N-Gram)2.统计每个N-Gram在文本中出现的次数,也就是词频3.为了得到一个词在给定上下文中出现的概率,我们可以利用条件概率公式计算。具体来讲,就是计算给定前N-1个词时&#xff0…

c++之说_13|模板 折叠表达式

折叠表达式 可以通过形参包的的实际参数&#xff08;不是类型&#xff09; 展开式子 这是这里说的几种 实际上并还有一些写法 先介绍这几种吧 #include <cstdio> template<typename T,T... n> struct integer_sequence {T val; }; template<int idx,typenam…

[NOI2014] 起床困难综合症

[NOI2014] 起床困难综合症 题目描述 21 21 21 世纪&#xff0c;许多人得了一种奇怪的病&#xff1a;起床困难综合症&#xff0c;其临床表现为&#xff1a;起床难&#xff0c;起床后精神不佳。作为一名青春阳光好少年&#xff0c;atm 一直坚持与起床困难综合症作斗争。通过研究…

windows上卸载完程序后,清理残余文件,无法删除的情况处理

现象&#xff1a;通常在卸载完软件后&#xff0c;要删除残余文件或者移动残余文件时候&#xff0c;会弹出来 原因&#xff1a; 因为文件被其他程序已经加载&#xff0c;处理的目标是找到使用这个文件的进程&#xff0c;然后kill掉。类似于linux上的lsof命令查找到进程号&…

C++新版本特性

目录: 前言 C11的常用新特性 auto类型推导&#xff1a; auto的限制&#xff1a; auto的应用&#xff1a; decltype类型推导&#xff1a; decltype的实际应用&#xff1a; 使用using 定义别名&#xff1a; 支持函数模板的默认模板参数 : tuple元组&#xff1a; 列表初…

Linux操作系统基础(三):虚拟机与Linux系统安装

文章目录 虚拟机与Linux系统安装 一、系统的安装方式 二、虚拟机概念 三、虚拟机的安装 四、Linux系统安装 1、解压人工智能虚拟机 2、找到解压目录中的node1.vmx 3、启动操作系统 虚拟机与Linux系统安装 一、系统的安装方式 Linux操作系统也有两种安装方式&#xf…