netlt 2024-07-25 11:15 采纳率: 44.4%
浏览 11
已结题

python SSH连接设备使用STD读配置卡死的问题


# 使用SSH连接设备,使用STD执行多条命令
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=10)
    print('连接设备 ', device_ip)
    channel = ssh_client.invoke_shell()
    stdin = channel.makefile("wb")
    channel.makefile()
    stdout = channel.makefile("rb")
    stdin.write(
        f"""
    {command1}
    {command2}
    quit
        """
    )
    print("执行完毕", device_ip)
    output = stdout.read(999999)
    print("读取完毕", device_ip)
    ssh_client.close()
    return output

我写的SSH连接网络设备读取配置的函数,在windows10操作系统下运行正常,但是在windows2012系统下,运行到 output = stdout.read(999999) 这一步的时候就卡住,需要等10分钟才会反应过来继续往下执行,请问一下是什么原因?

  • 写回答

20条回答 默认 最新

  • GISer Liu 2024-07-25 11:16
    关注

    该回答引用自GPT-3.5, 由博主 GISer Liu 编写:

    问题分析

    用户在使用Python通过SSH连接设备并执行命令时,遇到了在Windows 10系统下运行正常,但在Windows 2012系统下运行到output = stdout.read(999999)时卡住的问题。这个问题可能与系统环境、网络延迟或Paramiko库的实现细节有关。

    解决方案

    1. 检查网络和系统环境

    首先,确保Windows 2012系统的网络连接稳定,并且没有防火墙或其他安全软件阻止SSH连接。

    2. 修改代码以处理可能的延迟

    在Windows 2012系统下,网络延迟或系统响应可能较慢,导致读取输出时卡住。可以通过设置超时时间或使用循环读取输出来解决这个问题。

    3. 修改代码

    以下是修改后的代码,增加了超时处理和循环读取输出的逻辑:

    import paramiko
    import time
    
    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=10)
        print('连接设备 ', device_ip)
        channel = ssh_client.invoke_shell()
        stdin = channel.makefile("wb")
        stdout = channel.makefile("rb")
        stdin.write(
            f"""
        {command1}
        {command2}
        quit
            """
        )
        print("执行完毕", device_ip)
        
        # 循环读取输出,直到通道关闭或超时
        output = ""
        start_time = time.time()
        while not channel.closed or (time.time() - start_time) < 60:  # 设置超时时间为60秒
            if channel.recv_ready():
                output += channel.recv(999999).decode('utf-8')
            else:
                time.sleep(0.1)
        
        print("读取完毕", device_ip)
        ssh_client.close()
        return output
    

    4. 解释修改的原因和方法

    • 超时处理:通过设置超时时间(例如60秒),确保在读取输出时不会无限等待。
    • 循环读取输出:使用循环和channel.recv_ready()方法检查是否有可读取的数据,避免在无数据时卡住。
    • 解码输出:将读取的输出解码为UTF-8格式,确保输出内容正确。

    总结

    通过增加超时处理和循环读取输出的逻辑,可以有效解决在Windows 2012系统下读取SSH输出时卡住的问题。确保网络和系统环境稳定也是解决此类问题的重要步骤。希望这个解决方案能帮助您解决问题。

    如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月25日
  • 创建了问题 7月25日

悬赏问题

  • ¥20 python爬虫遇到空文本取不出来
  • ¥15 x264库中预测模式字IPM、运动向量差MVD、量化后的DCT系数的位置
  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络
  • ¥66 关于川崎机器人调速问题
  • ¥15 winFrom界面无法打开
  • ¥30 crossover21 ARM64版本安装软件问题
  • ¥15 mymetaobjecthandler没有进入