任何人都有运气telnetlib.expect()?

时间:2011-10-18 23:28:54

标签: python telnetlib

我正在编写一个库来支持telnet到远程服务器和运行应用程序。

在建立连接,获取数据,解析等方面,事情正在顺利进行(至少与通过文本界面与程序进行通信一样流畅)。

如果光标正确输入,一个应用程序将更改光标,如果光标失败则保留原始光标(我不编写应用程序,我只需要使用它们。)

当所述应用程序正确启动时,这没有问题:

promptB = "hello(x)# "   # Yes, the space at the end is intentional
response = tn_conn.cmd("app_name\n", prompt=promptB)

我想使用提示更改(或缺少快速更改)来检测程序是否无法启动。我认为这是尝试telnetlib的expect()的绝佳机会,因为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)

对于应用程序是否成功启动,expect命令总是超时。

which =“ - 1”

mo =无

response =“mumble mumble \ r \ n \ r \ n \ n其他东西\ r \ n \ r \ n \ n \ n \ n \ n”

文档说字符串或正则表达式对象可以传递给expect(我传递一个字符串),所以我错过了什么?看看telnetlib代码显示它调用re.search(),而不是re.match(),所以这似乎不是问题。

有人可以就我的错误提出建议吗?

修改 在提示示例中添加了parens,以更好地说明为什么expect()没有按预期工作。

3 个答案:

答案 0 :(得分:4)

不要忘记,如果你在python中使用正则表达式,你总是可以使用原始(r'my string')方法,而不是添加所有的转义;使它更具可读性。

答案 1 :(得分:3)

我得到了一些工作。寻找#或%或$提示。至于提示,请确保转义特殊字符。 ()。也许只是为了确保逃避一切。

idx, obj, response = tn_conn.expect("\#","\%","\$",3)

答案 2 :(得分:2)

在之前的尝试中,我通过在搜索字符串的两端放置.*以及在将搜索字符串re.compile()传递给.expect()之前将{/ 1}}传递给{{}来追求正则表达式选项。 1}};一切都没有运气。

感谢jathanism的建议,我使用正则表达式进行了重新检查,这次考虑expect(),呃...期待'正则表达式',我在想'字符串'。

果然,我的提示字符串中有一些字符可以用作正则表达式符号 - ()是准确的。逃离这些问题让expect()完成它的工作。