web-dev-qa-db-ja.com

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

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

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

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

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

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

ツールがstdin の代わりにテキストファイルを読み取り、stdoutを介してその出力を提供できる場合、このbash構文は、ファイルをコピーすることなくリモートで実行する必要があります。

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

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

>または(ローカル)teeを使用したローカルファイルへの出力のリダイレクトも同様に機能します。

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

例:remote catはローカルとリモートの/etc/hostsを連結します:

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