パイプを使用してtar stdoutをファイルに保存する

パイプを使用してtar stdoutをファイルに保存する

SSHを使用してアーカイブをリモートシステムにダウンロードし、リモートクライアントからアーカイブを抽出してみました。パフォーマンスが良いからです。

tar xjOfアーカイブをダウンロードし、リモートクライアントからSSHを介してファイルを抽出する非常に簡単なスクリプトがあります。次に、抽出されたファイルをクライアントにローカルに保存できるいくつかのプロセスにtarコマンドの出力をパイプしたいと思います。 tarにはこの機能が必要だと思いますが、解決策が見つかりません。

#!/bin/bash
ssh $1@$2 'wget https://url.to.my/archive.tar.bz2' #Save the archive to the remote client
ssh $1@$2 'tar archive.tar.bz2 -xjOf' | ??? #What local tool can be used to take the output and save the files from it? 

私はLinuxとシェルスクリプトに初めて触れたので、コードを改善する方法はたくさんあります。しかし、今はこれらのファイルをローカルクライアントに保存する方法だけを知りたいです。

ご協力ありがとうございます

ベストアンサー1

リモートシステムからアーカイブをダウンロードし、解凍し、ローカルシステムからファイルを抽出するには、次のようにします。

you@local ssh <remote> "wget -qO - https://url.to.my/archive.tar.bz2 | bunzip2" | tar x

ここで何が起こるかは次のとおりです。

  1. リモートコンピュータで引用符でコマンドを実行できます。したがって、ダウンロードと解凍はリモートコンピュータで行われます。
  2. このコマンドの出力はローカルシステムの tar にパイプされ、ローカルに抽出されます。
  3. Andre Beaudと私が指摘したように、これは圧縮されていないデータがSSHを介してリモートからローカルに送信されることを意味します。これにより、より高速なリモート圧縮解除で得られた時間が、リモートとローカル間のネットワークトラフィックで失われた時間よりも大きくなる可能性があります。
  4. しかし、良いことは、減圧が完了したことですしかし、リモートURLからダウンロードされます。

以下は参考にするいくつかの点です。

  1. ここのスクリプトはコマンドラインです。このコマンドは、SSHの機能を使用してリモートコンピュータでコマンドを実行します。すぐにそして、出力をローカルコンピュータに返します。
  2. いつものように、コマンドがデータストリームを読み取るか(標準入力)書き込むことができるか(標準出力)、書き込むことができるかどうか、およびコマンドにそのように指示する方法を理解するには、ドキュメントを読む必要があります。
    • Wgetは-qOで使用できます。 wgetに標準出力(stout)に書き込むように指示し、ダッシュ(-)を追加します。
    • Bunzipはファイルが提供されていない場合でも機能し、stinから入力を受け取りstoutに書き込みます。
    • デフォルトでは、Tarはstinでも入力を受け取ります。
  3. ファイル形式はストリーミングデータもサポートする必要があります。 tar と bzip2 の両方のフォーマットは問題ありませんが、すべてのフォーマットは問題ありません。 (例:ジッパー)
  4. この場合、wgetは2つの引数を取得します。最初の-qオプション(quiet)はログとエラーメッセージの出力をオフにするためにwgetに追加されたため、tarが読み取るデータストリームの一部ではありません。 2番目の-Oはシェルリダイレクトに似ており、前述のように、次のダッシュ(-)はwgetに標準出力に書き込むように指示します。
  5. この出力はbunzip2にパイプされます。データストリームが Bunzip2 にパイプされる場合、Bunzip2 には追加の指示は必要ありません。したがって、bunzip2 コマンドは wget コマンドの直後に来ることができます。
  6. Bunzip2はtarアーカイブを入力として受け入れ、その内容を解凍することもできます。したがって、中間の追加ステップは必要ない。
  7. wgetとbunzip2は、全体として引用符で囲まれたsshコマンドパラメータで作成されます。
  8. その後、出力全体がローカルシステムのtarにパイプされます。また、tarはデフォルトでstinから入力を受け取るので、extractオプション以外には他のオプションはありません。

付録:
以前の回答の質問を完全に理解していません。ローカルコンピュータからダウンロードし、リモートコンピュータからアーカイブを抽出したい人のためにここに残しました。最も効率的な方法は次のとおりです。

you@local ssh <remote> "wget -qO - https://url.to.my/archive.tar.bz2 | tar xj" 

上記の例では、ファイルは tar に配置されたのと同じディレクトリ構造を持つリモートシステムのホームディレクトリに抽出されます。これを変更できます -リモートの既存のフォルダへ- 次のようになります。

you@local ssh <remote> "wget -qO - https://url.to.my/archive.tar.bz2 | tar xjC <destination/dir>" 

おすすめ記事