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

4 人关注

我想在Linux目标机上运行一个Python脚本,比如 test.py ,并使用 paramiko 模块在一个文本文件中捕获命令的输出,作为另一个Python脚本 invoke.py 的一部分。

脚本中的语句

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

产生了一个 空白 file log.txt.

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

替换代码0】在本地运行时,输出正常的文本(预计将被记录在log.txt中)。

有一些相关的帖子 here here , 但没有人处理Python脚本的输出问题

python
linux
remote-access
paramiko
Bleamer
Bleamer
发布于 2013-04-25
1 个回答
Ujjwal John
Ujjwal John
发布于 2018-01-24
0 人赞同

你可以使用client.open_channel()并使用channel session的recv()和recv_stderr()流来读写stdout/std err,而不是调用client.exec_command()。

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