【问题标题】:What does "\r" do in the following script?"\r" 在下面的脚本中做了什么?
【发布时间】:2013-01-14 10:24:43
【问题描述】:

我正在使用以下脚本通过 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 中运行这个脚本。

【问题讨论】:

  • 这是一个Carriage return
  • 我用谷歌阅读了关于回车的所有内容,但仍然无法弄清楚它在我上面的脚本中的用途。
  • 我建议你也看看:docs.python.org/release/2.2.3/ref/strings.html 它解释了所有转义字符
  • 这个问题可能也被问到了,因为只打印一个 \r 字符并没有做什么,这是提前行。

标签: python telnet


【解决方案1】:

'\r' 字符是回车符,并且在网络虚拟终端会话中换行符都需要回车换行符对。


来自old telnet specification (RFC 854)(第11页):

定义的序列“CR LF”将导致 NVT 位于下一个打印行的左边距(就像这样, 例如,序列“LF CR”)。

但是,来自latest specification (RFC5198)(第 13 页):

  1. ...

  2. 在 Net-ASCII 中,CR 不得出现,除非紧随其后 通过 NUL 或 LF,后者 (CR LF) 指定“新 行”函数。今天,如上所述,CR 应该 一般只在 LF 之后出现。因为页面布局 用其他方式更好,因为 NUL 有一个特殊的 解释某些编程语言,并避免其他 类型的混淆,最好避免 CR NUL,因为 上面指定的。

  3. LF CR 不应该出现,除非是多个 CR LF 的副作用 序列(例如,CR LF CR LF)。

因此 Telnet 中的换行符应始终为 '\r\n',但大多数实现要么没有更新,要么保留旧的 '\n\r' 以实现向后兼容性。

【讨论】:

  • 是的,很好,但请注意他是如何使用 NL CR 而不是 CR NL... ;)
  • @ClassStacker "\r\n" 是传统版本,但反之亦然。
  • ;) 只是想说明这一点; OP 似乎不知道 EOL 要求...
【解决方案2】:

'\r' 表示“回车”,类似于'\n',表示“换行”或更常见的“换行”

在打字机的旧时代,您必须将写字的马车移回行首,然后将行向下移动才能写到下一行。

在现代计算机时代,出于多种原因,我们仍然拥有此功能。但大多数情况下,我们只使用'\n',并自动假设我们想从行首开始写作,否则就没有多大意义了。

但是,有时我们只想使用 '\r',如果我想在输出中写一些东西,而不是下一行写其他东西,我想要在我已经写过的内容上写一些东西,这就是 linux 或 windows 命令行中有多少程序能够在同一行上更改“进度”信息。

现在大多数系统只使用'\n' 来表示换行符。但有些系统同时使用两者。

您可以在其他一些答案中看到这方面的示例,但最常见的是:

  • windows 以'\r\n' 结束行
  • mac 以'\r' 结束行
  • unix/linux 使用'\n'

还有一些其他程序也有它们的特定用途。

有关history of these characters的更多信息

【讨论】:

  • 对不起,但不同意。是 TELNET 协议本身需要\r\n(定义为协议中的行尾序列)。见RFC854
  • @isedev 我不确定您的评论与我的回答有何关联。我认为您对错误答案的评论,或者请进一步解释自己。
  • 不过,我还是说 \r\n 是 defined,尽管 \n\r 也可以工作。
  • @Inbar:只是意味着在这种情况下它与操作系统无关。它由 TELNET 协议规范定义,独立于操作系统。
  • @InbarRose 有点话题,但关于您的评论 \r 类似于 \n。我认为它们在(我猜至少是 linux)上是不同的。查看示例:print "bbb\raaaa" # output : aaaa print "__bbb\raaaa" # output : aaaab print "_____bbb\raaaa" # output : aaaa_bbb 这里 \r 是信号行尾,光标移动到行首,随后的字符从那里打印。
【解决方案3】:

\r 是 ASCII Carriage Return (CR) 字符。

不同的操作系统使用不同的换行符约定。最常见的是:

  • CR+LF (\r\n);
  • LF (\n);
  • CR (\r)。

\n\r (LF+CR) 看起来非常规。

编辑:我对@9​​87654322@ 的阅读表明:

  1. CR+LF 是 telnet 协议使用的标准换行符序列。
  2. LF+CR 是可接受的替代品:

定义的序列“CR LF”将导致 NVT 位于下一个打印行的左边距(就像这样, 例如,序列“LF CR”)。

【讨论】:

  • 对不起,但不同意。是 TELNET 协议本身需要\r\n(定义为协议中的行尾序列)。见RFC854
  • @isedev:我在 RFC 中看到很多提及 CR LF,而只有一次提及 LF CR。你能指出一个特定的页面/部分吗?
  • 阅读障碍确实意味着通常的\r\n。更正了 cmets 和答案。我的意思是它实际上与操作系统无关,而是 TELNET 协议本身(即 Linux 上的 TELNET 和 Windows 上的 TELNET 需要)。
【解决方案4】:

实际上,这与通常的 Windows / Unix \r\n vs \n 问题无关。 TELNET 协议本身将\r\n 定义为行尾序列,独立于操作系统。见RFC854

【讨论】:

  • 嗯,不; TELNET 将 CR LF 又名 \r\n 定义为行尾序列。
  • 每个人都开始教我关于回车的知识,我已经知道了,并开始在没有回答的情况下对我的问题投反对票。我认为您对 Telnet 的看法是正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-03
  • 1970-01-01
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
  • 2018-05-05
  • 2016-06-20
相关资源
最近更新 更多