Paramiko - 在“背景”中运行命令

时间:2015-04-01 16:29:17

标签: python background stdout paramiko

我已经使用exec_command成功实现了Paramiko,但是,我在远程计算机上运行的命令有时可能需要几分钟才能完成。

在此期间,我的Python脚本必须等待远程命令完成并接收stdout。

我的目标是让远程计算机“在后台运行”,并允许本地Python脚本在通过exec_command发送命令后继续。

此时我并不关心stdout,我只是想绕过等待stdout返回,这样脚本可以在远程机器上运行时继续运行。

有什么建议吗?

当前脚本:

def function():
    ssh_object = paramiko.SSHClient()
    ssh_object.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh_object.connect(address, port=22, username='un', password='pw')
    command = 'command to run'

try:
    stdin, stdout, stderr = ssh_object.exec_command(command)
    stdout.readlines()
except:
    do something else

谢谢!

1 个答案:

答案 0 :(得分:1)

使用单独的线程运行命令。通常应使用join命令清除线程(在程序退出之前,您希望运行的daemon个线程例外)。具体如何做到这一点取决于程序运行的其他内容。但一个例子是:

import threading

def ssh_exec_thread(ssh_object, command):
    stdin, stdout, stderr = ssh_object.exec_command(command)
    stdout.readlines()

def function():
    ssh_object = paramiko.SSHClient()
    ssh_object.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh_object.connect(address, port=22, username='un', password='pw')
    command = 'command to run'

    thread = threading.Thread(target=ssh_exec_thread, args=(ssh_object, command)
    thread.start()
    ...do something else...
    thread.join()

您可以通过将Queue传递给ssh_exec_command并将结果放在队列中,以便稍后由程序处理,从而成为这位发烧友。