web-dev-qa-db-fra.com

Que fait "\ r" dans le script suivant?

J'utilise le script suivant pour redémarrer mon routeur à l'aide de 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")

Je ne sais pas pourquoi mais en supprimant "\ r" du code ci-dessus, le script ne fonctionne pas. Alors que fait "\ r" dans ce script et quand utiliser "\ r" en général?

Remarque: Je connais "Carriage Return" mais je ne pouvais toujours pas comprendre son utilisation dans mon script. J'exécute ce script sous Linux.

18
Alinwndrld

Le '\r' est le retour chariot, et la paire retour chariot-nouvelle ligne est nécessaire pour la nouvelle ligne dans une session de terminal virtuel réseau.


À partir de ancienne spécification telnet (RFC 854) (page 11):

La séquence "CR LF", telle que définie, amènera le NVT à être positionné sur la marge gauche de la ligne d'impression suivante (comme le serait par exemple la séquence "LF CR").

Cependant, à partir de dernière spécification (RFC5198) (page 13):

  1. ...

  2. En Net-ASCII, CR NE DOIT PAS apparaître sauf lorsqu'il est immédiatement suivi par NUL ou LF, ce dernier (CR LF) désignant la fonction "nouvelle ligne". Aujourd'hui et comme spécifié ci-dessus, CR ne devrait généralement apparaître que lorsqu'il est suivi par LF. Parce que la mise en page est mieux effectuée par d'autres moyens, parce que NUL a une interprétation spéciale dans certains langages de programmation, et pour éviter d'autres types de confusion, CR NUL doit de préférence être évité comme spécifié ci-dessus.

  3. LF CR NE DEVRAIT PAS apparaître sauf comme effet secondaire de plusieurs séquences CR LF (par exemple, CR LF CR LF).

Donc, la nouvelle ligne dans Telnet doit toujours être '\r\n' mais la plupart des implémentations n'ont pas été mises à jour ou conservent l'ancienne '\n\r' pour une compatibilité ascendante.

28

'\r' signifie 'retour chariot' et est similaire à '\n' ce qui signifie "saut de ligne" ou plus communément "nouvelle ligne"

dans l'ancien temps des machines à écrire, vous deviez déplacer le chariot qui écrit au début de la ligne et déplacer la ligne vers le bas afin d'écrire sur la ligne suivante.

à l'ère informatique moderne, nous avons encore cette fonctionnalité pour plusieurs raisons. mais surtout nous n'utilisons que '\n' et supposons automatiquement que nous voulons commencer à écrire depuis le début de la ligne, car cela n'aurait pas beaucoup de sens autrement.

cependant, il y a des moments où nous voulons utiliser JUSTE le '\r' et ce serait si je veux écrire quelque chose sur une sortie, et au lieu de descendre sur une nouvelle ligne et d'écrire autre chose, je veux écrire quelque chose sur ce que j'ai déjà écrit, c'est le nombre de programmes sous linux ou dans la ligne de commande windows sont capables d'avoir des informations de "progression" qui changent sur la même ligne.

de nos jours, la plupart des systèmes utilisent uniquement le '\n' pour désigner une nouvelle ligne. mais certains systèmes utilisent les deux ensemble.

vous pouvez voir des exemples de cela dans certaines des autres réponses, mais les plus courantes sont:

  • windows termine les lignes avec '\r\n'
  • mac termine les lignes avec '\r'
  • utilisation unix/linux '\n'

et certains autres programmes ont également des utilisations spécifiques pour eux.

pour plus d'informations sur le historique de ces personnages

4
Inbar Rose

\r est le caractère ASCII Retour chariot (CR).

Il existe différentes conventions de nouvelle ligne utilisées par différents systèmes d'exploitation. Les plus courants sont:

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

Le \n\r (LF + CR) ne semble pas conventionnel.

edit: Ma lecture du Telnet RFC suggère que:

  1. CR + LF est la séquence de saut de ligne standard utilisée par le protocole telnet.
  2. LF + CR est un substitut acceptable:

La séquence "CR LF", telle que définie, amènera le NVT à être positionné sur la marge gauche de la ligne d'impression suivante (comme le serait par exemple la séquence "LF CR").

3
NPE

c'est le caractère de contrôle de retour chariot. http://en.wikipedia.org/wiki/Carriage_return

0
Andreas Frische

En fait, cela n'a rien à voir avec Windows/Unix \r\n contre \n problème. Le procotol TELNET définit lui-même \r\n comme séquence de fin de ligne, indépendamment du système d'exploitation. Voir RFC854 .

0
isedev