1

さて、私は最近、標準入力スタイルの行を対話型コマンドにフィードするためのヒア ドキュメントの魔法を発見しました。ただし、これをSSHで使用してリモートサーバーで一連のコマンドを実行しようとしていますが、追加のコマンドを実行する前に実際の入力をパイプする必要があり、さらに問題を混乱させる必要がありますいくつかの結果も取得する必要があります戻る ;)

これが私が使おうとしているものです:

#!/bin/sh
RESULT=$(find -type f "$PATH" | gzip | ssh "$HOST" <<- 'REMOTE_SYNC'
    cat > "/tmp/.temp_file"

    # Do something with /tmp/.temp_file
REMOTE_SYNC

これは果たして正しいのでしょうか?私が抱えている問題の一部は、データを /tmp のそのファイルにパイプする必要があることですが、実際にはランダムな名前の一時ファイルを生成する必要がありますが、どのようにそれを行うことができるかわかりません。変数に名前を付けて(変数に戻ることができるように)、標準入力を変数に送信します。

find | を抽出することもできます。最初にローカルで実行される別のコマンドに gzip 部分を追加します。gzip 圧縮されたファイルはおそらく十分に小さいため、準備が整ったときに送信すると、SSH 接続がはるかに短くなり、生成されたときに送信されますが、それでもその事実を回避することはできません。標準入力と追加コマンドの両方を SSH に提供できる必要があります。

4

1 に答える 1

4

いいえ、このようにすることはできません。ヒアドキュメントとパイプ入力の両方が stdin をめぐって競合し、1 つだけが勝ちます。この例を見てください:

echo test | cat << EOF
TEST
EOF

これは何を印刷しますか?testTESTまたは両方?が出力さTESTれるため、ヒアドキュメントが優先されます (少なくとも bash では)。

とにかく、これは本当に必要ありません。幸いなことに、リモート ホストのシェルに渡される引数sshを取るcommandので、ここでコマンドを文字列として使用できます。だから、このようなもの:

echo TEST | ssh user@host 'cat > tempfile; cat tempfile; rm tempfile'

(あまり意味がありませんが) 動作しますが、左側のコマンドの出力はsshリモート ホストにパイプされ、そこで stdin として提供されます。

ssh 経由で送信するときにデータを圧縮したい場合は、-Cオプションを使用して圧縮を有効にするだけです。


編集:

文字列内で改行を使用してもまったく問題ないため、これも問題なく機能します。

echo TEST | ssh user@host '
    cat > tempfile
    cat tempfile
    rm tempfile
'

ヒアドキュメントとの唯一の違いは、引用符をエスケープする必要があることです。

echo TEST | ssh user@host "$(<script.sh)"すべてをファイルに書き込むことができるようなものを使用すると...

于 2013-04-20T20:23:18.967 に答える