2016-05-07 31 views
1

pythonを使用して特定のタスクを自動化したい。
このタスクには、リモートサーバにsshで接続し、prog.outとすると、がユーザ入力を要求する場合とそうでない場合があります。
いくつかの調査と私のオプションの重み付けをした後、私はPythonのParamikoを使用することにしました(これは、以下を考慮すると間違っているかもしれません...)。PythonのParamikoでssh接続とプログラムの実行を自動化

のは、任意の入力を求めていないprog.outの簡単な可能性を見てみましょうではなく、単にコンソールにいくつかの情報を出力します。prog.out、および実行されるのを待って、サーバー名に座っている:にコンパイル

int main(int argc, char* argv[]) { 

     printf("Hey there, fella\n"); 
     printf("How are you this morning?\n"); 
     printf("See ya...\n"); 

     return 0; 
} 

。だから、その場合の

client = paramiko.SSHClient() 
client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
client.connect("server_name") 
sin, sout, serr = client.exec_command('./prog.out') 

for line in sout.readlines(): 
    print(line, end = '') 

は完全に正常に動作します、とprog.outが生み出すものは何でもプリントアウトします。
しかし、その代わりにもしprog.outは次のとおりです。

int main(int argc, char* argv[]) { 

     printf("Hey there, fella\n"); 
     printf("How are you this morning?\n"); 
     printf("please enter an integer...\n"); 
     int a; 
     scanf("%d", &a); 
     printf("you entered %d\n", a); 
     printf("see ya...\n"); 

     return 0; 
} 

はその後、上記のpythonコードは(?EOF待ち)sout.readlines()でブロックします...
sout.readlines()にブロックを回避する方法は、書面によりprog.outに入力を提供することです
...

client = paramiko.SSHClient() 
client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
client.connect("server_name") 
sin, sout, serr = client.exec_command('./prog.out') 

sin.write('55\n') 

for line in sout.readlines(): 
    print(line, end = '') 

しかしprog.outは、ユーザーの入力を要求したりしません場合、私は事前に知ることはできませんI:そのSTDINパイプへprog.outを実行する堅牢な方法を探しており、ユーザーが必要なだけ長くそれを操作できるようにしています。 prog.outが入力を予期しているときに何らかの兆候がありますか?

EDIT

OK、私は少し実験をした、そしてチャンネルから読みしようとするが()限りprog.outが終了していないとして、ブロックしますが、prog.outとして出ることができないことが分かりました入力が提供されていない限り...
まだ完了していない場合でも、すでにprog.outによって送信されたバイトを読み取ることができません。
私は本当にあなたのニーズに合わせて、おそらくより適していParamikoの上に構築されたライブラリがあり

答えて

3

...彼または彼女はprog.outと直接対話するかのようにユーザーにシミュレートしてみたいです。

私は

ファブリックは、アプリケーションの展開やシステムのためのSSHの使用の合理化 ためのPython(2.5〜2.7)ライブラリとコマンドラインツールである(私は何の関連性を持っていないうち)python fabricの話しています 管理タスク。

これは、ファイルをダウンロード/ローカルまたはリモート シェルコマンド(通常または須藤を介して)およびアップロードを実行するための操作の基本的なスイート、 ならびにそのような入力を実行しているユーザ を促す、または実行を中止するなどの補助機能を提供。

あなたの要件が正しく理解されている場合、コードは次のようになります。

from fabric.api import run 

@task 
def run_a_out() 
    run('echo "some input for a.out" | ./a.out') 

そして、あなたは、あなたが動的にa.outのに渡されたのを得るものcontrollしたい場合は、あなたが(run_a_outにパラメータを追加)してから、それを渡すことができ

fab --hosts=someserver run_a_out 

でリモートプログラムを実行しますコマンドライン。

短いFabricは、paramikoのためのより高いレベルのAPIを提供します。そのほとんどは、複雑さが隠されています。

+0

私はむしろparamikoでそれをやりたいと思っています... –

+0

もちろん、ファブリックの作者は、あなたがやろうとしていることをすでに行っています – e4c5

+0

このライブラリが私の特定のニーズをどのように助けることができるか少し詳しく説明できますか?私はその文書を読んでいますが、これがなぜ私の問題に役立つのか理解できませんでした。 –

関連する問題