web-dev-qa-db-ja.com

gzipはローカルフォルダーを圧縮し、リモートサーバーに抽出します

これらのコマンドは初めてです。ローカルフォルダーをgzipし、リモートサーバーで同じものを解凍しようとしています。問題は、gzip圧縮とunzipがその場で行われる必要があることです。私は多くを試してみましたが、私はこれが最も近いと信じています:

tar cf dist.tar ~/Documents/projects/myproject/dist/ | ssh [email protected]:~/public_html/ "tar zx ~/Documents/projects/myproject/dist.tar"

上記のように、リモートサーバーにdistフォルダーを送信しようとしていますが、その前にその場でフォルダーを圧縮しようとしています(上記のコマンドでは発生していないようです )。

  • ローカルフォルダー:~/Documents/projects/myproject/dist/
  • リモートフォルダー:~/public_html直接デプロイしてライブに

もちろん、gzipで作成されたファイルがあってはなりません。その場で実行する必要があります。

私の意図は、sh file.commandのようなファイルを介して上記のように実行することです。つまり、distフォルダーにあるコンパイル済みプロジェクトをデプロイして、shコマンドが実行されたときにライブするようにしています。プロジェクトに変更を加えるたびに手動でこれを実行したくありません。

3
Mr_Green

rsyncがある場合は、既存のファイルを使用して差分(つまり、異なるファイルの一部)のみを転送できるようにするため、代わりにそれを使用します。

rsync -az ~/Documents/projects/myproject/dist/ [email protected]:public_html/

--deleteフラグを付けて、毎回ターゲットディレクトリツリーを完全に上書きします。何が起こっているのかを見たい場合は、-v

rsyncがない場合は、tarを使用したこの効率の低いソリューションで十分です。

( cd ~/Documents/projects/myproject/dist && tar czf - . ) |
    ssh [email protected] 'cd public_html && tar xzf -'

圧縮されたtarballの書き込みと読み取りはstdoutおよびstdin(the - ファイル名)。 GNU tarを使用している場合は、-Cは処理前に正しいディレクトリを設定するためのものですが、ここでは昔ながらの(伝統的な?)cdを使用しています。 vフラグ(受信側)を追加して、何が起こっているかを確認します。つまり、tar xzvf ...

7
roaima

ディスク上にファイルを作成する代わりに、tarの出力をSTDOUTに送信して、sshを使用してネットワーク経由で送信できるようにする必要があります。

$ tar -zcf - /path/to/files | ssh user@Host "tar -zx - -C /path/to/destination"

ファイル名を使用している「-」文字に注意してください。これらは送信側でtarにSTDOUTに書き込み、受信側でSTDINから読み取るように指示します。アーカイブされたデータがローカルディスクに書き込まれることはありません。

Sshでログインするときにパスを指定することはできません(少なくとも、私はその方法を知りませんでした)。そのため、出力を書き込む場所を受信側でtarに通知する必要があります-これは、 -C /path/to/destinationのためです。

現在書かれているように、このコマンドはローカルディレクトリにネストされたリモート側でファイルが書き込まれることになります-あなたは

/path/to/files/index.html --> /path/to/destination/path/to/files/index.html

代わりに、/path/to/destination/index.html、 これ言ってみて:

$ tar -zcf - -C /path/to/files . | ssh user@Host "tar -zx - -C /path/to/destination"
3
D_Bye

tarにtarballをファイルdist.tarに書き込むように指示しています。このコマンドでは、tarballをリモートマシンに送信していません。

tar-f -を使用してその出力をstdoutに書き込ませる必要があります。ハイフンはstdoutを意味します。 -zオプションを追加すると、tarはstdoutに書き込む前にtarballを圧縮します。これは、リモートマシンにtarballを送信するすべてのユースケースの99%で良いアイデアです。 。

リモート側では、tar -xで抽出します。あなたの例では、リモート側にのみ-zオプションがあります。これは意味がありません。両側で同じ圧縮方法を選択する必要があります。つまり、両側で-zを使用するか、両側で使用しないでください。

これはうまくいくかもしれません

tar -czf - ~/Documents/projects/myproject/dist/ | ssh [email protected] "tar -C ~/public_html/ -xzf -"

(免責事項:私は試していません。エラーが含まれている可能性があります。)

リモートのtarstdinからtarballを読み取ることになっているため、こちらにもファイル名を指定しません。

2
Bananguin

あなたは2つのことを達成しようとしています:

  1. ディレクトリツリーをリモートサイトにコピーする
  2. 転送されるデータを圧縮する

他の回答では、両方の目標を達成できるrsyncの使用について言及しています(rsyncに「-z」オプションを指定すると、圧縮が有効になります)。

tarは目標#1を達成するための優れたツールであり、コマンドラインオプション(他の回答で提供されている "z"フラグなど)を使用すると、目標#2を達成することもできます。

SSH接続自体を使用して、圧縮の目標を達成することもできます。 SSHには、デフォルトでオフになっている圧縮オプションがありますが、コマンドラインまたはssh_configファイルで有効にすることができます( https://linux.die.net/man/5/ssh_config を参照)。圧縮を有効にしたSSHバージョン2は、「gzip -6」圧縮で得られる圧縮レベルと同等です。

これらすべてのオプションを一緒にパイプ処理することの利点は、パイプラインを調整して最良の結果を得ることができることです。 SSH接続で圧縮を有効にするか、tar/rsyncレベルで圧縮を有効にするかを確認するために、実験する必要があります。

Tarはさまざまな圧縮オプション(gzip、bzip2、lzmaなど)を使用できます。rsyncで「-z」オプションを使用すると、gzip圧縮が有効になります。パイプラインの両端に個別の圧縮/解凍プログラムを追加して、圧縮レベルを調整することもできます。 SSH接続で圧縮を明示的に無効にしながら、bzip2圧縮を追加する例を次に示します。

tar cf - ~/Documents/projects/myproject/dist/ | bzip2 -c -9 | ssh -o Compression=no [email protected] "bunzip2 -c | tar -C ~/public_html/ -xf -"

*「パフォーマンス」を測定するには、CPU負荷、ネットワーク上のバイト数、圧縮の実行に必要な時間など、アプリケーションにとって最も重要なものを決定する必要があります。パイプラインを調整して、圧縮レベルとパイプラインのどこで圧縮が適用されるかは、これらの変数に影響します。

パイプラインの複数の場所で圧縮を有効にしても、パフォーマンスは向上しません。

1
spuck