誰もがtelnetlib.expect()で運が良かったですか?
質問
私は、リモートサーバーへのTelnetのサポートとアプリを実行するライブラリを書いています。
接続を確立したり、データを元に戻したり、解析したりするなど、物事は泳いでいます。
1つのアプリが適切に入力すると、カーソルが変更されるか、失敗した場合は元のカーソルを残します(アプリを書くのではなく、使用する必要があります)。
上記のアプリが正しく起動すると、これは問題なく動作します。
promptB = "hello(x)# " # Yes, the space at the end is intentional
response = tn_conn.cmd("app_name\n", prompt=promptB)
迅速な変更(または迅速な変更の欠如)を使用して、プログラムが開始に失敗したかどうかを検出したいと思います。私はこれがTelnetlibのexpect()を試す絶好の機会になると考えました。
しかし、私はこれを機能させることはできません:
promptA = "hello(x)# " # Yes, the space at the end is intentional
promptB = "hello> " # Yes, the space at the end is intentional
tn_conn.write("app_name\n")
which_prompt, mo, response = self.tn_conn.expect([promptA, promptB], timeout=3)
アプリが成功するかどうかにかかわらず、期待コマンドは常に時が登場します。
which = "-1"
MO =なし
応答= "マンブルマンブル r r n他のもの r n r nhello#"
ドキュメントは、文字列またはregexオブジェクトのいずれかを渡すことができると言っているので(私は文字列を渡します)、何かが足りないのですか? Telnetlibコードを見ると、re.match()ではなくre.search()を呼び出していることが示されているため、問題ではないようです。
誰かが私が間違っていることについて提案を提供してもらえますか?
編集Parensを迅速な例に追加して、期待どおりに機能していない理由をよりよく説明します。
解決 3
以前の試みでは、私は配置することによってregexオプションを追求していました .*
私の検索文字列の両端で、そして re.compile()
それを渡す前に検索文字列に .expect()
;運がない。
Jathanismの提案のおかげで、私はRegexを使用して再検討しました。 expect()
あったのは、「文字列」を考えていた「Regex」を期待していました。
案の定、私のプロンプトの文字列には、正規表現シンボルとして扱っていたキャラクターがありました - ()
正確に言うと。パレンスを逃がす expect()
その仕事をしてください。
他のヒント
PythonでRegexを使用している場合は、いつでもRawを使用できます(r'my string'
)すべてのエスケープを追加するのではなく、方法。読みやすくします。
私は何か仕事をしました。 #または%または$のプロンプトを探してください。あなたのプロンプトについては、特殊なキャラクターが逃げられていることを確認してください。 ()。確かに逃げるかもしれません。
idx, obj, response = tn_conn.expect("\#","\%","\$",3)