フォルダーをSSH経由で送信し、圧縮して送り返す

フォルダーをSSH経由で送信し、圧縮して送り返す

emlファイルを含むフォルダを「A」から「B」に送信し、7zで圧縮して「A」に送り返す必要があります。

ssh user@server "tar -cf - .folder" | 7z a -si compressed_folder.7z

ただし、tar.7z が作成されるため、7z アーカイブを作成する前に tar を解凍する必要があります。どうすれば実現できますか?

追伸:RAMとCPUが少ないため、「A」では圧縮できません

答え1

確かに見苦しいですが、テストしたところ、私の Linux ボックスでは動作しました。

前提: 1 つのフォルダーのみをバックアップしたい (複数のフォルダーに簡単に適応することはできません) ことと、クライアント側で何も上書きしないことを信頼していること。フォルダーはリモート サーバーのホーム ディレクトリにあります。おそらく、ssh にパスワードなしの認証を設定する必要があります。そうしないと、パスワードを 2 回入力する必要があります。

警告: この方法には OS 固有の癖がある可能性があります。たとえば、crontab を使用する場合は、パスをより具体的にする必要があります。BSD を使用している場合は、bashデフォルトでそうではない可能性があります。サーバーにアップロードするための一意のファイル名を作成するために date コマンドを使用していますが、ホストによって動作が異なる場合があります。これにはエラー チェックもありませんが、スクリプトで簡単に追加できます。

簡素化するために、いくつかの変数を作成しました。$cssh 変数により、ssh 接続文字列を繰り返す必要がなくなります。フォルダー名を test/ に変更しましたが、これは 1 回しか使用されないため、変数には入れませんでした。

bash出力の抑制を容易にするために、すべてをまたは(通常、Linux ではこれらはほぼ互換性があります)で囲んでいますshが、出力の抑制を気にしない場合は、これを削除して長さをいくらか短くすることができます。

bash -c 'file=bu$(date +\%Y-\%m-\%d-\%Hh\%Mm\%Ss_\%A).7z; cssh="user@host"; folder=`ssh $cssh "tar -cf - test/ | gzip -9c" | gzip -d | tar -xvf - | head -n 1`; 7z a $file $folder && scp $file $cssh:~ && rm $file && rm -r $folder' > /dev/null 2>&1

sshを使用することが必須であり、使用したくない場合は、 ssh 経由でファイルをコピーするためにscp使用できます。dd

sh -c 'file=bu$(date +\%Y-\%m-\%d-\%Hh\%Mm\%Ss_\%A).7z; cssh="user@host"; folder=`ssh $cssh "tar -cf - test/ | gzip -9c" | gzip -d | tar -xvf - | head -n 1`; 7z a $file $folder && dd if=$file | ssh $cssh "dd of=$file" && rm $file && rm -r $folder' > /dev/null 2>&1

ローカルホストにストリーミングする前にアーカイブをgzip圧縮しました。プレーンテキストファイルで多くの帯域幅を節約できるためです。 へのパイプを削除できますgzip -9cが、その場合はローカルホスト上の対応する解凍を削除する必要があります。gzip -d

または、最初のコマンドをスクリプトに入れてわかりやすくするには、次のようにします。

#!/bin/sh

# make a unique file name to temporarily use for storing 7z'd folder
# will look something like bu2019-09-29-00h18m49s_Sunday.7z
file=bu$(date +\%Y-\%m-\%d-\%Hh\%Mm\%Ss_\%A).7z; 

# SSH connection strong
cssh="user@host"; 

# downloads the remote folder and gets the name of the folder in one variable
folder=`ssh $cssh "tar -cf - test/ | gzip -9c" | gzip -d | tar -xvf - | head -n 1`;

# compress, upload, remove folder, remove file
7z a $file $folder && scp $file $cssh:~ && rm $file && rm -r $folder

関連情報