Как выполнить команду pexpect spawn от имени пользователя sudo? - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь выполнить команду pexpect spawn как sudo и получаю ошибку тайм-аута

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'>

1 Ответ

0 голосов
/ 21 января 2019

Это потому, что ваша строка поиска не соответствует выводу при компиляции в регулярное выражение.

Согласно документации 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 :>
...