0

我正在使用 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 开始。我尝试使用'&',但它没有影响。有没有办法做到这一点,还是不可能?

4

2 回答 2

0

一种选择是使用该模块为每个execute语句启动一个新进程(请参阅此处获取文档)。您使用构造函数创建一个进程,给它一个要执行的目标函数和任何参数,并告诉它使用该方法启动它的函数。如果要等待进程完成,请使用该函数的方法。你的代码可能看起来像这样(确保你的语句被包裹在一个块中):multiprocessingProcessstartjoinif __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()

于 2020-09-25T13:35:24.047 回答
0

你为什么不尝试线程概念?

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()
于 2020-09-25T13:36:01.577 回答