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
命令的输出(按照期望)
答案 0 :(得分:0)
如果您对auto_prompt_reset=False
使用pxssh.login()
,则无法使用pxssh.prompt()
。根据文件:
pxssh
使用prompt()
方法中的唯一提示。如果未重置原始提示,则除非您手动设置prompt()
属性,否则将禁用PROMPT
方法。
因此,对于您的代码,prompt()
会超时,.before
会产生所有输出,.after
会pexpect.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()。