Ordner per SSH senden, dann komprimieren und zurückschicken

Ordner per SSH senden, dann komprimieren und zurückschicken

Ich muss Ordner mit EML-Dateien von "A" nach "B" senden, sie dann mit 7z komprimieren und an "A" zurücksenden. Was ich habe, ist

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

aber es erstellt tar.7z, also muss ich tar dekomprimieren, bevor ich das 7z-Archiv erstelle. Wie erreiche ich das?

ps. Ich kann sie nicht auf "A" komprimieren, da zu wenig RAM und CPU vorhanden sind

Antwort1

Ich verspreche Ihnen, es ist hässlich, aber ich habe es getestet und es funktioniert auf meiner Linux-Box.

Annahmen: Sie möchten nur einen Ordner sichern (dies lässt sich nicht so einfach auf mehrere Ordner übertragen) und Sie vertrauen darauf, dass Sie auf der Clientseite nichts überschreiben. Der Ordner befindet sich im Home-Verzeichnis des Remote-Servers. Sie möchten wahrscheinlich eine kennwortlose Authentifizierung für SSH einrichten, da Sie sonst ein Kennwort zweimal eingeben müssen.

Warnungen: Es kann betriebssystemspezifische Eigenheiten geben, wie dies gemacht wird. Wenn Sie beispielsweise Dinge mit Crontab ausführen, möchten Sie Ihre Pfade vielleicht spezifischer machen. Vielleicht sind Sie auf einem BSD, sodass dies bashstandardmäßig nicht der Fall ist. Ich verwende den Befehl date, um einen eindeutigen Dateinamen zum Hochladen auf den Server zu erstellen, aber das kann auf verschiedenen Hosts unterschiedlich funktionieren. Es gibt dabei auch keine Fehlerprüfung, obwohl dies leicht in ein Skript eingefügt werden kann.

Ich habe ein paar Variablen erstellt, um die Dinge zu vereinfachen. Die Variable $cssh erspart mir die Wiederholung der SSH-Verbindungszeichenfolge. Beachten Sie, dass ich Ihren Ordnernamen in test/ geändert habe, aber da er nur einmal verwendet wird, habe ich ihn nicht in eine Variable eingefügt.

Ich verpacke das Ganze in „ bashoder“ sh(unter Linux sind sie normalerweise ziemlich austauschbar), um die Unterdrückung der Ausgabe einfach zu machen, aber wenn es Ihnen egal ist, ob die Ausgabe unterdrückt wird, können Sie es entfernen und es etwas kürzer machen.

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

Wenn die Verwendung sshzwingend erforderlich ist und Sie dies nicht möchten, scpkönnen Sie dddie Datei über SSH kopieren:

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

Ich habe das Archiv gzippt, bevor ich es auf den lokalen Host gestreamt habe, weil das bei Klartextdateien viel Bandbreite sparen kann. Sie können die Pipe nach entfernen gzip -9c, aber wenn Sie das tun, müssen Sie die entsprechende Dekomprimierung auf dem lokalen Host entfernen.gzip -d

Oder um den ersten Befehl zur Verdeutlichung in ein Skript zu packen:

#!/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

verwandte Informationen