Wat doet “\r” in het volgende script?

Ik gebruik het volgende script om mijn router opnieuw op te starten met 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")

Ik weet niet waarom, maar door “\r” uit bovenstaande code te verwijderen, werkt het script niet meer. Dus wat doet “\r” in dit script en wanneer moet “\r” in het algemeen worden gebruikt?

Opmerking: ik weet van “Carriage Return” maar kon het gebruik ervan in mijn script nog steeds niet achterhalen. Ik voer dit script uit in Linux.


Antwoord 1, autoriteit 100%

Het '\r'-teken is de regelterugloop en het paar regelterugloop-nieuweregel is beide nodig voor nieuwe regel in een virtuele netwerkterminalsessie.


Van de oude telnet-specificatie (RFC 854)(pagina 11):

De volgorde “CR LF”, zoals gedefinieerd, zorgt ervoor dat de NVT
gepositioneerd aan de linkermarge van de volgende afdrukregel (zoals zou,
bijvoorbeeld de reeks “LF CR”).

Echter, uit de nieuwste specificatie (RFC5198)(pagina 13):

  1. In Net-ASCII MOET CR NIET verschijnen, behalve wanneer deze onmiddellijk wordt gevolgd
    door NUL of LF, waarbij de laatste (CR LF) de “nieuwe”
    line” functie. Vandaag en zoals hierboven gespecificeerd, zou CR
    verschijnen over het algemeen alleen wanneer gevolgd door LF. Omdat pagina-indeling
    kan beter op andere manieren, want NUL heeft een special
    interpretatie in sommige programmeertalen, en om andere te vermijden
    soorten verwarring, moet CR NUL bij voorkeur worden vermeden omdat:
    hierboven gespecificeerd.

  2. LF CR MAG NIET verschijnen, behalve als een bijwerking van meerdere CR LF
    sequenties (bijv. CR LF CR LF).

Dus de nieuwe regel in Telnet moet altijd '\r\n'zijn, maar de meeste implementaties zijn niet bijgewerkt of behouden de oude '\n\r'voor achterwaartse compatibiliteit.


Antwoord 2, autoriteit 37%

'\r'betekent ‘carriage return’ en het is vergelijkbaar met '\n'wat ‘regeleinde’ of meer algemeen ‘nieuwe regel’ betekent

In de oude dagen van typemachines moest je de wagen die schrijft terug naar het begin van de regel verplaatsen en de regel naar beneden verplaatsen om naar de volgende regel te kunnen schrijven.

in het moderne computertijdperk hebben we deze functionaliteit nog steeds om meerdere redenen. maar meestal gebruiken we alleen '\n'en gaan er automatisch vanuit dat we vanaf het begin van de regel willen beginnen met schrijven, omdat het anders weinig zin zou hebben.

Er zijn echter momenten waarop we ALLEEN de '\r'willen gebruiken en dat zou zijn als ik iets naar een uitvoer wil schrijven, en in plaats van naar een nieuwe regel en iets anders schrijven, ik wil iets schrijven over wat ik al heb geschreven, dit is hoeveel programma’s in linux of in de Windows-opdrachtregel ‘voortgangs’-informatie kunnen hebben die op dezelfde regel verandert.

tegenwoordig gebruiken de meeste systemen alleen de '\n'om een nieuwe regel aan te duiden. maar sommige systemen gebruiken beide samen.

u kunt hiervan voorbeelden zien in sommige van de andere antwoorden, maar de meest voorkomende zijn:

  • windows eindigt regels met '\r\n'
  • mac beëindigt regels met '\r'
  • unix/linux gebruiken '\n'

en sommige andere programma’s hebben er ook specifieke toepassingen voor.

voor meer informatie over de geschiedenis van deze karakters


Antwoord 3, autoriteit 16%

\ris het ASCII Carriage Return(CR)-teken .

Er zijn verschillende newline-conventies die door verschillende besturingssystemen worden gebruikt. De meest voorkomende zijn:

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

De \n\r(LF+CR) ziet er onconventioneel uit.

edit:Mijn lezing van de Telnet RFCsuggereert dat:

  1. CR+LF is de standaard nieuwe regelreeks die wordt gebruikt door het telnet-protocol.
  2. LF+CR is een acceptabele vervanging:

De volgorde “CR LF”, zoals gedefinieerd, zorgt ervoor dat de NVT
gepositioneerd aan de linkermarge van de volgende afdrukregel (zoals zou,
bijvoorbeeld de reeks “LF CR”).


Antwoord 4

Eigenlijk heeft dit niets te maken met het gebruikelijke Windows / Unix \r\nvs \nprobleem. Het TELNET-protocol definieert zelf \r\nals de end-of-line-reeks, onafhankelijk van het besturingssysteem. Zie RFC854.

Other episodes