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 bash
standardmäß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 „ bash
oder“ 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 ssh
zwingend erforderlich ist und Sie dies nicht möchten, scp
können Sie dd
die 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