Python 如何将Paramiko标准输入、标准输出和标准输出连接到控制台?
我使用paramikopython包通过SSH运行命令。我可以得到输出到stdout,但是如何才能正确地将stdout、stderr和stdin重定向到sys 下面的代码只会在stdout上显示“stdout1”和“stdout2”。我怎样才能把“stderr”放进去?最好也支持标准文本Python 如何将Paramiko标准输入、标准输出和标准输出连接到控制台?,python,paramiko,Python,Paramiko,我使用paramikopython包通过SSH运行命令。我可以得到输出到stdout,但是如何才能正确地将stdout、stderr和stdin重定向到sys 下面的代码只会在stdout上显示“stdout1”和“stdout2”。我怎样才能把“stderr”放进去?最好也支持标准文本 import paramiko ssh = paramiko.SSHClient() ssh.load_system_host_keys() ssh.connect("localhost") stdin, st
import paramiko
ssh = paramiko.SSHClient()
ssh.load_system_host_keys()
ssh.connect("localhost")
stdin, stdout, stderr = ssh.exec_command("echo stdout1 >&1; echo stderr >&2; echo stdout2 >&1")
ch = stdout.channel
while True:
bs = ch.recv(1)
if not bs:
break
print(bs.decode("utf-8"), end="")
您可以从
ChannelFile
()中读取行
例如:
stdin, stdout, stderr = ssh.exec_command("echo stdout1 >&1; echo stderr >&2; echo stdout2 >&1")
while True:
print(stdout.read().decode(), end='')
if stdout.channel.exit_status_ready():
break
while True:
print(stderr.read().decode(), end='')
if stderr.channel.exit_status_ready():
break
此解决方案有一些缺点,如中所述:
.我发现asyncssh更适合我。以下代码按预期工作:
import asyncssh
import asyncio
import sys
async def run():
async with asyncssh.connect('localhost') as ssh:
await ssh.run("echo stdout1 >&1; echo stderr >&2; echo stdout2 >&1",
stdout=sys.stdout,
stderr=sys.stderr)
asyncio.run(run())
该解决方案的问题是“stdout2”在“stderr”之前打印。我发现了一个名为asyncssh的替代包,它更容易用于我的用例。