【问题标题】:After executing a command by Python Paramiko how could I save result?Python Paramiko 执行命令后如何保存结果?
【发布时间】:2011-12-29 14:37:17
【问题描述】:

如下所示,是否可以保存结果?原因,在第二个和第三个 stdout.read() 我无法达到结果。

import paramiko
import os
dssh = paramiko.SSHClient()
dssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
dssh.connect('192.168.1.250', username='root', password='pass')
import os
stdin, stdout, stderr = dssh.exec_command('ifconfig')
print stdout.read()
print ('Sleeping 2 seconds!')
os.system('sleep 2')
stdin, stdout, stderr = dssh.exec_command('ls -l')
print stdout.read()
print stdout.read()
print stdout.read()
dssh.close()

【问题讨论】:

    标签: python save paramiko


    【解决方案1】:

    假设stdout 是一个普通文件。如果您第二次拨打file.read(),您期望得到什么? -- 什么都没有(空字符串),除非文件在外面发生了变化。

    保存字符串:

    output = stdout.read()
    

    您可能会发现Fabric 使用起来更简单(它使用paramiko 在后台执行命令)。

    【讨论】:

    • 我之前尝试过,但我没有工作。但现在它起作用了。嗯?还是谢谢
    • 如果该命令还在stderr 上产生输出,您需要并行读取这两个输出。否则,一旦stderr 输出缓冲区填满,命令将停止,等待您读取stderr。如果您只继续阅读stdout,则会出现死锁。
    • @MartinPrikryl 对于操作系统管道缓冲区是正确的,例如,如果您使用的是subprocess.Popen。我不确定它是否适用于 paramiko 的流。您能否提供一个完整的最小代码示例来演示死锁?
    • 这不是关于 paramiko,而是关于服务器端的缓冲区。如果 ssh 客户端不使用输出,则 ssh 服务器停止读取远程命令输出(实际上相当于您所指的 subprocess.Popen)。例如,这永远不会在我的系统上完成 stdin, stdout, stderr = ssh.exec_command("for ((n=0;n<1000000;n++)); do echo 1234567890; done >&2") print stdout.read() - 如果您删除 >&2 它会完成。 - 虽然实际所需的迭代次数会因不同系统而异。
    • 这个问题涵盖了问题:Paramiko ssh die/hang with big output.
    【解决方案2】:

    你可以试试这个通用 API

    def ssh_ctrl(ip, user, password,cmd):
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        try:
            ssh.connect(hostname=ip, username=user, password=password, timeout=tout, compress = True,look_for_keys=False, allow_agent=False)
        except (socket.error,paramiko.AuthenticationException,paramiko.SSHException) as message:
            print "ERROR: SSH connection to "+ip+" failed: " +str(message)
            sys.exit(1)
    
        stdin, stdout, ssh_stderr = ssh.exec_command(cmd)
        out = stdout.read()
        stdin.flush()
        ssh.close()
        return out
    

    【讨论】:

      猜你喜欢
      • 2018-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多