2017-11-07 65 views
0

PerlからPythonにスクリプトを実行して、リモートサーバーやデバイス上の特定のタスクを自動化することについて考えてみましょう。 Expectを使用して特定の結果を確認し、データを戻す必要があります。 Paramiko-Expectを見て、私はそれが好きですが、毎回タイムアウトしています。paramikoがタイムアウトを期待する

import paramiko 
from paramikoe import SSHClientInteraction 

HOSTNAME = "HOST IP" 
PASSWORD = "PWORD" 
USERNAME = "UNAME" 
PROMPT = "(node name)#" 

command = "show command" 

print PROMPT 

file = open("testlog.txt","w") 

def main(): 

    client = paramiko.SSHClient() 
    client.load_system_host_keys() 
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 

    client.connect(HOSTNAME, port=22, username=USERNAME, password=PASSWORD) 

    interact = SSHClientInteraction(client, timeout=10, display=True) 

    interact.send(command) 
    interact.expect(PROMPT) 
    file.write(interact.current_output_clean) 
    client.close() 

    return 



main() 
file.close() 

これは私が取得トレースバックです:

Traceback (most recent call last):  
File "python_test.py", line 40, in <module> 
    main()  
File "python_test.py", line 28, in main 
    interact.expect(PROMPT) 
File "/usr/local/lib/python2.7/site-packages/paramikoe.py", line 122, in expect 
    buffer = self.channel.recv(self.buffer_size)  
File "/usr/local/lib/python2.7/site-packages/paramiko/channel.py", line 598, in recv 
    raise socket.timeout() socket.timeout 

私が直接私がフルに上でそれをしようとしているノードのテキストに入れてから、期待するPROMPTの複数のバージョンを試してみました正規表現。何も動作しません。 client.expectに到達すると常にタイムアウトします。 Paramiko-expectドキュメンテーションは役に立たず、この質問を見る唯一の他の場所は、それが助けにならないほど十分に異なっています。 アドバイスありがとうございます。

答えて

1

予想通りのプロンプトをプロンプトとして表示します。 Hereはparamikoインタラクションの例です。

interact = SSHClientInteraction(client, timeout=10, display=True) 
interact.expect(PROMPT) 

interact.send("ls") 
interact.expect(".*Maildir.*") 
file.write(interact.current_output_clean) 
client.close() 

私は、リモートホストのホームディレクトリのリストで満たさtestlog.txtを持っている:私はあなたのコードの一部を更新したとき、そう

PROMPT = '[email protected]:~\$\s+' 

interact.expect(PROMPT) 

- ライン21、および37に注意してください。

サイドノート - Python 3に切り替えてください。起動している場合、すぐに古くなっていることがよく知られていないツールを使用する方がよいでしょう。また、ipythonを使うこともできますし、jupyterコードは対話的でテストが速いでしょう。多分netmikoあなたに興味がありますか?

+0

私はプロンプトに入力しているものの例としてPROMPT = "(ノード名)#"を入力します。私はそこに正規表現を使用し、正確なプロンプトに設定する必要がありますが、私はタイムアウトをどちらかの方法で取得する必要があります。 ネットミコを見ていきます。 –

+0

多分正規表現は問題ですか?私の変更であなたのコードはうまくいきました... –

+0

私はそれを正規表現に設定し、あなたのように正確なプロンプトに設定しようとしました。だから私は本当になぜそれがあなたのために働いているのではなく、私ではないのですか?しかし、コードではないようですので、私は他の解決策を探します。 –

関連する問題