如何将Paramiko exec_commmand作为字符串返回给python客户端[重复]

Posted

技术标签:

【中文标题】如何将Paramiko exec_commmand作为字符串返回给python客户端[重复]【英文标题】:How to return Paramiko exec_commmand as a string to python client [duplicate] 【发布时间】:2018-06-15 14:02:24 【问题描述】:

所以我正在整理一些使用 Paramiko 将 ssh 连接到远程服务器并向远程连接发送命令的东西。到目前为止一切进展顺利,除了我似乎无法让 Paramiko 将执行命令的结果作为字符串返回。 Paramiko 正在返回看起来像通道实例及其状态的内容。这就是我现在正在尝试的:

client = paramiko.SSHClient()
client.load_system_host_keys()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())


hostname = 'xxxx'
port = 'xxxxx'
user = 'xxxxx'
password = 'xxxxx'


client.connect(hostname,port,user,password)
do_something(client)






def do_something(client):

    object = client.exec_command('pwd')
    print(object)

以下是我运行程序时 Paramiko 给我的输出:

  (<paramiko.ChannelFile from <paramiko.Channel 0 (open) window=2097152 -> 
  <paramiko.Transport at 0x6119f90 (cipher aes128-ctr, 128 bits) (active; 1 
   open chanel(s))>>>,

并且期望的输出应该是这样的:

 object = client.exec_command('pwd')
 print(object)

输出:

  '/var/www/html'

基本上,如果您输入命令,我怎样才能让 Paramiko 返回字符串值而不是对象实例?我尝试了几种不同的方法,但我似乎无法解决这个问题!请指教!非常感谢!

【问题讨论】:

【参考方案1】:

来自 Paramiko 的 client.exec_command() 文档:

命令的输入和输出流作为 Python 文件类对象返回,表示标准输入、标准输出和标准错误。

因此,您需要获取该标准输出流,并从中读取:

stdin, stdout, stderr = client.exec_command('pwd')
string = stdout.read().decode('ascii').strip("\n")

【讨论】:

非常感谢,这有效。每次我想读取输出时都必须调用 stdin、stdout、stderr 吗?还是我可以简单地设置 stdout = client.exec_command? 当我将它作为 exec_command 参数传递时,您不会知道为什么 dmidecode 不起作用?它说找不到 bash 命令,但是当我在机器上执行时它可以工作 您必须同时阅读stdoutstderr。正如我现在在重复问题的答案中所评论的那样:***.com/a/8138442/850848 关于“找不到命令”,见***.com/q/31964108/850848 嗨,马丁,希望你还在,我试着查看了你提到的一些修复,我尝试了一些方法,但没有成功运行诸如“dmidecode、lshw”之类的命令。还有其他建议吗?

以上是关于如何将Paramiko exec_commmand作为字符串返回给python客户端[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Python SFTP/Paramiko 将 zip 文件从一台服务器传输到另一台服务器

paramiko.SSHClient()的exec_command函数内部如何使用变量

paramiko.SSHClient()的exec_command函数内部如何使用变量

如何在 paramiko 建立的 ssh 连接中将文件传输到 ssh 服务器?

在 Python 3.4.3 中使用 Paramiko 运行多个 SSH 命令

使用paramiko如何连接服务器?