2016-12-29 3 views
1

У меня есть простой скрипт (child.py), как показано ниже:pexpect (в) сообщил «недопустимый IOCTL для устройства» при работе на виртуальной машине с PowerCLI

#!/usr/bin/env python 
import pexpect 

def ency(): 
    child = pexpect.spawn("cryptsetup luksChangeKey /mnt/ency") 
    child.expect('Enter passphrase to be changed:') 
    child.sendline('password-old') 
    child.expect('Enter .*: ') 
    child.sendline('password-new') 
    child.expect('Verify .*: ') 
    child.sendline('password-new') 
    child.interact() 

ency() 

я вызываю этот скрипт, используя другой скрипт (master.sh)

#!/bin/bash 
python child.py 

код выполняется успешно, когда я бегу child.py, но когда я envoke child.py с помощью master.sh, я получаю следующее сообщение об ошибке:

Traceback (most recent call last): 
    File "child.py", line 15, in <module> 
    ency() 
    File "child.py", line 13, in ency 
    child.interact() 
    File "/usr/lib/python2.7/site-packages/pexpect-4.2.1-py2.7.egg/pexpect/pty_spawn.py", line 740, in interact 
    mode = tty.tcgetattr(self.STDIN_FILENO) 
termios.error: (25, 'Inappropriate ioctl for device') 

Обратите внимание, что я вызываю master.sh с использованием PowerCLI. Я также попытался вызвать child.py непосредственно с помощью PowerCLI's Invoke-vmscript –vm vmname –scripttext “python child.py” и по-прежнему получать то же поведение.

Любые идеи или предложения о том, как разрешить это?

Благодаря

+0

ли 'master.py' сценарий оболочки? Почему «python child.py'? – pynexj

+0

master - это файл python, child - скрипт bash. Я отредактировал свой вопрос, чтобы отразить это. спасибо, что указали это. – Taleeb

+1

* master - это файл python, child - это скрипт bash *, вы уверены, что это не так? @Taleeb? Кроме того, как вы называете 'master.py'? – Gabriel

ответ

0

Поскольку вы работаете в pexpect скрипт на виртуальной машине, я полагаю, вы на самом деле не нужно interact с ним. Так просто заменить

child.interact() 

с

child.expect(pexpect.EOF) # also use the `timeout` argument if necessary 

ждать ребенка завершения.


Согласно документу, interact()

gives control of the child process to the interactive user (the human at the keyboard). Keystrokes are sent to the child process, ...

+0

Это прекрасно работает для меня. благодаря – Taleeb

Смежные вопросы