SSH経由でローカルファイル上でリモートスクリプトを実行する

SSH経由でローカルファイル上でリモートスクリプトを実行する

多数の引数とテキスト ファイルを受け入れる Linux バイナリを備えたリモート マシンがあります。プログラムの出力は stdout に書き込まれ、常にテキスト ファイルに書き込まれます。データ ファイルをリモート マシンにコピーし、そのファイルでコマンドを実行して、結果のファイルをコピーし直す必要があることに気付きました。これは時間がかかり、エラーが発生しやすくなります。

SSH と標準の Linux ツールを使用して、リモート マシンに最初にコピーせずに、ローカル ファイル上で SSH 経由でリモート バイナリを実行することは可能ですか?

理想的には、ローカル マシンに bash スクリプトを用意したいと思います。データ ファイルを引数として指定すると、SSH 接続、データ送信などがすべて実行され、結果がローカルの stdout に出力されます。

私のローカルマシンは Mac OS X で、リモートは Linux です。いいえ、Linux バイナリを Mac OS X で動作させることはできません。

更新: リモートマシン上のツールできるstdin から読み取ります。

答え1

ツールがstdinを読み込める場合の代わりにテキスト ファイルを作成し、その出力を stdout 経由で提供するには、次のbash構文を使用すると、ファイルをコピーする必要なくリモートで実行できます。

< "/local_path/to/input_file" ssh user@remote 'the_tool -some_option1 -option2'

注: 一部のコマンドでは、stdin を読み込むために特別なオプションまたは引数 (例-) が必要です。また、入力ファイルが指定されていないときに stdin を読み込むコマンドもあります。私はあなたのツールについて何も知らないので、これは調整する必要があるかもしれない一般的なアプローチです。

>または (local)を使用して出力をローカル ファイルにリダイレクトするteeこともできます。

< "/local_path/to/input_file" ssh user@remote 'the_tool -some_option1 -option2' | tee "/local_path/to/output_file"

例: remote はcatlocal と remote を連結します/etc/hosts:

< "/etc/hosts" ssh user@remote 'cat - /etc/hosts'

関連情報