如何将ssh.exec_command的输出重定向到Python paramiko模块中的文件?

时间:2013-04-25 14:10:46

标签: python linux remote-access paramiko

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

脚本中的陈述

paramiko

生成空白文件log.txt。

请建议更正/替代方法来执行此操作。正确地将输出写入文件。

stdin, stdout, sterr = ssh.exec_command("python invoke.py > log.txt")在本地运行时输出合理的文本(预计会记录在log.txt中)。

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

1 个答案:

答案 0 :(得分:0)

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

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()

希望这个完全有效的功能可以帮助你