【问题标题】:python telnet not pressing enter with "\n"python telnet没有按“\ n”输入
【发布时间】:2020-08-06 07:46:15
【问题描述】:

我正在编写一个脚本以从 GNS3 中的 Cisco 设备中提取配置。由于另一个单独的问题,目前它正在使用硬编码的 IP 和端口,但这是我目前正在使用的代码。

import getpass
import telnetlib

print "Getting running-config 127.0.0.1:5002"
tn = telnetlib.Telnet("127.0.0.1","5002")

tn.write("terminal length 0\n")
tn.write("show run\n")
tn.write("exit\n")

readoutput = tn.read_until("exit")
saveoutput = open("C:\Programdata\switch.txt","w")
saveoutput.write(readoutput)
saveoutput.write("\n")
saveoutput.close
print tn.read_all()

如果我注释掉 readouputsaveoutput 代码块,脚本会以我预期的速度运行。然而,一旦我把那个代码留在里面,它就会挂起。我已将 print() 命令放入以进行验证,它挂在 readoutput 行上。我试过tn.read_alltn.read_until (不带和不带字符串参数),但都不起作用。

即使读取输出不工作,我也知道发生了一些事情,因为如果我在命令提示符下使用telnet 127.0.0.1 5002 telnet 进入交换机,它会毫无问题地出现,并且能够通过我的终端命令进行。

编辑: 我今天对此进行了更多测试,并通过使用大量睡眠定时器并打印到终端发现了发生了什么。事实证明,由于某种原因,telnet 会话实际上并没有按回车键。我尝试将tn.write("text\n") 更改为tn.write("text" + "\n"),甚至将其拆分为两个写命令,但都不起作用。下面是我在尝试使脚本工作失败后打开的 telnet 会话。注意所有的命令都排在那里?如果我将读取输出更改为查找“xit”,它是 ios 控制台第一行上的文本,那么它将在 telnet 中找到它并打印 telnet 会话中的所有内容。

如果有人知道为什么"\n" 实际上没有按回车键,我将非常感谢您的帮助,因为这应该是我使该脚本成为工作的一部分的最后一个主要障碍。

【问题讨论】:

    标签: python python-3.x telnetlib cisco-ios


    【解决方案1】:

    这种行为的原因是因为\n 实际上不是回车 (CR) - 它是字符串中的换行 (LF),并且不同的系统可能有不同的 EOL 实现(最明显的例子是 Linux 的 \n与 Windows 的 \r\n)。在Cisco IOS的情况下,似乎\r就足够了,虽然我目前无法验证。

    尝试添加\r\n,因为这是根据规范的默认 Telnet 行为,应该可以。

    【讨论】:

    • 非常感谢!这与对脚本其余部分的一些额外调整完美配合。
    【解决方案2】:

    您的所有代码都是 True 并且两者都是:

    tn.write("文本\n")

    tn.write("text" + "\n")

    是真的。 b 仅缺少一个:

    你的代码应该是这样的:

    tn.write(b"en" + b"\n")
    tn.write(b"terminal length 0\n")
    tn.write(b"show run\n")
    tn.write(b"exit\n")
    

    【讨论】:

    • 写行中的“b”是什么意思?如果这是一个愚蠢的问题,我深表歉意,但我正在尝试自学 Python,同时在一个项目中使用它,而且截止日期很快。
    • 当您将字符串发送到您的 Cisco 设备时,它不知道输入,因此您应该发送 Byte 字符串,使用 'b' 您的字符串更改为 byte 并且您的 Cisco 设备可以读取它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-25
    • 2014-09-18
    • 1970-01-01
    • 2015-12-30
    • 2011-08-30
    相关资源
    最近更新 更多