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))
关键改动说明
- 实例化输出列表:把
out从类属性移到__init__方法中作为实例属性,确保每个SSH会话的输出不会互相覆盖。 - 返回Session实例:在
run_client函数中,等待通道关闭后返回创建的session对象,这样外部代码就能获取到会话的输出数据。 - 正确获取输出:主代码中接收返回的
session,调用getdata()拿到存储输出的列表。如果需要完整的字符串输出,可以修改getdata()返回''.join(self.out)。
这样修改后,你就能成功捕获命令的输出并保存为列表,用于后续处理了。
内容的提问来源于stack exchange,提问作者michal-ko
相关产品推荐
相关产品推荐

