1

在这里,我正在尝试执行 ssh 命令并打印输出。它工作正常,除了 command 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)    
4

2 回答 2

2

top是一个需要终端的奇特命令。get_pty虽然您可以使用参数 of启用终端仿真SSHClient.exec_command,但使用 ANSI 转义码会给您带来很多垃圾。我不确定你想要那个。

相反,执行top批处理模式:

top -b -n 1

请参阅获取top非交互式 shell 的输出

于 2021-02-01T14:11:46.433 回答
0

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)  
于 2021-02-12T04:24:38.460 回答