次のスクリプトを使用して、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でこのスクリプトを実行しています。
'\r'
文字はキャリッジリターンであり、ネットワーク仮想端末セッションの改行にはキャリッジリターンと改行のペアの両方が必要です。
古いtelnet仕様(RFC 854) (11ページ)から:
定義されたシーケンス「CR LF」は、NVTを次の印刷行の左マージンに配置します(例えば、シーケンス「LF CR」のように)。
ただし、 最新の仕様(RFC5198) から(13ページ):
...
Net-ASCIIでは、直後にNULまたはLFが続く場合を除き、CRは表示されてはならず、後者(CR LF)は「改行」機能を指定します。現在、上記で指定されているように、CRは通常、LFが後に続く場合にのみ表示されます。 NULには一部のプログラミング言語で特別な解釈があり、他のタイプの混乱を避けるために、ページレイアウトは他の方法でより適切に行われるため、上記のようにCR NULを避けることが望ましいです。
LF CRは、複数のCR LFシーケンス(たとえば、CR LF CR LF)の副作用として以外に表示されるべきではありません。
したがって、Telnetの改行は常に'\r\n'
しかし、ほとんどの実装は更新されていないか、古い'\n\r'
後方互換性のため。
'\r'
は「キャリッジリターン」を意味し、「改行」またはより一般的には「改行」を意味する'\n'
に似ています。
昔のタイプライターでは、行の先頭に書き戻すキャリッジを移動し、次の行に書き込むために行を下に移動する必要がありました。
現代のコンピューター時代には、いくつかの理由でこの機能がまだあります。しかし、ほとんどの場合、'\n'
のみを使用し、行の先頭から書き込みを開始することを自動的に想定します。
ただし、'\r'
だけを使用したい場合があります。それは、出力に何かを書きたい場合や、新しい行に行って別の何かを書く代わりに、私がすでに書いたものの上に何かを書いてください、これはLinuxまたはWindowsのコマンドラインでいくつのプログラムが同じ行で変化する「進行」情報を持つことができるかです。
現在、ほとんどのシステムは'\n'
のみを使用して改行を示しています。しかし、一部のシステムは両方を一緒に使用します。
他の回答のいくつかでこの例を見ることができますが、最も一般的なものは次のとおりです。
'\r\n'
で行を終了します'\r'
で終了します'\n'
また、他のいくつかのプログラムにもそれらの特定の用途があります。
これらの文字の履歴 の詳細については
\r
はASCII キャリッジリターン (CR)文字です。
さまざまなオペレーティングシステムで使用されるさまざまな改行規則があります。最も一般的なものは次のとおりです。
\r\n
);\n
);\r
)。\n\r
(LF + CR)は型破りに見えます。
edit:Telnet RFC の私の読書はそれを示唆しています:
定義されたシーケンス「CR LF」は、NVTを次の印刷行の左マージンに配置します(例えば、シーケンス「LF CR」のように)。
それは復帰制御文字です。 http://en.wikipedia.org/wiki/Carriage_return
実際、これは通常のWindows/Unixとは関係ありません\r\n
vs \n
問題。 TELNET procotol自体は\r\n
は、オペレーティングシステムに関係なく、行末シーケンスとして。 RFC854 を参照してください。