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/ctf为c:/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版本脚本,我可以使用其他方法来解决这个问题吗?
小智 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)
| 归档时间: |
|
| 查看次数: |
8854 次 |
| 最近记录: |