python 渡す シェルの stdin にファブリックとパイピング スクリプト テキストを使用してシェル スクリプトを実行する




シェルスクリプト 標準出力 (4)

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

明確にするために、このコマンドラインと同等のファブリックが必要です。

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

Pythonでは、スクリプトソースコードはローカルファイルシステム上のファイルから来たのではなく、単なるメモリ内の複数行の文字列です。 これは単一の論理操作であり、リモート側には一時ファイルがないため、予期しない失敗やクラッシュによって孤立ファイルが残ることはありません。 そのようなオプションがfabricにある場合(これが私が求めているものです)、どちらの側にも一時ファイルがある必要はなく、これには単一のssh操作だけが必要になります。


それを行うための組み込みの方法はありません。 あなたはそれをプログラムすることができます:

from fabric.api import run

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

スクリプトがファイルに入っている場合は、それを読んでからrunすることができます。 Jasperの例を書き直す:

from fabric.api import run

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

それが価値があるもののために、これは完全にうまくいきます。 これはPythonの複数行の文字列表記'''とbashの改行(改行の前の\ )を使います。 セミコロンを使用して独立した行を区切ることも、 &&ような配管操作だけを使用することもできます。

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

これが私が得る出力です:

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

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

あなたはFabricオペレーションを使うことができます。 fabric.operations.put(local_path, remote_path, use_sudo=False,mirror_local_mode=False,mode=None)を使用できます。

スクリプトファイルをリモートパスにコピーして実行します。

または、

fabric.operations.open_shell使用することもできますが、論理的な流れを含むスクリプトを作成する場合は、一連の単純なコマンドに対してのみ機能します。ローカルサーバーで実行する場合と同じようにput操作を使用してスクリプトを実行します。





fabric