首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Windows替代pexpect

Windows替代pexpect
EN

Stack Overflow用户
提问于 2016-08-16 13:56:44
回答 3查看 19.1K关注 0票数 11

我试图编写一个跨平台工具,它运行特定的命令,期望某些输出进行验证,并发送特定的输出(如用户名/密码)进行身份验证。

在Unix上,我成功地编写了一个使用pexpect库(通过pip install pexpect)的Python工具。这段代码工作得很完美,正是我想要做的。我提供了我的代码的一小部分,以证明概念如下:

代码语言:javascript
运行
复制
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))

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

代码语言:javascript
运行
复制
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'

根据pexpect 文档

pexpect.spawnpexpect.run()在Windows上是不可用的,因为它们依赖于Unix伪终端(ptys)。跨平台代码不能使用这些。

这让我开始寻找Windows的等价物。我尝试过流行的winpexpect项目这里,甚至是最近的(分叉)版本的这里,但这两个项目似乎都不起作用。我用的方法是:

代码语言:javascript
运行
复制
self.process = winpexpect.winspawn('c:/ctf.exe', env={'HOME':expanduser('~')}, timeout=5)

只需要坐着看命令提示符,什么也不做(好像它被困在了winspawn方法中)。我在想,我还可以用什么其他方法来编写Python脚本来与命令行交互,以达到我在Unix中所能达到的效果呢?如果一个合适的Windows pexpect脚本不存在,我还能用什么方法来完成这个任务呢?

EN

回答 3

Stack Overflow用户

发布于 2019-08-16 17:06:17

您可以使用威望 (“”,)。它具有相同的功能,并且在Windows上工作。

票数 4
EN

Stack Overflow用户

发布于 2020-11-22 20:30:24

更好的解决办法是移动码头。它将在各种进程中解决整个Linux <-> Windows Dependecies问题。非常简单的步骤是将任何.py代码转换为Docker映像。这将是Futreistic的一个经过优化的解决方案,可以在windows中使用pexpect。

将Python封装在容器中的示例:在linux中:步骤1:安装后的https://docs.docker.com/engine/install/centos/,您可以在Linux中作为sytem命令获得docker。步骤2:创建一个目录,并在该目录中复制python,并创建一个名为"Dockerfile“的ne文件,并具有requirements.txt

root@host_name~#cd Demo_docker Demo_code.py DOckerfile requirements.txt

vi Demo_code.py

进口料

a=2+2

打印(A)

vi requirements.txt pexpect==4.8.0

vi Dockerfile python:最新版本。。收到。reqitrements.txt运行pip3安装--要求requirements.txt CMD "python“、"Demo.py”

步骤3:使用dockerHUB命令构建并运行,您可以将其上传到"dockerHUB“,然后拉到世界上任何地方。

将映像推送到Docker-Hub后,在windows中需要下载"Docker Desktop Appliaction“,并使用"Docker拉命令”将您推送到Docker-hub的回购命令

票数 1
EN

Stack Overflow用户

发布于 2017-09-14 12:47:00

而不是使用pexpect.spawn,而是可以将pexpect.popen_spawn.PopenSpawn用于windows

代码语言:javascript
运行
复制
child = pexpect.popen_spawn.PopenSpawn('cmd', timeout=1)
child.send('ipconfig')
child.expect('Wireless', timeout=None)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38976893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档