如何使 pexpect 命令在我的程序中没有 interact() 的情况下执行

How to make pexpect commands execute without interact() in my program

我有一个使用 pexpect 的 python 函数,看起来像这样:

  def executeCommandWithOtherUser(command):
    p = pexpect.spawn('su', ['otherUser'])
    p.expect('Password:')
    p.sendline('1234')
    prompt = '.*$'
    p.expect(prompt)
    p.sendline(command)

    #p.interact()
    p.close()
    return

当我尝试这段代码时,它没有执行命令(使用例如 touch x.txt 进行测试)。如果启用 pexpect 日志记录,我可以看到该命令,但程序完成后什么也没有发生。如果我用 p.interact() 取消注释行,它确实有效。但是,这将控制权交给了用户,我需要手动退出程序。

为什么函数不执行没有交互的命令?我该怎么做才能让它发挥作用?

您在输入密码后立即插入您的命令——这是在远程端准备好接收您的命令之前。

您需要在发送命令之前收到远程提示。

问题是提示正则表达式没有正确指定(prompt = '.*$')。当前提示字符串正则表达式也将匹配空输入,因为 $ 具有特殊的正则表达式含义并且未使用 \ 进行转义。以下代码有效:

def executeCommandWithOtherUser(command):
  p = pexpect.spawn('su', ['otherUser'])
  p.expect('Password:')
  p.sendline('1234')
  prompt = r'$'
  p.expect(prompt)
  p.sendline(command)
  p.expect(prompt)
  p.close()
  return 

expect() 的替代方法是使用 expect_exact(),它使用纯字符串匹配而不是正则表达式。