为什么pxssh.before与py.test一起使用时表现不同。?

时间:2017-01-06 08:00:04

标签: pexpect pxssh

from pexpect import pxssh
import getpass
import time
import sys
s=pxssh.pxssh()

class Testinstall:

    def setup_class(cls):
        cls.s=pxssh.pxssh()
        cls.s.login('10.10.62.253', 'User','PW',auto_prompt_reset=False)

    def teardown_class(cls):
        cls.s.logout()

    def test_cleanup(cls):
        cls.s.sendline('cat test.py')
        cls.s.prompt(timeout=10)
        cls.s.sendline('cat profiles.conf')
        cls.s.prompt(timeout=10)
        print('s.before')
        print (cls.s.before)
        print('s.after')
        print(cls.s.after)

在上面的代码print(cls.s.before)中输出两个cat命令。 按照预期,它应该只打印第二个cat命令的输出,即cat profiles.conf。 在shell中的python会话中尝试时,它只显示第二个cat命令的输出(按照期望)

2 个答案:

答案 0 :(得分:0)

如果您对auto_prompt_reset=False使用pxssh.login(),则无法使用pxssh.prompt()。根据文件:

  

pxssh使用prompt()方法中的唯一提示。如果未重置原始提示,则除非您手动设置prompt()属性,否则将禁用PROMPT方法。

因此,对于您的代码,prompt()会超时,.before会产生所有输出,.afterpexpect.exceptions.TIMEOUT

该文件还说

  

调用prompt()将删除before属性的内容,即使没有匹配的提示也是如此。

但根据我的测试,这不是真的:

>>> from pexpect import pxssh
>>> ssh = pxssh.pxssh()
>>> ssh.login('127.0.0.1', 'root', 'passwd')
True
>>> ssh.PROMPT = 'not-the-real-prompt'
>>> ssh.sendline('hello')
6
>>> ssh.prompt(timeout=1)
False
>>> ssh.before
'hello\r\n-bash: hello: command not found\r\n[PEXPECT]# '
>>> ssh.after
<class 'pexpect.exceptions.TIMEOUT'>
>>> ssh.sendline('world')
6
>>> ssh.prompt(timeout=1)
False
>>> ssh.before
'hello\r\n-bash: hello: command not found\r\n[PEXPECT]# world\r\n-bash: world: command not found\r\n[PEXPECT]# '
>>> ssh.after
<class 'pexpect.exceptions.TIMEOUT'>
>>>

从结果中您可以看到.before未被删除,因为第二个prompt()。相反,它附加了新的输出。

答案 1 :(得分:0)

您可以使用ssh.sync_original_prompt()代替ssh.prompt()。