ローカル入力を使用してリモートサーバーでローカルスクリプトを実行する

ローカル入力を使用してリモートサーバーでローカルスクリプトを実行する

スクリプトがあり、pythonPythonスクリプトは入力データを使用します。

リモートサーバーでPythonスクリプトを実行したいと思います。Pythonスクリプトとデータをリモートサーバーにコピーする必要はありません。

私はスクリプトを試しました:

ssh [email protected] "cd /home/dong/fold python -u -" <  script.py arg1

スクリプトを実行しますがarg1(入力データ)、Pythonスクリプトはローカルシステムから取得しませんが、入力データがリモートサーバーにある場合は機能します。

専門家がこの問題を解決するためのいくつかの方法を提供できることを願っています。

答え1

方法はありますが、注意事項があります。試してみる前に、完全な答えを読んでください。

サーバーに新しい名前付きパイプ(fifo)を作成します。

ssh [email protected] 'cd /home/dong/fold && mkfifo myfifo'

コマンドがほぼすぐに返され、成功したことを確認する必要があります。これで、リモートで実行されるスクリプトが、名前付きパイプを使用するファイルとして処理するようになります。コマンドはブロックされ、期待どおりに実行されます。

ssh [email protected] 'cd /home/dong/fold && python -u - myfifo' < script.py

上記のコマンドが待っている間、ローカルマシンで名前付きパイプを入力します(明らかに別のローカルコンソールが必要です)。

ssh [email protected] 'cd /home/dong/fold && cat > myfifo' < arg1

これにより、前のコマンドのブロックが解除され、2つのコマンドがデータを転送する必要があります。

注意と警告:

  • cdstdinは消費されないため、localのすべての項目はリモートに移動し、script.pyローカルpythonのすべての項目はリモートにarg1移動しますcat。確実で安全に保ちたい場合は、いつでもcd重要なデータから標準入力を別の方向にリダイレクトできます(</dev/null cd …)。あなたの場合は過剰ですcd。ただし、何らかの理由で他のツールを接続し、そのツールが標準入力を読み取ることができる場合、このリダイレクトはトリックを実行できます。

  • 書き込みプロセスが発生するまで名前付きパイプからデータブロックを読み取り、読み取りプロセスが発生するまで名前付きパイプからデータブロックを書き込みます。つまり、順序に関係なく開始catできpython、さらに同期する必要はありません。 (ローカル)シェルスクリプトでソリューションを実装したり、単一のローカルコンソールですべての操作を実行したい場合は、ssh … cat …まず非同期(つまりバックグラウンドで)実行することをお勧めします。サーバーで名前付きパイプを使用する前に、名前付きパイプを作成することが重要であるため、mkfifo myfifo別のsshコマンドを入力してください。

  • sshサーバーへの単一の接続を介して複数のプログラムを実行できる接続共有メカニズムがあります。望むよりman 1 ssh-Mそして-Sオプション。これは、認証にパスワードを使用し、sshバックグラウンドに何かを置きたいがssh -fこの目的で使用できない場合に特に便利です(たとえば、暗黙的にしたく-nないため-n)。まず、認証を処理しssh -fNMS …てバックグラウンドに移動してから、必要ssh -S …なだけの呼び出しを実行し(バックグラウンドで可能)、最後に実行してssh -O exit -S …基本接続を終了します。詳細は取り上げません。

  • これ以上必要ない場合は、myfifo他のファイルと同じように削除できます(rm myfifoサーバーの正しいディレクトリにあります)。

  • ついに重大な警告

    ローカルデータはscript.pyローカルstdinを介して送信され、sshデータはリモート実行のstdinから取得できないストリームとして使用できますpython。これは問題ではありません。元のコードではすでにそのようなケースが発生しており、私が知っている限り、pythonこの問題は処理できます。

    同様に、ローカルデータは他のローカルデータの標準入力を介して送信され、そのデータはリモートarg1実行が読み取ることができるssh検索不可能なストリームとして利用可能です。pythonmyfifoこれは、Pythonスクリプトがファイルから順次読み取ってファイルを検索できないようにしたい場合にのみ機能します。。パイプから読み取った内容は検索できないため、スクリプトがパイプから読み取った内容も検索できません。スクリプトが検索しようとすると失敗します。スクリプトが書き込みを試みるとmyfifo失敗または誤動作します(スクリプトはargこの方法でローカルを修正する方法はまったくありません)。スクリプトが次を使用して必要な操作を実行できるmyfifoかどうかどちらが公開されていませんか?

    Pythonスクリプトでファイルを取得できる必要がある場合は、ローカルコピーをサーバー上の一般的なファイルとして提供する必要がありますarg(これは望ましくないと明示的に言いましたが、まだ単純なコピーが最も重要です)。まっすぐソリューション)またはサーバーにローカルにインストールして、arg次のように表示します。一般ファイルそこに。後者のアプローチは難しい作業です。サーバー管理者の助けを借りずに、次のタスクのみを実行できます。ヒューズまたは(sshfscurlftpfsもしFUSEが完全に有効になっています)。そして、ローカルコンピュータを選択したプロトコルのサーバーに切り替え、他のコンピュータがローカルコンピュータにアクセスできることを確認する必要があります。詳細は取り上げません。

関連情報