【问题标题】:Paramiko - Running commands in "background"Paramiko - 在“后台”运行命令
【发布时间】:2015-04-01 16:29:16
【问题描述】:

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

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

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

此时我不关心标准输出,我只是想绕过等待标准输出返回,以便在命令在远程计算机上运行时脚本可以继续运行。

有什么建议吗?

当前脚本:

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

谢谢!

【问题讨论】:

    标签: python background stdout paramiko


    【解决方案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 来使这个更有趣,然后将结果放入队列以供您的程序稍后处理。

    【讨论】:

    • 谢谢,我现在就试试这个实现。