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

脚本中的语句
stdin, stdout, sterr = ssh.exec_command("python invoke.py > log.txt")
生成一个空白文件log.txt。

请提出更正/替代方法。将输出正确地写入文件。

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

有一些相关的文章herehere,但是没有人处理python脚本的输出

最佳答案

除了调用client.exec_command()之外,还可以使用client.open_channel()并使用通道 session 的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()

希望这个功能全面的功能对您有所帮助

09-04 00:36
查看更多