Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将Paramiko标准输入、标准输出和标准输出连接到控制台?_Python_Paramiko - Fatal编程技术网

Python 如何将Paramiko标准输入、标准输出和标准输出连接到控制台?

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

我使用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, 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的替代包,它更容易用于我的用例。