Collectives™ on Stack Overflow
Find centralized, trusted content and collaborate around the technologies you use most.
Learn more about Collectives
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
Learn more about Teams
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:
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
and pexpect.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?
–
–
–
–
–
–
Better solution is to move DOCKER.
It will solve the entire Linux <-> Windows Dependecies in all kind of process.
Very simple steps are there to convert a any .py code into a Docker-image.
This will be the Futreistic an doptimised solution to use pexpect in windows.
The Example for Encapsulating Python in container:
In Linux :
Step 1: https://docs.docker.com/engine/install/centos/
After the installation ,one can get docker as a sytem command in linux.
Step 2 : Create a directory , and copy the python in that directory and create a ne file called "Dockerfile" and also have the requirements.txt
root@host_name~#cd Demo_docker
Demo_code.py DOckerfile requirements.txt
vi Demo_code.py
import pexpect
a=2+2
print(a)
vi requirements.txt
pexpect==4.8.0
vi Dockerfile
python:latest
COPY . .
COPY . reqitrements.txt
RUN pip3 install --
requirement requirements.txt
CMD ["python","Demo.py"]
Step 3: Use Docker build command to build and run and you can upload this to "dockerHUB" and then pull to any where in the world.
After you pushed the image to Docker-Hub , in windows one need to download "Docker Desktop Appliaction" and the use "Docker pull command to pull the repo which you pushed to Docker-hub
–
–
Instead of using pexpect.spawn
you can use pexpect.popen_spawn.PopenSpawn
for windows
.
child = pexpect.popen_spawn.PopenSpawn('cmd', timeout=1)
child.send('ipconfig')
child.expect('Wireless', timeout=None)
–
–
–
–
–
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.