我使用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()取消注释该行,它确实有效。但是,这为用户提供了控制,我需要手动退出程序。
为什么没有交互功能执行命令?我该怎么做才能让它发挥作用?
答案 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()
,它使用普通字符串匹配而不是正则表达式。