在 Python 中使用 Paramiko 从 top 命令收集输出

Posted

技术标签:

【中文标题】在 Python 中使用 Paramiko 从 top 命令收集输出【英文标题】:Collect output from top command using Paramiko in Python 【发布时间】:2021-05-05 15:49:24 【问题描述】:

我在这里尝试执行 ssh 命令并打印输出。除了命令top 外,它工作正常。 任何线索如何从顶部收集输出?

import paramiko
from paramiko import SSHClient, AutoAddPolicy, RSAKey

output_cmd_list = ['ls','top']

ssh = paramiko.SSHClient()
ssh.load_system_host_keys()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname_ip, port, username, password)

for each_command in output_cmd_list:
    stdin, stdout, stderr = ssh.exec_command(each_command)
    stdout.channel.recv_exit_status()
    outlines = stdout.readlines()
    resp = ''.join(outlines)
    print(resp)    

【问题讨论】:

【参考方案1】:

top 是一个需要终端的花哨命令。虽然您可以使用SSHClient.exec_commandget_pty 参数启用终端仿真,但它会给您带来大量带有ANSI 转义码的垃圾。我不确定你想要那个。

而是以批处理模式执行top

top -b -n 1

见get top output for non interactive shell。

【讨论】:

【参考方案2】:

exe_command 中有一个选项 [get_pty=True] 提供伪终端。 在这里,我通过在我的代码中添加相同的内容得到了输出。

import paramiko
from paramiko import SSHClient, AutoAddPolicy, RSAKey

output_cmd_list = ['ls','top']

ssh = paramiko.SSHClient()
ssh.load_system_host_keys()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname_ip, port, username, password)

for command in output_cmd_list:
    stdin, stdout, stderr = ssh.exec_command(command,get_pty=True)
    stdout.channel.recv_exit_status()
    outlines = stdout.readlines()
    resp = ''.join(outlines)
    print(resp)  

【讨论】:

这就是我在回答中写的,我从未收到您的任何反馈。

以上是关于在 Python 中使用 Paramiko 从 top 命令收集输出的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Python 和 Paramiko 创建 SSH 隧道?

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

python的paramiko模块

python paramiko模块简介

python中连接linux好用的模块paramiko(附带案例)

paramiko安装和使用