我使用以下脚本使用Telnet重新启动路由器:
#!/usr/bin/env python
import os
import telnetlib
from time import sleep
host = "192.168.1.1"
user = "USER"
password = "PASSWORD"
cmd = "system restart"
tn = telnetlib.Telnet(host)
sleep(1)
tn.read_until("Login: ")
tn.write(user + "\n\r")
sleep(1)
tn.read_until("Password: ")
tn.write(password + "\n\r")
sleep(1)
tn.write(cmd + "\n\r")
我不知道为什么但是从上面的代码中删除“\ r”会使脚本无法正常工作。那么“\ r”在这个脚本中做什么以及何时一般使用“\ r”?
注意:我知道“回车”,但仍然无法弄清楚它在我的脚本中的用途。我在Linux中运行此脚本。
答案 0 :(得分:24)
'\r'
字符是回车符,并且网络虚拟终端会话中的换行符都需要回车 - 换行符对。
来自old telnet specification (RFC 854)(第11页):
定义的序列“CR LF”将导致NVT 位于下一个打印行的左边缘(如同 例如,序列“LF CR”)。
但是,从latest specification (RFC5198)(第13页):
...
在Net-ASCII中,除非立即遵循,否则不得出现CR 通过NUL或LF,后者(CR LF)指定“新的 行“功能。今天和如上所述,CR应该 通常仅在LF后面出现。因为页面布局 在其他方面做得更好,因为NUL有一个特殊的 一些编程语言的解释,并避免其他 混淆类型,CR NUL应该最好避免 上面指定的。
- 醇>
LF CR不应出现,除非作为多个CR LF的副作用 序列(例如,CR LF CR LF)。
因此,Telnet中的换行符应始终为'\r\n'
,但大多数实现都未更新,或保留旧的'\n\r'
以实现向后兼容。
答案 1 :(得分:4)
不幸的是,我还不准
添加评论,但我建议你也采取
看看:
http://docs.python.org/release/2.2.3/ref/strings.html
这解释了所有转义字符
答案 2 :(得分:3)
\r
是ASCII Carriage Return(CR)字符。
不同的操作系统使用不同的换行符约定。最常见的是:
\r\n
); \n
); \r
)。 \n\r
(LF + CR)看起来非常规。
编辑:我对Telnet RFC的阅读表明:
定义的序列“CR LF”将导致NVT 位于下一个打印行的左边缘(如同 例如,序列“LF CR”)。
答案 3 :(得分:2)
'\r'
表示“回车”,类似于'\n'
,表示“换行”或更常见的“换行”
在打字机的旧时代,你必须移动回写到行首的马车,并向下移动该行以便写入下一行。
在现代计算机时代,由于多种原因,我们仍然拥有此功能。但大多数情况下我们只使用'\n'
并自动假设我们想从行的开头开始写,因为否则没有多大意义。
然而,有些时候我们想要使用J '\r'
,如果我想在输出中写一些内容,而不是下到新行并写下其他内容,我想写一些关于我已经写过的东西,这是linux或windows命令行中有多少程序能够在同一行上改变“进度”信息。
现在大多数系统仅使用'\n'
来表示换行符。但有些系统同时使用它们。
你可以在其他一些答案中看到这个例子,但最常见的是:
'\r\n'
'\r'
'\n'
和其他一些程序也有特定用途。
的更多信息答案 4 :(得分:0)
答案 5 :(得分:0)
实际上,这与通常的Windows / Unix \r\n
vs \n
问题无关。 TELNET procotol本身将\r\n
定义为行尾序列,与操作系统无关。请参阅RFC854。