pexpect 的 interact() 在使用 PowerCLI 的虚拟机上 运行 时报告 "Inappropriate ioctl for device"

pexpect's interact() reported "Inappropriate ioctl for device" when running on a VM with PowerCLI

我有一个简单的脚本 (child.py),如下所示:

#!/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 时代码 运行 成功,但是当我使用 master.sh 调用 child.py 时,我得到以下错误:

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

请注意,我正在使用 PowerCLI 调用 master.sh。我还尝试使用 PowerCLI 的 Invoke-vmscript –vm vmname –scripttext “python child.py” 直接调用 child.py 并且仍然得到相同的行为。

关于如何解决这个问题有什么想法或建议吗?

谢谢

由于您是 运行 VM 上的 pexpect 脚本,我想您真的不需要 interact 使用它。所以只需替换

child.interact()

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

等待 child 完成。


根据文档,interact()

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