python telnet 没有按“\n”回车

python telnet not pressing enter with "\n"

我正在编写脚本以从 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(没有和没有字符串参数),但都不起作用。

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

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

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

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

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

您的所有代码都是正确的,而且:

tn.write("text\n")

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

是真的。只缺少一个 b :

Your code should be like this :

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