2012-07-21 7 views
9

複数シェルシェルスクリプトをリモートシェルの標準入力にパイプで接続する方法はありますか?fabric?あるいは、私はいつもリモートファイルシステムに書き込んでから、それを実行してから削除する必要がありますか?私は一時ファイルを避けるので、stdinに送信するのが好きです。ファブリックAPIがない場合(私の研究に基づいていないように思われる)、恐らくsshモジュールを直接使うことができます。基本的には、fabric.api.runはコマンドライン引数としてシェルに渡される1行のコマンドに限定されず、代わりに完全な複数行のスクリプトをとり、リモートシェルの標準入力に書き込むことを願っています。スクリプトソースcoudeは、ローカルファイルシステム上のファイルから来ないだろうのpythonの場合を除き、それだけで複数行の文字列になりファブリックとパイプスクリプトのテキストをシェルの標準入力に使用してシェルスクリプトを実行する

ssh somehost /bin/sh < /tmp/test.sh 

:私は、このコマンドラインの生地と同等にしたい明確にする

メモリ。これは単一の論理操作であり、リモート側には一時ファイルが存在しないため、予期しない障害が発生し、クラッシュしても孤立したファイルが残らないことに注意してください。ファブリックにこのようなオプションがある場合(これは私が尋ねるものです)、どちらの側にも一時ファイルを入れる必要はなく、これは単一のssh操作しか必要としません。

+0

はちょうど 'ラン(「Command1を&& command2の&& command2の」のような何かをしないのはなぜ:あなたはここで私が得る出力だ独立した​​線や&&

run('''echo hello;\ echo testing;\ echo is this thing on?;''') run('''echo hello && \ echo testing && \ echo is this thing on?''') 

のようなだけで配管作業を分離するためにセミコロンを使用することができます')? – Tshepang

+4

A)は読みやすく、書いているか、またはシェルイン・パイソンコードとして維持していないため、B)&&はコードフローをあなたが望むかもしれないし望ましくない方法で影響を与えます。C)世界はすでに既存のシェルスクリプトを1つの行に変換せずにファブリック経由で実行したい –

答えて

0

これを行うための組み込み方法はありません。あなたはしかし、それをプログラムすることができます:スクリプトはファイルにある

from fabric.api import run 

scriptfilehandle = open('myscript.sh') 
for line in scriptfilehandle: 
    run(line) 
+5

それは動作しません。各行に新しいシェルプロセスを呼び出すことによって、/ for/whileブロックの複数行を実行することはできません。 –

+1

良い点。私の答えはもちろん、スクリプトは単純なコマンドで構成されており、実際のロジックではありません。仕事を別のセクションに分割して別々に実行できるという私の提案は残っています。 –

+1

しかし、実際には、ファイルを「パッティング」することは、自分で提案したオプションをリモートで実行するよりも優れていると言います。おそらく、なぜそれがオプションではなかったのかを明確にすることはできますか? –

2

場合は、その後、runにその内容を渡し、それを読むことができます。ジャスパーの例を書き直す:

from fabric.api import run 

script_file = open('myscript.sh') 
run(script_file.read()) 
script_file.close() 
+1

はい、ファブリックはリモートでファイルに書き込んだ後、実行して3つの別々の操作として削除します。 –

3

ファブリック演算を使うことができます。 fabric.operations.put(local_path, remote_path, use_sudo=False,mirror_local_mode=False,mode=None)

を使用して、スクリプトファイルをリモートパスにコピーして実行することができます。

または、

あなたがfabric.operations.open_shellを使用することができますが、それは単純な一連のコマンドのために働くだろうが、論理的な流れを伴うスクリプトのために、あなたがローカルに行うと同じように置く操作を使用してスクリプトを実行する方が良いですサーバ。

1

これは価値がありますが、これは完璧に機能します。これは、Pythonの複数行文字列表記'''とbashの改行(改行の前に\)を使用します。

[[email protected]:49300] run: echo hello;  echo testing;  echo is this thing on?; 
[[email protected]:49300] out: hello 
[[email protected]:49300] out: testing 
[[email protected]:49300] out: is this thing on? 
[[email protected]:49300] out: 

[[email protected]:49300] run: echo hello &&  echo testing &&  echo is this thing on? 
[[email protected]:49300] out: hello 
[[email protected]:49300] out: testing 
[[email protected]:49300] out: is this thing on? 
[[email protected]:49300] out: 
+0

複数行実行コマンドでカスタム入力/変数値を渡すにはどうすればよいですか? – Spike

関連する問題