stderr 上的 Paramiko recv()/read()/readline(s)() 返回空字符串

2024-02-20

我正在使用 paramiko 收集远程主机上的一些信息并在阅读时遇到问题(read()/readline()/readlines()) 来自stderr渠道。

有时stderr.read()返回一个空字符串,在我看来,它看起来像是竞争条件的结果。 然而,根据我在互联网上找到的文档和示例,这似乎是正确的方法。

我还尝试开设专用频道并利用chan.recv_ready() / chan.recv_stderr_ready()并通过循环从各个通道读取chan.recv() / chan.recv_stderr()然而,这会导致相同的行为。

这是一个最小的测试用例,在我的设置中,它可靠地导致了这种行为。

import paramiko

class SSH:
    def __init__(self):
        self.ssh = paramiko.SSHClient()
        self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        self.ssh.connect('127.0.0.1', port=31337, username='root', password='root')

        self.stdout = ''
        self.stderr = ''
        self.exit_code = 0

    def _run_cmd(self, cmd):
        self.stdout = ''
        self.stderr = ''

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

        self.stdout = stdout.read()
        self.stderr = stderr.read()

        while not stdout.channel.exit_status_ready():
            pass
        self.exit_code = stdout.channel.recv_exit_status()

        if self.exit_code:
            print("ERROR: " + self.stderr)

    def process_list(self):
        self._run_cmd('ls /proc/ | grep -E "^[0-9]+$" | grep -v $$')
        lines = self.stdout.split('\n')[:-1]
        data = []

        for process in lines:
            process_data = {}
            process_data['pid'] = int(process)

            # fetching and parsing process status information from /proc/[PID]/status

            self._run_cmd('cat /proc/%d/status' % (int(process)))

            data.append(self.stdout)

        return data


data = SSH()
while True:
    print data.process_list()

几次运行后(如果不是第一次)我得到的是: ERROR: 当我期待着: ERROR: cat: /proc/12883/status: No such file or directory

如何确保 stderr 已准备好读取/我读取了 stderr 上的所有数据?


长话短说:我遇到了大多数此类问题,并针对大多数 ssh 相关问题提出了最终解决方案。因此请随意查看this https://stackoverflow.com/a/32758464/1729555实施exec_command避免大多数空响应/停滞场景。

很长的故事

这里的主要问题是你exec_command()是非阻塞的,并产生一个负责通道通信的线程。该线程正在等待传入数据并将其放入通道缓冲区,而主线程可能会继续运行。这就是你的问题所在。你太早读取缓冲区了,甚至在你检查你的一方是否收到了exit_status。收到exit_status确认远程进程已退出并带有给定的状态代码。接收远程状态码是not表明您已收到可能仍在传输中的所有数据。它甚至可能无序地到达你身边,说status_code甚至可能在所有数据之前到达(stderr,stdout) 收到了。

当数据到达时,主线程继续。在你的情况下,主线程尝试读取stdout and stderr一次然后阻塞直到exit_status准备好了。请注意,通道线程仍可能从远程命令调用接收数据。另请注意,一旦您的一方收到遥控器,您就必须手动清空缓冲区exit_status.

在您的具体情况下,会发生以下情况:

  1. execute_command产生一个新线程(让我们调用 id执行线程、管理远程命令调用
  2. 虽然最近生成的线程可以接收数据,但主线程继续运行。
  3. [主线程] 你正在存储current的内容stdout,stderr缓冲在self.stdout,self.stderr。请注意,您不知道是否已收到所有数据stderr or stdout。您很可能刚刚收到了一些块。
  4. [exec_thread] 愉快地接收数据stdout,stderr当[主线程]继续时。
  5. [主线程] 繁忙阻塞,直到exit_status已收到。再次注意,此时您的缓冲区可能仍然充满了最近收到的stderr,stdout chunks.
  6. [主线程]exit_status存储在self.exit_code。 [exec_thread] 仍然存在,可能仍然收到一些乱序数据。输入缓冲区可能仍被填满。
  7. [主线程] 从返回run_cmd

请注意,该通道的 [exec_thread] - paramiko 为每个通道调用创建一个线程(即exec_command) - 仍然存在,它们会总结闲置并产生问题,直到您手动关闭它们(stdout.channel.close()).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

stderr 上的 Paramiko recv()/read()/readline(s)() 返回空字符串 的相关文章

  • 使用 python requests 模块时出现 HTTP 503 错误

    我正在尝试发出 HTTP 请求 但当前可以从 Firefox 浏览器访问的网站响应 503 错误 代码本身非常简单 在网上搜索一番后我添加了user Agent请求参数 但也没有帮助 有人能解释一下如何消除这个 503 错误吗 顺便说一句
  • 元组有什么用?

    我现在正在学习 Python 课程 我们刚刚介绍了元组作为数据类型之一 我阅读了它的维基百科页面 但是 我无法弄清楚这种数据类型在实践中会有什么用处 我可以提供一些需要一组不可变数字的示例吗 也许是在 Python 中 这与列表有何不同 每
  • 处理 Python 行为测试框架中的异常

    我一直在考虑从鼻子转向行为测试 摩卡 柴等已经宠坏了我 到目前为止一切都很好 但除了以下之外 我似乎无法找出任何测试异常的方法 then It throws a KeyError exception def step impl contex
  • 用枢轴点拟合曲线 Python

    我有下面的图 我想用 2 条线来拟合它 使用 python 我设法适应上半部分 def func x a b x np array x return a x b popt pcov curve fit func up x up y 我想用另
  • 需要在python中找到print或printf的源代码[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在做一些我不能完全谈论的事情 我
  • 跟踪 pypi 依赖项 - 谁在使用我的包

    无论如何 是否可以通过 pip 或 PyPi 来识别哪些项目 在 Pypi 上发布 可能正在使用我的包 也在 PyPi 上发布 我想确定每个包的用户群以及可能尝试积极与他们互动 预先感谢您的任何答案 即使我想做的事情是不可能的 这实际上是不
  • 删除flask中的一对一关系

    我目前正在使用 Flask 开发一个应用程序 并且在删除一对一关系中的项目时遇到了一个大问题 我的模型中有以下结构 class User db Model tablename user user id db Column db String
  • Pandas 日期时间格式

    是否可以用零后缀表示 pd to datetime 似乎零被删除了 print pd to datetime 2000 07 26 14 21 00 00000 format Y m d H M S f 结果是 2000 07 26 14
  • 使用 kivy textinput 的 'input_type' 属性的问题

    您好 我在使用 kivy 的文本输入小部件的 input type 属性时遇到问题 问题是我制作了两个自定义文本输入 其中一个称为 StrText 其中设置了 input type text 然后是第二个文本输入 名为 NumText 其
  • 如何使用 Pandas、Numpy 加速 Python 中的嵌套 for 循环逻辑?

    我想检查一下表的字段是否TestProject包含了Client端传入的参数 嵌套for循环很丑陋 有什么高效简单的方法来实现吗 非常感谢您的任何建议 def test parameter a list parameter b list g
  • YOLOv8获取预测边界框

    我想将 OpenCV 与 YOLOv8 集成ultralytics 所以我想从模型预测中获取边界框坐标 我该怎么做呢 from ultralytics import YOLO import cv2 model YOLO yolov8n pt
  • 如何将张量流模型部署到azure ml工作台

    我在用Azure ML Workbench执行二元分类 到目前为止 一切正常 我有很好的准确性 我想将模型部署为用于推理的 Web 服务 我真的不知道从哪里开始 azure 提供了这个doc https learn microsoft co
  • Python,将函数的输出重定向到文件中

    我正在尝试将函数的输出存储到Python中的文件中 我想做的是这样的 def test print This is a Test file open Log a file write test file close 但是当我这样做时 我收到
  • Numpy - 根据表示一维的坐标向量的条件替换数组中的值

    我有一个data多维数组 最后一个是距离 另一方面 我有距离向量r 例如 Data np ones 20 30 100 r np linspace 10 50 100 最后 我还有一个临界距离值列表 称为r0 使得 r0 shape Dat
  • Python3 在 DirectX 游戏中移动鼠标

    我正在尝试构建一个在 DirectX 游戏中执行一些操作的脚本 除了移动鼠标之外 我一切都正常 是否有任何可用的模块可以移动鼠标 适用于 Windows python 3 Thanks I used pynput https pypi or
  • 如何断言 Unittest 上的可迭代对象不为空?

    向服务提交查询后 我会收到一本字典或一个列表 我想确保它不为空 我使用Python 2 7 我很惊讶没有任何assertEmpty方法为unittest TestCase类实例 现有的替代方案看起来并不正确 self assertTrue
  • 为什么 Pickle 协议 4 中的 Pickle 文件是协议 3 中的两倍,而速度却没有任何提升?

    我正在测试 Python 3 4 我注意到 pickle 模块有一个新协议 因此 我对 2 个协议进行了基准测试 def test1 pickle3 open pickle3 wb for i in range 1000000 pickle
  • Python:XML 内所有标签名称中的字符串替换(将连字符替换为下划线)

    我有一个格式不太好的 XML 标签名称内有连字符 我想用下划线替换它 以便能够与 lxml objectify 一起使用 我想替换所有标签名称 包括嵌套的子标签 示例 XML
  • 使用for循环时如何获取前一个元素? [复制]

    这个问题在这里已经有答案了 可能的重复 Python 循环内的上一个和下一个值 https stackoverflow com questions 1011938 python previous and next values inside
  • 更改 Tk 标签小部件中单个单词的颜色

    我想更改 Tkinter 标签小部件中单个单词的字体颜色 我知道可以使用文本小部件来实现与我想要完成的类似的事情 例如使单词 YELLOW 显示为黄色 self text tag config tag yel fg clr yellow s

随机推荐

  • Django mysql 连接过多

    我将 Django 与 mysql 一起使用 并遇到连接过多的问题 我从命令行运行 python 脚本 但与 Django 模型集成以检查数据库中的数据 该脚本每 30 秒运行一次 我使用线程来控制它 My function 是检查数据库状
  • 将数据从宽变为长:基于列名称的新变量

    我想将数据集从宽格式重塑为长格式 该数据集包含 300 个变量 每个变量均按照以下原则命名 ModelID Emotion ModelGender 样本数据如下 df lt structure list X71 Anger Male str
  • 向后循环 python 字符串的最佳方法

    向后循环 python 字符串的最佳方法是什么 对于所有需要 1 偏移量的情况 以下内容似乎有点尴尬 string trick or treat for i in range len string 1 0 1 1 print string
  • docker run“--env-file”提供的文件未按预期评估的解决方法

    我当前运行 docker 容器的设置如下 我有一个main env file Main export PRIVATE IP echo localhost export MONGODB HOST PRIVATE IP export MONGO
  • Laravel API,如何正确处理错误

    任何人都知道 Laravel 中处理错误的最佳方法是什么 有什么规则或需要遵循吗 目前我正在这样做 public function store Request request plate Plate create request gt al
  • 如何安装 json gem - 无法构建 gem 本机扩展

    我正在尝试将 Rails 应用程序部署到我的 ubuntu Linux 服务器 我正在使用 capistrano 和捆绑器 当安装 gems 时 它失败并出现以下错误 Installing json 1 7 7 with native ex
  • java计算句子中每个单词的频率

    我正在编写一个非常基本的java程序 它计算句子中每个单词的频率 到目前为止我已经做到了这么多 import java io class Linked public static void main String args throws I
  • MySQL的行数count(*)与information_schema中的table.table_rows不一致

    我遇到了一个奇怪的现象 我希望有人可以向我解释一下 我有一些 静态 表格 它们每天更改一次 mysql gt select appObjectGroups as tbl count as num from appObjectGroups u
  • 数据库丢失!寻找根本原因

    假设有一天 管理员像往常一样来到办公室 在 Sql Server 数据库上执行管理任务 他惊讶地发现数据库丢失了 他不知道是谁删除了它 或者是来自外部批处理或 SQL 注入等 从哪里开始调查 以及应该采取哪些重要参数 发现来找到删除数据库的
  • OpenCPU 上的自定义 R 包/找到包,但没有可见的函数

    CI 为 OpenCPU 编写了一个 R 包 并希望在我自己的云服务器上使用它 即使包本身被识别并且可以更新 我也无法访问任何功能 并且我可以通常通过 POST 和 GET 访问其他 非自定义 例如基本或统计 包 我已经安装了自定义包以及所
  • 根据两个属性值的组合选择唯一节点

    我有一些 XML 看起来像这样
  • 当公式更改单元格值时触发脚本

    我正在使用 Google 脚本 然后在 Google 工作表中的特定列发生更改时发送电子邮件 单元格中的信息可以手动输入 也可以根据其他单元格中的信息使用公式完成 当手动输入信息时 脚本可以正常工作 但在公式运行时则不行 我已经阅读了它并意
  • 为什么我无法从其他节点 IP 访问 kubernetes pod?

    我已经在 Kubespray 的帮助下安装了 kubernetes 集群 集群有 3 个节点 2 个主节点和 1 个工作节点 节点1 10 1 10 110 节点2 10 1 10 111 节点3 10 1 10 112 kubectl g
  • 如何在 NancyFX 中写入流输出?

    我正在使用 Nancy 编写一个简单的 Web 应用程序 至少一个请求会导致长度未知的流 因此我无法提供Content Length 我想用Transfer Encoding chunked 或 在这种情况下同样可以接受 Connectio
  • 在 Ruby 中迭代无限序列

    我正在尝试解决 Project Euler 问题 12 三角形数序列是通过将自然数相加生成的 数字 所以第 7 个三角形数 将为 1 2 3 4 5 6 7 28 前十项是 1 3 6 10 15 21 28 36 45 55 让我们列出前
  • PHP XML/HTML DOM 获取带有空格的 CSS 类属性

    我有以下问题 我正在使用 PHP XML DOM 解析器 当我解析现实世界的 HTML 时 许多元素的 class 属性中都有空格 因此这些元素实际上有多个 CSS 类 但是 当我使用 getAttribute 查询 DOMNode 时 我
  • 如何使用 REGEXP_SUBSTR 解析数据?

    我有一个像这样的数据集 见下文 我尝试提取形式为 variable number of digits hyphen only one digit 的数字 with mcte as select ILLD ELKJS 00000000 ELK
  • Composer 软件包已更新但未安装

    做完之后 sudo php composer phar update 我得到以下信息 Loading composer repositories with package information Updating dependencies
  • 通过Java获取Windows文件关联

    我以为这会是一件容易的事 但是 我希望我的 Java 程序能够获取用户的 Windows 文件关联 换句话说 我想知道用户使用什么来打开 txt文件 cvs文件等 assoc 和 ftype 命令提供该信息 但不提供给用户 换句话说 如果我
  • stderr 上的 Paramiko recv()/read()/readline(s)() 返回空字符串

    我正在使用 paramiko 收集远程主机上的一些信息并在阅读时遇到问题 read readline readlines 来自stderr渠道 有时stderr read 返回一个空字符串 在我看来 它看起来像是竞争条件的结果 然而 根据我