在winpexpect中运行plink

时间:2011-09-29 02:13:14

标签: python plink

我正在尝试在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工作(用pexpect替换winpexpect模块,用ssh替换plink),所以我知道expect()匹配是正确的。看起来winpexpect正在写入屏幕,并且plink没有将其注册为输入密码字段的文本。

有人能在这里发现问题吗?

2 个答案:

答案 0 :(得分:2)

这是一个分叉的winexpect项目,修复了错误:https://bitbucket.org/weyou/winpexpect 你可以尝试一下。

答案 1 :(得分:0)

我遇到了与winpexpect和plink类似的问题。 This question有一个适合我的解决方案。连接到我的串行接口的设备在本地回应事物并且混淆了winpexpect。用以下函数替换sendline():

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

每次通话都为我修好了。 child.pexpect(cmd)在目标种子\ n之前吃掉本地回显的字符\ n并开始响应。