2017-01-06 6 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の両方のコマンドが出力されます。 期待通りに、2番目のcatコマンドの出力のみを出力します。つまり、cat profiles.confです。 あなたがpxssh.login()ためauto_prompt_reset=Falseを使用する場合は、あなたがpxssh.prompt()を使用することはできません(期待どおりに)それが唯一の二catコマンドの出力を示しシェルでPythonのセッションでpy.testで使用すると、pxssh.beforeの動作が異なるのはなぜですか?

+0

私の答えはあなたの問題を説明していますか? – pynexj

+0

ああ、そうです。最初の答えは完璧な解決策でした。 2番目のケースでは、質問自体が混乱していました。私は 'auto_prompt_reset = True'で、今度はPROMPT = x、コードのどこかでs.PROMPT = yを実行してから、PROMPTを再びxにリセットする方法を尋ねます。 –

+0

この質問が表示されない場合は、pxsshで 'sync_original_prompt' APIを使用する方法を説明してください。前もって感謝します。 :) –

答えて

0

を試みたとき。 doc:

pxsshは、prompt()メソッドで一意のプロンプトを使用します。元のプロンプトがリセットされない場合、手動で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'> 
>>> 

.before第二prompt()のために消去されていません。代わりに新しい出力が追加されます。

+0

あなたの素早い返信には大変感謝しています。あなたは次のように私を助けることができますか?2つの異なるプロンプトを切り替える方法は? 1つはデフォルトのもので、ログイン直後に取得します。他のBTEQセッション(例: 'BTEQ - SQLリクエストまたはBTEQコマンドを入力してください:') 1つは、bteq loginコマンドの後に他のプロンプトが必要です。 –

+0

*あなたが何を意味するのかを理解していない*異なるプロンプトを切り替える*。プロンプトを複数回変更する必要はありません。好きなプロンプトを設定してそれに固執するか、単にpxsshが設定するデフォルトのものを使用してください。他の目的のために 'expect()'を呼び出すだけです。 – pynexj