30

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

4

4 回答 4

40

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


旧的 telnet 规范(RFC 854)(第 11 页):

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

但是,从最新规范(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'的以向后兼容。

于 2013-01-30T14:54:37.603 回答
17

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

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

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

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

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

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

  • 窗口结束行'\r\n'
  • mac 以'\r'
  • Unix/Linux 使用'\n'

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

有关这些角色历史的更多信息

于 2013-01-30T14:57:28.557 回答
6

\r是 ASCII回车(CR) 字符。

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

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

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

编辑:我对Telnet RFC的阅读表明:

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

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

于 2013-01-30T14:52:28.927 回答
0

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

于 2013-01-30T14:55:00.207 回答