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
ここで何が起こるかは次のとおりです。
- リモートコンピュータで引用符でコマンドを実行できます。したがって、ダウンロードと解凍はリモートコンピュータで行われます。
- このコマンドの出力はローカルシステムの tar にパイプされ、ローカルに抽出されます。
- Andre Beaudと私が指摘したように、これは圧縮されていないデータがSSHを介してリモートからローカルに送信されることを意味します。これにより、より高速なリモート圧縮解除で得られた時間が、リモートとローカル間のネットワークトラフィックで失われた時間よりも大きくなる可能性があります。
- しかし、良いことは、減圧が完了したことですしかし、リモートURLからダウンロードされます。
以下は参考にするいくつかの点です。
- ここのスクリプトはコマンドラインです。このコマンドは、SSHの機能を使用してリモートコンピュータでコマンドを実行します。すぐにそして、出力をローカルコンピュータに返します。
- いつものように、コマンドがデータストリームを読み取るか(標準入力)書き込むことができるか(標準出力)、書き込むことができるかどうか、およびコマンドにそのように指示する方法を理解するには、ドキュメントを読む必要があります。
- Wgetは-qOで使用できます。 wgetに標準出力(stout)に書き込むように指示し、ダッシュ(-)を追加します。
- Bunzipはファイルが提供されていない場合でも機能し、stinから入力を受け取りstoutに書き込みます。
- デフォルトでは、Tarはstinでも入力を受け取ります。
- ファイル形式はストリーミングデータもサポートする必要があります。 tar と bzip2 の両方のフォーマットは問題ありませんが、すべてのフォーマットは問題ありません。 (例:ジッパー)
- この場合、wgetは2つの引数を取得します。最初の-qオプション(quiet)はログとエラーメッセージの出力をオフにするためにwgetに追加されたため、tarが読み取るデータストリームの一部ではありません。 2番目の-Oはシェルリダイレクトに似ており、前述のように、次のダッシュ(-)はwgetに標準出力に書き込むように指示します。
- この出力はbunzip2にパイプされます。データストリームが Bunzip2 にパイプされる場合、Bunzip2 には追加の指示は必要ありません。したがって、bunzip2 コマンドは wget コマンドの直後に来ることができます。
- Bunzip2はtarアーカイブを入力として受け入れ、その内容を解凍することもできます。したがって、中間の追加ステップは必要ない。
- wgetとbunzip2は、全体として引用符で囲まれたsshコマンドパラメータで作成されます。
- その後、出力全体がローカルシステムの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>"
答え2
ローカルで実行するにはtarが必要です。 tar -Oはデフォルトではcat
ファイルの内容なので、ファイルを再作成するのには適していません。高速リモートCPUを利用するために、リモートでbunzip2を実行できます。これで、すべてのデータがローカルシステムに再送信されると解凍されます。したがって、帯域幅が最優先である場合は、いつでもより速い解凍コストを失う可能性があります。制限要素両方の方法を試してみてください。とにかく、wgetの後に..
# do the bunzip2 from the ssh, then pass the output to (local) tar to extract the files on the local system:
ssh $1@$2 'bunzip2 < archive.tar.bz2'|tar -x
答え3
tar
次のようにアーカイブを解凍します。 -x=extract、-j=decompress-with-bz2、および -f=filename。こう書くでしょう。
#!/bin/bash
ssh $1@$2 'wget https://url.to.my/archive.tar.bz2'
ssh $1@$2 'tar -xjf archive.tar.bz2'
決定的な出力を得るために、wget -Ofixedname.tar.bz2 ... `wget
などの別の名前でファイルを保存することができるため、これは少し危険です。archive.tar.bz2.1' if a file with the same name already exists. Use
「tar」は(zipとは異なり)ストリーミング形式なので、アーカイブを保存せずにすぐに解凍することができ、ディスク容量とIO操作を少なくします。
ssh $1@$2 'wget -O- https://url.to.my/archive.tar.bz2 |tar -xj'
ファイル名がなく、データが「パイピング」の前にwgetからストリーミングされるため、「-f」を削除しました。一部のコンテンツはまだstderrを介して端末に印刷されます。wget -qO-
必要に応じて、より静かなものを試してください。エラーが発生した場合は印刷を続けますが、エラーが発生した場合にのみ印刷されます。これがUnixの注文です。すべてがうまくいったら言及しないでください。