2017-01-06 9 views
0
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). 쉘에서 파이썬 세션에서 시도 할 때 다음 pxssh.prompt()을 사용할 수 없습니다 pxssh.login()에 대한 auto_prompt_reset=False를 사용하는 경우 그것은 (기대에 따라)에만 두 번째 cat 명령의 출력py.test와 함께 사용하면 pxssh.before가 다른 동작을하는 이유는 무엇입니까?

+0

내 대답이 문제를 설명합니까? – pynexj

+0

아 맞습니다. 첫 번째 대답은 완벽한 해결책이었습니다. 두 번째의 경우 질문 자체가 혼란 스러웠습니다. 나는 'auto_prompt_reset = True'이고 지금은 PROMPT = x, 어딘가에 s.PROMPT = y라고 쓰고 싶다면 PROMPT를 다시 x로 재설정하는 법을 묻는다. –

+0

이 질문이 없으면 pxssh에서 'sync_original_prompt'API를 사용하는 방법을 설명하십시오. 미리 감사드립니다. :) –

답변

0

을 보여줍니다. 의사에 따르면 :

pxsshprompt() 메서드에서 고유 한 프롬프트를 사용합니다. 원래 프롬프트가 재설정되지 않으면 수동으로 PROMPT 특성을 설정하지 않으면 prompt() 메서드가 해제됩니다.

그래서 당신의 코드를 모두 prompt() 시간이 초과 것이며 .before는 모든 출력을 할 것이다 및 .afterpexpect.exceptions.TIMEOUT이 될 것입니다.


기타 문서는

가 속성 외에는 프롬프트가 이제까지 일치하지 않더라도의 내용을 삭제합니다) (프롬프트를 호출 말한다.

하지만 내 테스트를 기반으로 사실이 아니다 : 당신이 볼 수있는 결과에서

>>> 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'> 
>>> 

은 에 대한 삭제되지 않습니다. 대신 새로운 출력이 추가됩니다.

+0

빠른 답장을 보내 주셔서 감사합니다. 다음과 같이 나를 도울 수 있습니까?, 서로 다른 두 가지 프롬프트를 전환하는 방법은 무엇입니까? 하나는 로그인 후 바로 가져 오는 기본값이고 다른 하나는 BTEQ 세션입니다 (예 : 'BTEQ - SQL 요청 또는 BTEQ 명령 입력 :'). 하나는 bteq login 명령 후에 다른 프롬프트를 기다립니다. –

+0

* 다른 프롬프트를 토글하여 * 의미하는 것을 이해하지 못했습니다. 프롬프트를 여러 번 변경할 필요가 없습니다. 가장 좋아하는 프롬프트를 설정하고 pxssh가 설정하는 기본 프롬프트를 사용하십시오. 다른 목적으로'expect()'를 호출하십시오. – pynexj