Windows替代pexpect

Con*_*ure 9 python windows command-line-interface pexpect

我正在尝试编写一个运行特定命令的跨平台工具,需要某些输出进行验证,并发送某些输出(如用户名/密码)进行身份验证.

在Unix上,我成功地编写了一个使用pexpect库(via pip install pexpect)的Python工具.这段代码完美无缺,正是我想要做的.我在下面提供了一小段关于概念验证的代码摘录:

self.process = pexpect.spawn('/usr/bin/ctf', env={'HOME':expanduser('~')}, timeout=5)
self.process.expect(self.PROMPT)
self.process.sendline('connect to %s' % server)
sw = self.process.expect(['ERROR', 'Username:', 'Connected to (.*) as (.*)'])
if sw == 0:
    pass
elif sw == 1:
    asked_for_pw = self.process.expect([pexpect.TIMEOUT, 'Password:'])
    if not asked_for_pw:
        self.process.sendline(user)
        self.process.expect('Password:')
    self.process.sendline(passwd)
    success = self.process.expect(['Password:', self.PROMPT])
    if not success:
        self.process.close()
        raise CTFError('Invalid password')
elif sw == 2:
    self.server = self.process.match.groups()[0]
    self.user = self.process.match.groups()[1].strip()
else:
    info('Could not match any strings, trying to get server and user')
    self.server = self.process.match.groups()[0]
    self.user = self.process.match.groups()[1].strip()
info('Connected to %s as %s' % (self.server, self.user))
Run Code Online (Sandbox Code Playgroud)

我尝试在Windows上运行相同的源(更改/usr/bin/ctfc:/ctf.exe),我收到一条错误消息:

Traceback (most recent call last):
  File ".git/hooks/commit-msg", line 49, in <module> with pyctf.CTFClient() as c:
  File "C:\git-hooktest\.git\hooks\pyctf.py", line 49, in __init__
    self.process = pexpect.spawn('c:/ctf.exe', env={'HOME':expanduser('~')}, timeout=5)
  AttributeError: 'module' object has no attribute 'spawn'
Run Code Online (Sandbox Code Playgroud)

根据pexpect 文件:

pexpect.spawn并且pexpect.run()在Windows上不可用,因为它们依赖于Unix伪终端(ptys).跨平台代码不得使用这些代码.

这导致我寻找Windows等价物.我曾尝试流行的winpexpect项目在这里,甚至更近的(分支)的版本在这里,但无论这些项目似乎工作.我用的方法是:

self.process = winpexpect.winspawn('c:/ctf.exe', env={'HOME':expanduser('~')}, timeout=5)
Run Code Online (Sandbox Code Playgroud)

只是坐下来观看命令提示符什么也不做(似乎它被困在winspawn方法内).我想知道还有什么方法可以编写Python脚本来与命令行交互以实现与我在Unix中能够达到的相同效果?如果pexpect不存在合适的Windows版本脚本,我可以使用其他方法来解决这个问题吗?

小智 5

您可以使用wexpect(“pexpect 的 Windows 替代品”,Python Software Foundation)。它具有相同的功能,并且可以在 Windows 上运行。

  • 与 4.8 pexpect 文档相反,wexpect 截至 2020 年 8 月仍然活跃。 (2认同)

小智 0

pexpect.spawn您可以使用pexpect.popen_spawn.PopenSpawnfor来代替使用windows

child = pexpect.popen_spawn.PopenSpawn('cmd', timeout=1)
child.send('ipconfig')
child.expect('Wireless', timeout=None)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,PopenSpawn 不是 Spawn 的直接替代品,并且此解决方案可能不适用于交互式终端程序。 (2认同)
  • 我必须进行额外的导入才能使其正常工作。请参阅 https://github.com/pexpect/pexpect/issues/328 (2认同)