如何使 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()
,它使用纯字符串匹配而不是正则表达式。
我有一个使用 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()
,它使用纯字符串匹配而不是正则表达式。