![SSH経由でローカルファイル上でリモートスクリプトを実行する](https://rvso.com/image/1552761/SSH%E7%B5%8C%E7%94%B1%E3%81%A7%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E4%B8%8A%E3%81%A7%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B.png)
多数の引数とテキスト ファイルを受け入れる 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 はcat
local と remote を連結します/etc/hosts
:
< "/etc/hosts" ssh user@remote 'cat - /etc/hosts'