web-dev-qa-db-ja.com

pexpectに代わるWindows

特定のコマンドを実行し、検証のために特定の出力を期待し、特定の出力(ユーザー名/パスワードなど)を送信するクロスプラットフォームツールを作成しようとしています。認証用。

Unixでは、(pexpectライブラリを使用するPythonツール(_pip install pexpect_経由))のプログラミングに成功しています。このコードは完全に機能し、まさに私です。以下に、概念実証用のコードの小さな抜粋を示しました。

_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_に変更)、エラーメッセージが表示されます。

_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.spawn_およびpexpect.run()は、Unix疑似端末(ptys)に依存しているため、Windowsでは使用できません。クロスプラットフォームコードはこれらを使用してはなりません。

それがきっかけで、Windowsに相当するものを探しました。人気のあるwinpexpectプロジェクト ここ とさらに最近の(フォークされた)バージョン ここ を試しましたが、どちらのプロジェクトも機能していないようです。私は次の方法を使用します:

_self.process = winpexpect.winspawn('c:/ctf.exe', env={'HOME':expanduser('~')}, timeout=5)
_

座ってコマンドプロンプトが何もしないのを見るだけです(winspawnメソッド内に閉じ込められているように見えます)。 Pythonスクリプトをプログラミングしてコマンドラインと対話し、Unixで実行できたのと同じ効果を実現するには、他にどのような手段がありますか?適切に機能するWindowsバージョンの場合pexpectスクリプトが存在しません。これを実行するために他にどのような手段を使用できますか?

9
Confiqure

wexpect ( "Windowsのpexpectの代替"、Python Software Foundation)を使用できます。同じ機能を持ち、Windowsで動作します。

1
James Castells

pexpect.spawnを使用する代わりに、windowspexpect.popen_spawn.PopenSpawnを使用できます。

child = pexpect.popen_spawn.PopenSpawn('cmd', timeout=1)
child.send('ipconfig')
child.expect('Wireless', timeout=None)
0
Hemang Bhimani