netlt 2021-08-09 18:06 采纳率: 44.4%
浏览 1060
已结题

python paramiko模块如何判断SSH命令已执行完成

这是我定义的一个ssh登陆并使用命令获取执行结果的一个函数,现在使用的是time.sleep() 来保证命令能够执行完成。这样就导致我批量执行的速度就比较慢,请问可否有不使用time.sleep() 方法,使用循环来判断我的命令已执行完成。然后将结果输出到output。
不要使用exec_command方法,这个一次只能执行一条命令。

import paramiko
import time

device_ip = '1.1.1.1'
username = 'luotao'
password = 'luotao'
command1 = 'terminal length 0'
command2 = 'show run'
command3 = 'show tech'

def ssh_exec_command2(device_ip, username, password, command1, command2):
    port = 22
    ssh_client = paramiko.SSHClient()
    ssh_client.load_system_host_keys()
    ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh_client.connect(device_ip, port, username, password, timeout=5)
    print('连接设备 ', device_ip)
    command = ssh_client.invoke_shell()
    command.send(command1+'\n')
    time.sleep(1)
    command.send(command2+'\n')
    time.sleep(50)
    command.send(command3+'\n')
    time.sleep(50)
    output = command.recv(999999)
    ssh_client.close()
    return output

```

  • 写回答

4条回答 默认 最新

  • 咕泡-三木 2021-08-10 17:38
    关注

    本来写了一些思路,但是突然意识到,你要操作的设备可能不是主流linux,对一些命令、语法支持可能不足
    那么我们就从SSH协议上找到突破口


    重点:命令执行完之后执行一次exit


    这样,ssh断开这意味着所有命令执行完毕,如果多个ssh主机批量执行的话,可以通过多线程或者多进行处理,建立多个SSH会话
    代码示例:

    def ssh_exec_command2(device_ip, username, password, command1, command2):
        port = 22
        ssh_client = paramiko.SSHClient()
        ssh_client.load_system_host_keys()
        ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh_client.connect(device_ip, port, username, password, timeout=5)
    
        print("连接设备 ", device_ip)
        channel = ssh_client.invoke_shell()
        stdin = channel.makefile("wb")
        stdout = channel.makefile("rb")
    
        stdin.write(
            f"""
    {command1}
    {command2}
    exit
        """
        )
        print("执行完毕")
        output = stdout.read()
        print("读取完毕")
        ssh_client.close()
        return output
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 8月21日
  • 已采纳回答 8月13日
  • 创建了问题 8月9日

悬赏问题

  • ¥30 Matlab打开默认名称带有/的光谱数据
  • ¥50 easyExcel模板 动态单元格合并列
  • ¥15 res.rows如何取值使用
  • ¥15 在odoo17开发环境中,怎么实现库存管理系统,或独立模块设计与AGV小车对接?开发方面应如何设计和开发?请详细解释MES或WMS在与AGV小车对接时需完成的设计和开发
  • ¥15 CSP算法实现EEG特征提取,哪一步错了?
  • ¥15 游戏盾如何溯源服务器真实ip?需要30个字。后面的字是凑数的
  • ¥15 vue3前端取消收藏的不会引用collectId
  • ¥15 delphi7 HMAC_SHA256方式加密
  • ¥15 关于#qt#的问题:我想实现qcustomplot完成坐标轴
  • ¥15 下列c语言代码为何输出了多余的空格