2

winpexpect で plink を使用してリモート Linux サーバーに接続しようとしています。私は次のコードを使用しています:

child = winpexpect.winspawn('plink root@hostname')
child.logfile = sys.stdout
i = child.expect(['Password:')
child.expect('Password:')
child.sendline('password')

stdout で得られる出力は次のとおりです。

Using keyboard-interactive authentication.
Password: password

Using keyboard-interactive authentication.
Password:
Using keyboard-interactive authentication.
Password: Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  ...in expect_loop
raise TIMEOUT (str(e) + '\n' + str(self))
pexpect.TIMEOUT: Timeout exceeded in read_nonblocking().
...
command: plink
args: ['plink', 'root@hostname']
buffer (last 100 chars): yboard-interactive authentication.
Password:
Using keyboard-interactive authentication.
Password:
before (last 100 chars): yboard-interactive authentication.
Password:
Using keyboard-interactive authentication.
Password:
after: <class 'pexpect.TIMEOUT'>
...

同等のコードが Linux の pexpect で機能する (winpexpect モジュールを pexpect に置き換え、plink 呼び出しを ssh に置き換える) ため、expect() の一致が正しいことがわかります。winpexpect が画面に書き込みを行っているように見えますが、plink はそれをパスワード フィールドに入力されたテキストとして登録していません。

誰でもここで問題を見つけることができますか?

4

2 に答える 2

2

これは、バグ修正されたフォークされた winexpect プロジェクトです: https://bitbucket.org/weyou/winpexpect 試すことができます。

于 2012-09-07T08:48:52.873 に答える
0

winpexpect と plink で同様の問題に遭遇しました。この質問には、私にとって有効な解決策がありました。シリアル インターフェイスに接続されたデバイスがローカルにエコーし、winpexpect を混乱させていました。sendline() を次の関数に置き換えます。

    child.send(cmd)
    child.pexpect(cmd)
    child.send('\n')

呼び出しごとに修正しました。child.pexpect(cmd) は、ターゲットが \n をシードする前にローカルにエコーされた文字を食べ、応答を開始します。

于 2015-03-29T22:46:42.423 に答える