我正在编写一个库来支持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()没有按预期工作。
答案 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()
完成它的工作。