如何使用 pexpect 响应 CLI 上的命令问题?
How to respond to command questions on a CLI using pexpect?
我正在使用 Python 并希望自动化网络设备的 CLI 界面。
问题是我无法使用 pexpect 发送需要 "yes"/"no" 确认的命令。
我认为发生这种情况是因为预期与问题不匹配。
child = pexpect.spawn ('ssh -p <port> user@192.168.1.1')
child.expect ("password: ")
child.sendline ('userPass')
child.expect ('> ')
child.sendline('show')
child.expect('> ')
logging.info(child.before)
# works fine untill now - it connects to the box and prints the show output
child.sendline ('reset')
logging.info(child.before)
# this command prints the same thing as previous child.before
logging.info('This line gets printed.')
child.expect ("<additional text> Are You sure? [no,yes] ")
logging.info('This line does not get printed.')
child.sendline ('yes')
试试这个:
import re
child.expect( re.escape("<additional text> Are You sure? [no,yes] ") )
我认为(但现在没有检查文档)pexpect 将文本作为正则表达式处理。这对于匹配不一定是常量的事物很有用。但是,这确实意味着当您想要匹配在正则表达式语法中有意义的字符(例如“?”、“[”和“]”)时,您需要相应地转义它们。
转义预期文本后,"yes" 仍未 accepted/sent 到设备。
我通过在 "yes":
之后发送附加行 ('') 解决了这个问题
child.sendline ('yes')
child.sendline('')
[]?
是正则表达式元字符(它们具有特殊含义并且不按字面匹配)。为避免将模式解释为正则表达式,请改用 child.expect_exact(your_pattern)
。
我正在使用 Python 并希望自动化网络设备的 CLI 界面。 问题是我无法使用 pexpect 发送需要 "yes"/"no" 确认的命令。 我认为发生这种情况是因为预期与问题不匹配。
child = pexpect.spawn ('ssh -p <port> user@192.168.1.1')
child.expect ("password: ")
child.sendline ('userPass')
child.expect ('> ')
child.sendline('show')
child.expect('> ')
logging.info(child.before)
# works fine untill now - it connects to the box and prints the show output
child.sendline ('reset')
logging.info(child.before)
# this command prints the same thing as previous child.before
logging.info('This line gets printed.')
child.expect ("<additional text> Are You sure? [no,yes] ")
logging.info('This line does not get printed.')
child.sendline ('yes')
试试这个:
import re
child.expect( re.escape("<additional text> Are You sure? [no,yes] ") )
我认为(但现在没有检查文档)pexpect 将文本作为正则表达式处理。这对于匹配不一定是常量的事物很有用。但是,这确实意味着当您想要匹配在正则表达式语法中有意义的字符(例如“?”、“[”和“]”)时,您需要相应地转义它们。
转义预期文本后,"yes" 仍未 accepted/sent 到设备。 我通过在 "yes":
之后发送附加行 ('') 解决了这个问题child.sendline ('yes')
child.sendline('')
[]?
是正则表达式元字符(它们具有特殊含义并且不按字面匹配)。为避免将模式解释为正则表达式,请改用 child.expect_exact(your_pattern)
。