4

我想test.py在 Linux 目标机器(它有一个 python 解释器)上运行一个 python 脚本,并将命令的输出捕获到一个文本文件中,作为另一个invoke.py使用paramiko模块的 python 脚本的一部分。

脚本中的语句

stdin, stdout, sterr = ssh.exec_command("python invoke.py > log.txt")

生成一个空白文件 log.txt。

请提出更正/替代方法来做到这一点。将输出正确写入文件。

test.py在本地运行时输出健全的文本(预计将记录在 log.txt 中)。

这里这里有一些相关的帖子,但没有人处理 python 脚本的输出

4

1 回答 1

0

而不是调用 client.exec_command() 您可以使用 client.open_channel() 并使用通道会话的 recv() 和 recv_stderr() 流来读写 stdout/std err:

def sshExecute(hostname, username, password, command, logpath = None):

    buffSize = 2048
    port = 22

    client = paramiko.Transport((hostname, port))
    client.connect(username=username, password=password)

    if logpath == None:
        logpath = "./"

    timestamp = int(time.time())
    hostname_prefix = "host-%s-%s"%(hostname.replace(".","-"),timestamp)         
    stdout_data_filename = os.path.join(logpath,"%s.out"%(hostname_prefix))
    stderr_data_filename = os.path.join(logpath,"%s.err"%(hostname_prefix))    
    stdout_data = open(stdout_data_filename,"w") 
    stderr_data = open(stderr_data_filename,"w") 

    sshSession = client.open_channel(kind='session')
    sshSession.exec_command(command)
    while True:
        if sshSession.recv_ready():
            stdout_data.write(sshSession.recv(buffSize))
        if sshSession.recv_stderr_ready():
            stderr_data.write(sshSession.recv_stderr(buffSize))
        if sshSession.exit_status_ready():
            break

    stdout_data.close()
    stderr_data.close()
    sshSession.close()
    client.close()

    return sshSession.recv_exit_status()

希望这个完整的功能可以帮助你

于 2018-01-24T09:10:11.467 回答