如何不等待远程执行的输出?

Posted

技术标签:

【中文标题】如何不等待远程执行的输出?【英文标题】:How to not wait for the output of the remote execution? 【发布时间】:2021-01-11 19:55:49 【问题描述】:

我正在使用pysftp进行远程执行,问题是我不想等待远程执行的输出,我只想开始执行并完成它。

import pysftp as sftp
cnopts = sftp.CnOpts()
cnopts.hostkeys = None
handle = sftp.Connection('10.0.2.10',username='kali', password='root', cnopts=cnopts)
handle.execute('/tmp/doThis')
handle.exeute('/tmp/doThat')

现在的问题是脚本正在等待 doThis 结束,然后它以 doThat 开始。我尝试使用'&',但它没有影响。 有没有办法做到这一点,还是不可能?

【问题讨论】:

【参考方案1】:

您为什么不试试threading 的概念?

import pysftp as sftp
from threading import Thread
cnopts = sftp.CnOpts()
cnopts.hostkeys = None
handle = sftp.Connection('10.0.2.10',username='kali', password='root', cnopts=cnopts)

def exec(cmd):
    #handle will be taken from the prev declaration
    handle.execute(cmd)

list_cmds = ['/tmp/doThis', '/tmp/doThat']

for cmd in list_cmds:
    Thread(target=exec, args=[cmd]).start()

【讨论】:

我只是不想停止等待,但我不想在我的计算机上执行该过程。一旦我在远程计算机上启动该过程,它根本不应该与我的计算机相关。但是如果我创建一个进程,它将在后台运行。 是的,不会的!关键是您在这里创建了一个线程,并且控制权在您管理创建的线程(在您的 RAM 中)时,但该进程显然将在远程机器上运行。希望这是您所期待的。 感谢您的意见,我会实施并让您知道它是否有效。【参考方案2】:

一种选择是使用multiprocessing 模块为每个execute 语句启动一个新进程(有关文档,请参阅here)。您使用Process 构造函数创建一个进程,给它一个要执行的目标函数和任何参数,并告诉它使用start 方法启动它的函数。如果要等待进程完成,请使用该函数的 join 方法。您的代码可能看起来像这样(确保您的语句包含在 if __name__ == '__main__': 块中):

import pysftp as sftp
from multiprocessing import Process


if __name__ == '__main__':
    cnopts = sftp.CnOpts()
    cnopts.hostkeys = None
    handle = sftp.Connection(
        '10.0.2.10',
        username='kali',
        password='root',
        cnopts=cnopts
    )
    # Create processes
    p1 = Process(target=handle.execute, args=('/tmp/doThis',))
    p2 = Process(target=handle.execute, args=('/tmp/doThat',))
    # Tell processes to start
    p1.start()
    p2.start()
    # If you want to, then wait for both processes to finish
    p1.join()
    p2.join()

【讨论】:

我只是不想停止等待,但我不想在我的计算机上执行该过程。一旦我在远程计算机上启动该过程,它根本不应该与我的计算机相关。但是如果我创建一个进程,它将在后台运行。

以上是关于如何不等待远程执行的输出?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Eclipse 中将执行显示输出到远程 C++ 的控制台?

如何远程执行客户端功能?

Android 逆向Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 三 | 等待远程函数执行完毕 | 寄存器获取返回值 )(代

Spring 消息

如何使用python执行远程shell脚本

RUBY 脚本:连接到 Telnet 会话时等待任何输出