【问题标题】:How to execute pexpect spawn comand as sudo user?如何以 sudo 用户身份执行 pexpect spawn 命令?
【发布时间】:2019-01-21 07:45:16
【问题描述】:

我正在尝试以 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'>

【问题讨论】:

  • 如果我将 child.expect("Enter Enterprise Manager Root (SYSMAN) Password :") 更改为预期 child.expect('assword') 那么它正在工作。但是想要通过整个预期命令

标签: python pexpect


【解决方案1】:

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

根据spawn.expect 文档:

模式可以是 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 :>

【讨论】:

  • 感谢 shmee。它在转义特殊字符后工作。我们是否有任何选项可以逐步调试 pexpect 命令以了解每个命令得到的输出?
  • @JayaprakashNagarajan 你可以查看child.before。如果返回 child.expect("&lt;pattern&gt;") 或引发异常,这将包含从 pty 读取的最后 100 个字符。更好的解决方案可能是将文件句柄传递给孩子的logfile 属性之一。在spawn class 中也有一些例子,但不幸的是它没有锚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-03
相关资源
最近更新 更多