Windows-Alternative zu pexpect
Ich versuche, ein plattformübergreifendes Tool zu schreiben, das bestimmte Befehle ausführt. erwartet Bestimmte Ausgabe zur Überprüfung und bestimmte Ausgabe (z. B. Benutzername / Passwort) zur Authentifizierung.
nter Unix war ich erfolgreich bei der Programmierung eines Python-Tools, das daspexpect
Bibliothek (überpip install pexpect
). Dieser Code funktioniert perfekt und ist genau das, was ich versuche zu tun. Ich habe unten einen kleinen Auszug meines Codes für den Proof-of-Concept bereitgestellt:
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))
Ich habe versucht, die gleiche Quelle unter Windows auszuführen (Ändern von/usr/bin/ctf
zuc:/ctf.exe
) und ich erhalte eine Fehlermeldung:
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'
Laut dempexpect
Dokumentatio:
pexpect.spawn
undpexpect.run()
sind unter Windows nicht verfügbar, da sie auf Unix-Pseudoterminals (ptys) basieren. Plattformübergreifender Code darf diese nicht verwenden.
Das hat mich auf die Suche nach einem Windows-Äquivalent geführt. Ich habe das beliebte @ ausprobiewinpexpect
projectHie und sogar eine neuere (gegabelte) VersionHie, aber keines dieser Projekte scheint zu funktionieren. Ich benutze die Methode:
self.process = winpexpect.winspawn('c:/ctf.exe', env={'HOME':expanduser('~')}, timeout=5)
nur zu sitzen und zu beobachten, wie die Eingabeaufforderung nichts tut (es scheint, als sei sie im @ gefangewinspawn
Methode). Ich habe mich gefragt, was ich sonst noch tun könnte, um ein Python-Skript so zu programmieren, dass es mit der Befehlszeile interagiert, um den gleichen Effekt wie unter Unix zu erzielen. Wenn eine passende funktionierende Windows-Versionpexpect
script existiert nicht, welche anderen Mittel könnte ich verwenden, um dies zu tun?