Paramiko, как определить, завершена ли команда, выполненная с помощью invoke_shell - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь выполнить резервное копирование с помощью Paramiko.Когда происходит резервное копирование, я оставляю скрипт на 240 секунд, надеясь, что он завершится, но иногда это может занять больше времени, чем это.Могу ли я в любом случае использовать цикл для проверки каждые 20 секунд, чтобы увидеть, существуют ли такие ключевые слова, как «резервное копирование завершено», является выходной переменной.

import datetime, time
from time import sleep
from Tkinter import *
import paramiko
from paramiko_expect import SSHClientInteraction
def backup():
prompt = 'root@servername user'
try:
    client = paramiko.SSHClient()
    client.load_system_host_keys() 
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 

    client.connect(hostname=server, username=user, password=pass)

    interact = SSHClientInteraction(client, timeout=10, display=True)


except paramiko.AuthenticationException:
    print("Authentication failed, please verify your credentials: %s")
except paramiko.SSHException as sshException:
    print("Unable to establish SSH connection: %s" % sshException)
except paramiko.BadHostKeyException as badHostKeyException:
    print("Unable to verify server's host key: %s" % badHostKeyException)
except Exception as e:
    print(e.args)

    interact.send('su')
    interact.expect("Password:")


    interact.send("supassword")
    interact.expect(prompt)


    interact.send("who")
    interact.expect(prompt)

    cmd_output_who = interact.current_output_clean
    print cmd_output_who

1 Ответ

0 голосов
/ 10 декабря 2018

SSHClient.invoke_shell предназначен для реализации сеансов интерактивного терминала (например, если вы реализуете свой собственный клиент терминала SSH), а не для автоматизации выполнения команды.Терминал - это черный ящик с входом и выходом.У него нет API для выполнения команды и ожидания ее завершения.

Используйте SSHClient.exec_command для выполнения команды и Channel.recv_exit_status или Channel.exit_status_ready чтобы дождаться его завершения.
См. Дождаться завершения задачи на удаленном компьютере через Python .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...