You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python 3.5中如何将AsyncSSH命令输出保存为列表?

解决AsyncSSH捕获命令输出为列表的问题

你的代码问题在于run_client函数没有返回创建的MySSHClientSession实例,导致你拿到的x是None,自然无法调用getdata()方法。另外,把out定义为类属性可能会导致多个会话之间的输出互相干扰,最好改成实例属性。下面是修改后的完整解决方案:

修改后的代码

import asyncio, asyncssh, sys

class MySSHClientSession(asyncssh.SSHClientSession):
    def __init__(self):
        self.out = []  # 改为实例属性,每个会话独立存储输出

    def data_received(self, data, datatype):
        if datatype == asyncssh.EXTENDED_DATA_STDERR:
            print(data, end='', file=sys.stderr)
        else:
            self.out.append(data)

    def connection_lost(self, exc):
        if exc:
            print('SSH session error: ' + str(exc), file=sys.stderr)

    def getdata(self):
        # 如果需要合并为单个字符串,返回 ''.join(self.out)
        return self.out

async def run_client(zone, cmd):
    async with asyncssh.connect(zone, password='xxx', username='xxx', known_hosts=None) as conn:
        chan, session = await conn.create_session(MySSHClientSession, cmd)
        await chan.wait_closed()
        return session  # 返回session实例,这样外部能拿到输出

try:
    session = asyncio.get_event_loop().run_until_complete(run_client('fetish', 'sudo fl-service status'))
    output_list = session.getdata()
    print("输出列表:", output_list)
    # 在这里处理output_list,比如合并成字符串:full_output = ''.join(output_list)
except (OSError, asyncssh.Error) as exc:
    sys.exit('SSH connection failed: ' + str(exc))

关键改动说明

  1. 实例化输出列表:把out从类属性移到__init__方法中作为实例属性,确保每个SSH会话的输出不会互相覆盖。
  2. 返回Session实例:在run_client函数中,等待通道关闭后返回创建的session对象,这样外部代码就能获取到会话的输出数据。
  3. 正确获取输出:主代码中接收返回的session,调用getdata()拿到存储输出的列表。如果需要完整的字符串输出,可以修改getdata()返回''.join(self.out)。

这样修改后,你就能成功捕获命令的输出并保存为列表,用于后续处理了。

内容的提问来源于stack exchange,提问作者michal-ko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:19:23