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

时间:2015-10-14 13:20:56

标签: python linux pexpect

我使用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()取消注释该行,它确实有效。但是,这为用户提供了控制,我需要手动退出程序。

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

2 个答案:

答案 0 :(得分:1)

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

在发送命令之前,您需要提供远程提示。

答案 1 :(得分:1)

问题是未正确指定提示正则表达式(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(),它使用普通字符串匹配而不是正则表达式。