簡體   English   中英

如何將Paramiko stdin,stdout和stderr連接到控制台?

[英]How to connect Paramiko stdin, stdout and stderr to console?

我使用Paramiko Python軟件包通過SSH運行命令。 我可以將輸出輸出到stdout,但是如何正確地將stdout,stderr和stdin重定向到sys呢?

下面的代碼在stdout上僅顯示“ stdout1”和“ stdout2”。 我如何正確地在其中獲得“ stderr”? 並且最好還支持stdin?

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="")

您可以從ChannelFilehttp://docs.paramiko.org/en/2.4/api/channel.html?highlight=stdout#paramiko.channel.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

該解決方案具有一些缺點,這些缺點在stderr上的paramiko recv()/ read()/ readline(s)()返回空字符串

我發現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())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM