netlt 2024-05-15 09:58 采纳率: 44.4%
浏览 13
已结题

python telnet获取命令结果中有空行的问题


import os
import telnetlib
import tempfile
import time

username = 'luotao'
password = 'xxxxxxx'
command1 = 'show run'
command2 = 'quit'
device_ip = '10.160.3.201'
client = telnetlib.Telnet(device_ip, port=23)  # 生成一个telnet对象
client.write(username.encode('ascii') + b"\n")
client.write(password.encode('ascii') + b"\n")
if command1:  # 如果有这个自动翻页命令的话
    client.write(command1.encode('ascii') + b"\n")
client.write(command2.encode('ascii') + b"\n")
time.sleep(1)
output = client.read_very_eager()
client.close()

fd, config_file = tempfile.mkstemp(text=True)  # 创建一个临时文件,[1]表示临时文件的绝对路径
# temp_file.mkstemp 返回的是两个参数,一个是fd,一个是f_name,fd是文件描述符,f_name是指生成的文件的绝对路径。
with open(config_file, "w", encoding="utf-8") as f:  # 打开这个临时文件
    f.write(output.decode("utf-8"))  # 写入配置
    print(f)
os.close(fd)

结果:
<_io.TextIOWrapper name='C:\Users\SZ-IT-~1\AppData\Local\Temp\tmp0j93b6az' mode='w' encoding='utf-8'>

打开生成的临时文件
C:\Users\SZ-IT-~1\AppData\Local\Temp\tmp0j93b6az
发现获取的结果里面,每一行下面都新增了一个空行

img

我初步了解,read_very_eager()获取的二进制代码,换行代码是\r\n,可能是这个原因导致了多出了一行。
我不需要这些空行,请问有办法解决吗?

  • 写回答

8条回答 默认 最新

  • 阿齐Archie 嵌入式领域优质创作者 2024-05-15 09:58
    关注

    以下参考免费微信小程序:皆我百晓生 作答,并由阿齐Archie整理回复,若还有疑问可评论或留言。

    您的问题确实与换行符有关。在 Telnet 交互中,设备可能会发送带有 \r\n 的换行符,这可能导致在读取输出时出现额外的空行。为了解决这个问题,您可以在将输出写入临时文件之前,将这些换行符替换为单个换行符 \n。以下是修改后的代码:

    import os
    import telnetlib
    import tempfile
    import time
    
    username = 'luotao'
    password = 'xxxxxxx'
    command1 = 'show run'
    command2 = 'quit'
    device_ip = '10.160.3.201'
    client = telnetlib.Telnet(device_ip, port=23)  # 生成一个telnet对象
    client.write(username.encode('ascii') + b"\n")
    client.write(password.encode('ascii') + b"\n")
    if command1:  # 如果有这个自动翻页命令的话
        client.write(command1.encode('ascii') + b"\n")
    client.write(command2.encode('ascii') + b"\n")
    time.sleep(1)
    output = client.read_very_eager()
    client.close()
    
    # 替换换行符 \r\n 为 \n
    output = output.replace(b'\r\n', b'\n')
    
    fd, config_file = tempfile.mkstemp(text=True)  # 创建一个临时文件
    with open(config_file, "w", encoding="utf-8") as f:  # 打开这个临时文件
        f.write(output.decode("utf-8"))  # 写入配置
        print(f)
    os.close(fd)
    

    这段代码首先使用 replace 方法将 \r\n 替换为 \n,然后再将其写入文件。这样,您生成的临时文件中就不会包含额外的空行了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(7条)

报告相同问题?

问题事件

  • 系统已结题 5月23日
  • 已采纳回答 5月15日
  • 创建了问题 5月15日

悬赏问题

  • ¥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没有进入