14

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

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

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

Python を除いて、スクリプト ソース coude はローカル ファイル システム上のファイルから取得されず、メモリ内の複数行の文字列になります。これは単一の論理操作であり、リモート側に一時ファイルがないことに注意してください。つまり、予期しない障害やクラッシュによって孤立したファイルが残ることはありません。ファブリックにそのようなオプションがあれば (私が尋ねていることです)、どちらの側にも一時ファイルは必要なく、1 回の ssh 操作だけで済みます。

4

4 に答える 4

5

ファブリック操作を使用できます。あなたが使用することができます fabric.operations.put(local_path, remote_path, use_sudo=False,mirror_local_mode=False,mode=None)

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

また、

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

于 2013-10-21T21:50:58.790 に答える
2

スクリプトがファイルにある場合は、それを読み取ってから、その内容を に渡すことができますrun。ジャスパーの例を書き直す:

from fabric.api import run

script_file = open('myscript.sh')
run(script_file.read())
script_file.close()
于 2013-03-25T18:29:05.227 に答える
0

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

from fabric.api import run

scriptfilehandle = open('myscript.sh')
for line in scriptfilehandle:
    run(line)
于 2012-08-17T11:37:36.153 に答える