3 votes

Comment connecter Paramiko stdin, stdout et stderr à la console ?

J'utilise le paquetage Paramiko Python pour exécuter des commandes via SSH. Je peux obtenir une sortie vers stdout, mais comment faire pour que stdout, stderr et stdin soient correctement redirigés vers ceux de sys ?

Le code ci-dessous n'afficherait que "stdout1" et "stdout2" sur stdout. Comment faire pour que "stderr" s'affiche correctement ? Et de préférence aussi un support pour 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="")

2voto

gbajson Points 497

Vous pouvez lire des lignes de ChannelFile ( http://docs.paramiko.org/en/2.4/api/channel.html?highlight=stdout#paramiko.channel.ChannelFile ).

Ejemplo:

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

Cette solution présente quelques inconvénients bien décrits dans le document : Paramiko recv()/read()/readline(s)() sur stderr renvoie une chaîne vide .

1voto

Per Appelgren Points 57

J'ai trouvé asyncssh qui me convenait mieux. Le code suivant fonctionne comme prévu :

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())

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X