6

Violent Pythonの第 2 章の「Pexpect による SSH とのやり取り」および「Pxsshによる SSH パスワードのブルート フォーシング」セクションのコードを実行しようとしています。両方を使用すると、同様の EOF エラーが発生します。child.expect()pxssh

Python コンソールから次のコマンドを実行します。

import pexpect
connStr = "ssh root@127.0.0.1"
child = pexpect.spawn(connStr)
ret = child.expect([pexpect.TIMEOUT, ssh_newkey, "[P|p]assword:"])

私はこの出力を得る:

Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pexpect.py", li
ne 1316, in expect
    return self.expect_list(compiled_pattern_list, timeout, searchwindowsize)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pexpect.py", li
ne 1330, in expect_list
    return self.expect_loop(searcher_re(pattern_list), timeout, searchwindowsize)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pexpect.py", li
ne 1401, in expect_loop
    raise EOF (str(e) + '\n' + str(self))
EOF: End Of File (EOF) in read_nonblocking(). Empty string style platform.
<pexpect.spawn object at 0x10180c550>
version: 2.4 ($Revision: 516 $)
command: /usr/bin/ssh
args: ['/usr/bin/ssh', 'root@127.0.0.1']
searcher: searcher_re:
    0: TIMEOUT
    1: re.compile("Are you sure you want to continue connecting")
    2: re.compile("[P|p]assword:")
buffer (last 100 chars): 
before (last 100 chars): 
after: <class 'pexpect.EOF'>
match: None
match_index: None
exitstatus: 255 
flag_eof: True
pid: 12122
child_fd: 4
closed: False
timeout: 30
delimiter: <class 'pexpect.EOF'>
logfile: None
logfile_read: None
logfile_send: None
maxread: 2000
ignorecase: False
searchwindowsize: None
delaybeforesend: 0.05
delayafterclose: 0.1
delayafterterminate: 0.1

そして、次を使用してこれらのコマンドを実行しますpxssh

import pxssh
s = pxssh.pxssh()
s.login("127.0.0.1", "root", "1234")

私はこの出力を得る:

Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pxssh.py", line
 196, in login
    i = self.expect(["(?i)are you sure you want to continue connecting", original_prompt, "(?i)(?:pas
sword)|(?:passphrase for key)", "(?i)permission denied", "(?i)terminal type", TIMEOUT, "(?i)connectio
n closed by remote host"], timeout=login_timeout)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pexpect.py", li
ne 1316, in expect
    return self.expect_list(compiled_pattern_list, timeout, searchwindowsize)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pexpect.py", li
ne 1330, in expect_list
    return self.expect_loop(searcher_re(pattern_list), timeout, searchwindowsize)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pexpect.py", li
ne 1401, in expect_loop
    raise EOF (str(e) + '\n' + str(self))
EOF: End Of File (EOF) in read_nonblocking(). Empty string style platform.
<pxssh.pxssh object at 0x1016bff90>
version: 2.4 ($Revision: 516 $)
command: /usr/bin/ssh
args: ['/usr/bin/ssh', '-q', '-l', 'root', '127.0.0.1']
searcher: searcher_re:
    0: re.compile("(?i)are you sure you want to continue connecting")
    1: re.compile("[#$]")
    2: re.compile("(?i)(?:password)|(?:passphrase for key)")
    3: re.compile("(?i)permission denied")
    4: re.compile("(?i)terminal type")
    5: TIMEOUT
    6: re.compile("(?i)connection closed by remote host")
buffer (last 100 chars): 
before (last 100 chars): 
after: <class 'pexpect.EOF'>
match: None
match_index: None
exitstatus: None
flag_eof: True
pid: 12136
child_fd: 3
closed: False
timeout: 30
delimiter: <class 'pexpect.EOF'>
logfile: None
logfile_read: None
logfile_send: None
maxread: 2000
ignorecase: False
searchwindowsize: None
delaybeforesend: 0.05
delayafterclose: 0.1
delayafterterminate: 0.1

127.0.0.1を他のホストに置き換えて、別のユーザー名とパスワードの組み合わせを試すと、同様の結果が得られます。

pexpectのドキュメントではexpect(pexpect.EOF)、EOF 例外の生成を回避するために使用することが提案されています。実際、次のことを行うと:

connStr = "ssh root@127.0.0.1"
child = pexpect.spawn(connStr)
print child.expect(pexpect.EOF)

結果は0です。

しかし、次の疑問が残ります。

  1. 本の構文に混乱しています: child.expect([pexpect.TIMEOUT, ssh_newkey, "[P|p]assword:"]). にリストを渡すのはなぜexpect()ですか? このリストには何が含まれているはずですか?
  2. expect(pexpect.EOF)pxssh を使用する場合、ドキュメントに記載されているように、どのように使用すればよいですか?
  3. 本のコードが正しく動作しないのはなぜですか? 本の出版以来、pexpect ライブラリに何か変更はありましたか? 私がOS Xを使っているからですか?

Mac OS X 10.8.4 で Python 2.7 と pexpect 2.4 を実行しています。

4

3 に答える 3

5

#2について:EOFを期待することは、ここでは赤いニシンです。ログイン時に EOF を期待するのではなく、ログイン時にパスワード プロンプトを期待します。pxssh は、パスワード プロンプトを表示せずに ssh からのログイン時に EOF を返すと、そのエラーを発生させます。これは、警告を受け取らないように ssh -q を使用していて、ssh から警告を受けているために発生する可能性があります。使用している ssh オプションを取得し、q なしで自分で実行します。

/usr/bin/ssh -l ルート 127.0.0.1

私の場合、接続しているマシンの ID が変更されているために ssh が既知のホスト違反を追い出しているときに、このエラー メッセージが表示されることがあります。

于 2013-08-22T03:26:36.363 に答える
1

で使用しようとしたときに同じエラーが発生しself.expect()ましたpxssh。「-q」を削除してsshオプションを変更してもうまくいきませんでした。

への入力の 1 つとして pexpect.EOF を追加することで、このサイトの指示に従いましたself.expect()。これにより、スクリプトは文字列全体が受信されるまで待機してから、EOF を受信したときに終了します。

i = self.expect(["(?i)are you sure you want to continue connecting", original_prompt, "(?i)(?:password.*)|(?:passphrase for key)", "(?i)permission denied", "(?i)terminal type", pexpect.EOF, TIMEOUT, "(?i)connection closed by remote host"], timeout=login_timeout)

これで、うまくいきます!

于 2016-02-18T14:14:39.437 に答える