I'm trying to write a cross-platform tool that runs specific commands, expects certain output for verification, and sends certain output (like username/password) for authentication.
On Unix, I have been successful in programming a Python tool that uses the pexpect
library (via pip install pexpect
). This code works perfectly and is exactly what I am trying to do. I've provided a small excerpt of my code for proof-of-concept below:
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))
I tried running the same source on Windows (changing /usr/bin/ctf
to c:/ctf.exe
) and I receive an error message:
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'
According to the pexpect
documentation:
pexpect.spawn
andpexpect.run()
are not available on Windows, as they rely on Unix pseudoterminals (ptys). Cross platform code must not use these.
That led me on my search for a Windows equivalent. I have tried the popular winpexpect
project here and even a more recent (forked) version here, but neither of these projects seem to work. I use the method:
self.process = winpexpect.winspawn('c:/ctf.exe', env={'HOME':expanduser('~')}, timeout=5)
only to sit and watch the Command Prompt do nothing (it seems as though it's trapped inside the winspawn
method). I was wondering what other means I could go about programming a Python script to interact with the command line to achieve the same effect as I have been able to in Unix? If a suitable working Windows-version pexpect
script does not exist, what other means could I use to go about this?
Pexpect is a Python module for spawning child applications and controlling them automatically. Pexpect can be used for automating interactive applications such as ssh, ftp, passwd, telnet, etc. It can be used to a automate setup scripts for duplicating software package installations on different servers.
You can use wexpect ("Windows alternative of pexpect", Python Software Foundation). It has the same functions, and it works on Windows .
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With