“\ r”在以下脚本中有什么作用?

时间:2013-01-30 14:51:06

标签: python telnet

我使用以下脚本使用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中运行此脚本。

6 个答案:

答案 0 :(得分:24)

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


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

  

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

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

  
      
  1. ...

  2.   
  3. 在Net-ASCII中,除非立即遵循,否则不得出现CR     通过NUL或LF,后者(CR LF)指定“新的     行“功能。今天和如上所述,CR应该     通常仅在LF后面出现。因为页面布局     在其他方面做得更好,因为NUL有一个特殊的     一些编程语言的解释,并避免其他     混淆类型,CR NUL应该最好避免     上面指定的。

  4.   
  5. LF CR不应出现,除非作为多个CR LF的副作用     序列(例如,CR LF CR LF)。

  6.   

因此,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)字符。

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

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

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

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

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

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

答案 3 :(得分:2)

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

在打字机的旧时代,你必须移动回写到行首的马车,并向下移动该行以便写入下一行。

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

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

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

你可以在其他一些答案中看到这个例子,但最常见的是:

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

和其他一些程序也有特定用途。

了解有关history of these characters

的更多信息

答案 4 :(得分:0)

它是回车控制字符。 http://en.wikipedia.org/wiki/Carriage_return

答案 5 :(得分:0)

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