我正在尝试使用 pexpect 远程使用 gdb。这是我当前的代码:
child = pexpect.spawn("ssh <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="463429293206777f746877707e6875687776" rel="noreferrer noopener nofollow">[email protected]</a> \"gdb\"")
child.logfile = sys.stdout
child.expect("password:")
child.sendline("xxxx")
child.expect("(gdb)")
child.sendline("attach 9813")
child.expect("(gdb)")
child.sendline("info registers")
child.expect("(gdb)")
child.sendcontrol('c')
这是我的控制台输出的一部分:
(...)
GNU gdb (GDB) 7.4.1-debian
(...)
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb) attach 9813
info registers
test@test-virtual-machine:~$
虽然我期望这样的事情:
(...)
GNU gdb (GDB) 7.4.1-debian
(...)
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb) attach 9813
<Attaching...>
(gdb) info registers
<Registers info displayed...>
(gdb) <Ctrl+C is done>
test@test-virtual-machine:~$
因此,问题似乎是在匹配第一个 (gdb)
并发送第一个命令 attach 9813
后,pexpect 并不期望第二个 (gdb)
行发送新命令info registers
。它再次看到第一个(gdb)
,进行匹配,然后发送第二个命令,而无需等待直到第一个命令被执行(直到我们附加到所需的进程)。
如何让它只分析以下输出?不匹配之前的输出两次? 我看到了这样的 ftp 服务器示例:
child = pexpect.spawn('ftp ftp.openbsd.org')
child.expect('(?i)name .*: ')
child.sendline('anonymous')
child.expect('(?i)password')
child.sendline('<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="2f5f4a575f4a4c5b6f5c405a5d4c4a49405d484a01414a5b" rel="noreferrer noopener nofollow">[email protected]</a>')
child.expect('ftp> ')
child.sendline('cd /pub/OpenBSD/3.7/packages/i386')
child.expect('ftp> ')
child.sendline('bin')
child.expect('ftp> ')
child.sendline('prompt')
据我了解,这里 pexpect 设法按要求的顺序对 ftp> 使用react并连续发送命令。我的代码似乎很相似。
我也尝试过刷新标准输出,但没有成功。
最佳答案
GDB 似乎有时会在命令输出之前再次显示提示。您正在匹配第一个提示,发送命令,然后在显示结果之前立即匹配“过早”提示。这意味着最后的 Control-C 在显示“信息寄存器”的结果之前发送,但脚本的其余部分似乎可以工作。
解决方案是在发送下一个命令之前匹配任何预期的输出。
关于python - 当匹配旧输出中的字符串时,pexpect python 模块的expect方法会中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24881362/