gpt4 book ai didi

python - 使用 pexpect 和 pxssh 时的 EOF

转载 作者:太空狗 更新时间:2023-10-29 23:59:33 26 4
gpt4 key购买 nike

我正在尝试运行 Violent Python 第 2 章中通过 Pexpect 与 SSH 交互使用 Pxssh 强制 SSH 密码 部分中的代码.同时使用 child.expect()pxssh 我得到类似的 EOF 错误。

从 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 documentation建议使用 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. 在使用 pxssh 时,如何按照文档中的说明使用 expect(pexpect.EOF)
  3. 为什么书中的代码不能正常运行?自本书出版以来,pexpect 库中有什么变化吗?是因为我使用的是 OS X 吗?

我在 Mac OS X 10.8.4 上运行 Python 2.7 和 pexpect 2.4。

最佳答案

关于 #2:期待 EOF 在这里是一个转移注意力的问题。您 - 不要 - 期望登录时出现 EOF,您期望登录时出现密码提示。 pxssh 在从 ssh 登录时返回 EOF 而没有得到密码提示时会踢出该错误。发生这种情况是因为它使用 ssh -q 没有收到警告,而您从 ssh 收到警告。获取它正在使用的 ssh 选项并在没有 q 的情况下自己运行它们:

/usr/bin/ssh -l root 127.0.0.1

在我的例子中,当 ssh 踢出已知主机违规时,由于我连接到的机器的身份已更改,我会收到此错误消息。

关于python - 使用 pexpect 和 pxssh 时的 EOF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17879585/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com