Python 如何以sudo用户的身份执行pexpect spawn comand?

Python 如何以sudo用户的身份执行pexpect spawn comand?,python,pexpect,Python,Pexpect,我正试图以sudo的形式执行一个pexpect spawn命令,并得到超时错误 import pexpect,os,commands,getpass child = pexpect.spawn ('su - oracle -c "/home/Middleware/bin/emctl status oms -details"') child.expect("Enter Enterprise Manager Root (SYSMAN) Password :") child.sendline("we

我正试图以sudo的形式执行一个pexpect spawn命令,并得到超时错误

import pexpect,os,commands,getpass
child = pexpect.spawn ('su - oracle -c "/home/Middleware/bin/emctl  status oms -details"')
child.expect("Enter Enterprise Manager Root (SYSMAN) Password :")
child.sendline("welcome1")
child.expect(pexpect.EOF, timeout=None)
cmd_show_data = child.before
cmd_output = cmd_show_data.split('\r\n')
for data in cmd_output:
    print data
以下是执行输出:

pexpect.TIMEOUT: Timeout exceeded in read_nonblocking().
<pexpect.spawn object at 0x9ae510>
version: 2.3 ($Revision: 399 $)
command: /bin/su
args: ['/bin/su', '-', 'oracle', '-c', '/home/Middleware/bin/emctl status oms -details']
searcher: searcher_re:
    0: re.compile("Enter Enterprise Manager Root (SYSMAN) Password :")
buffer (last 100 chars): , 2016 Oracle Corporation.  All rights reserved.
Enter Enterprise Manager Root (SYSMAN) Password :
before (last 100 chars): , 2016 Oracle Corporation.  All rights reserved.
Enter Enterprise Manager Root (SYSMAN) Password :
after: <class 'pexpect.TIMEOUT'>
pexpect.TIMEOUT:在read\u nonblocking()中超过超时。
版本:2.3($修订:399$)
命令:/bin/su
参数:['/bin/su'、'-'、'oracle'、'-c'、'/home/Middleware/bin/emctl status oms-details']
搜索者:搜索者\u re:
0:重新编译(“输入企业管理器根目录(SYSMAN)密码:”)
缓冲区(最后100个字符):2016年甲骨文公司。版权所有。
输入Enterprise Manager Root(SYSMAN)密码:
2016年之前(最后100个字符):甲骨文公司。版权所有。
输入Enterprise Manager Root(SYSMAN)密码:
之后:

这是因为在编译为正则表达式时,搜索字符串与输出不匹配

根据文件:

模式可以是StringType、EOF、编译的re或任何类型的列表 那些类型的字符串将被编译为重新类型

问题在于圆括号,它们是正则表达式中的特殊字符,当打算作为文本处理时,必须用反斜杠转义

print(re.match("Enter Enterprise Manager Root (SYSMAN) Password :",
               "Enter Enterprise Manager Root (SYSMAN) Password :"))

# Prints: None

print(re.match("Enter Enterprise Manager Root \(SYSMAN\) Password :",
               "Enter Enterprise Manager Root (SYSMAN) Password :"))

# Prints: <_sre.SRE_Match object; span=(0, 49), match='Enter Enterprise Manager Root (SYSMAN) Password :>
print(重新匹配)(“输入企业管理器Root(SYSMAN)密码:”,
“输入企业管理器根目录(SYSMAN)密码:”)
#印刷品:无
打印(重新匹配(“输入Enterprise Manager Root\(SYSMAN\)密码:”,
“输入企业管理器根目录(SYSMAN)密码:”)

#打印:如果我将child.expect(“输入企业管理器Root(SYSMAN)密码:”)更改为expect child.expect('assword')然后它就开始工作了。但是想通过整个预期的命令谢谢shmee。它在转义特殊字符后工作了。我们有没有办法一步一步地调试pexpect命令以了解每个命令的输出?@JayaprakashNagarajan您可以在
之前检查
子命令。如果返回了
child.expect(“”
),或者引发了异常,则这将包含从pty读取的最后100个字符。更好的解决方案可能是将文件句柄传递给子属性之一。在中也有一些例子,但不幸的是,它没有锚。