Wie kann ich die Komprimierung und Dekomprimierung eines Archivs per SSH mit dem TAR-Befehl durchführen, ohne eine temporäre Datei zu erstellen:
Ich habe ein Beispiel:
ScriptClient.sh
#!/bin/bash
tar -cf - myFile.txt | ssh $IP_SERVER ./ScriptServer.sh
ScriptServer.sh
#!/bin/bash
tar -x -C ~/backups/ -f -
Dieser Codeausschnitt stammt nicht von mir und ich verstehe nicht, wie er -f -
im Tar-Befehl funktioniert. Die Manpage ist nutzlos.
Antwort1
Mit -f archive.tar
würde tar -c
in das Archiv schreiben bzw. tar -x
daraus extrahieren. -f -
ist eine spezielle Syntax, die „in stdout schreiben“ (beim Erstellen) bzw. „von stdin lesen“ (beim Extrahieren) bedeutet.
Dies ermöglicht die Verwendung tar
in Pipes. Der Client-Befehl leitet ihn tar
an weiter ssh
. Auf der Remote-Seite wird der SSH-Server ausgeführt ./ScriptServer.sh
und überträgt den eingehenden Stream an seine Standardeingabe. tar -f -
Innerhalb des Skripts wird dieser Stream gelesen.
Sie haben Recht, dass das -f -
nicht dokumentiert ist man 1 tar
(zumindest nicht in den Handbüchern, die ich gelesen habe). Ohne -f
das Tool sollte ohnehin stdout oder stdin verwendet werden. Nur wenige andere Tools unterstützen -
als speziellen „Dateinamen“, um explizit auf stdout oder stdin zu verweisen; ich nehme an, die Unterstützung von -f -
in tar
ist nur eine Konformität mit diesem Halbstandard.
Antwort2
Ich verstehe nicht, wie das
-f -
im Tar-Befehl funktioniert, die Manpage ist nutzlos.
Welche man
Seite siehst Du Dir an? Die aus der Kommandozeile Deines Systems man tar
oder eine andere?Überprüfen Sie diese Online-Manpage fürtar
-sowiewie dieser—zeigt Folgendes:
-f, --file=ARCHIVE
use archive file or device ARCHIVE
Das -f
würde also die Eingabe aus einer bestimmten Datei lesen… Aber was ist dann das -
nach dem -f
? Es ist ganz sicher keine Datei. Das ist im Grunde ein Sonderzeichen, das dem Befehl – in diesem Fall – mitteilt, dass er die Daten stdin
(aus der Standardeingabe) abrufen soll… Und das stdin
kommt vom ersten Skript, das die Ausgabe weiterleitet – über die |
Pipe per SSH an das empfangende Skript am Ziel.
Antwort3
Hier ist ein Beispiel ohne Skripterstellung auf der Empfängerseite. So übertragen Sie Dateien per unkomprimiertem Datenfluss vom lokalen zum Remote-Unix:
LocalDir="./"
LocalFile="myFile.txt"
RemoteIP="192.168.1.1"
RemoteDir="~/backups/"
cd "$LocalDir"
tar -cf - "$LocalFile" | ssh $RemoteIP "cd '$RemoteDir'; tar -xf -"
POSIX Tar komprimiert Dateien nicht, sondern verknüpft sie nur. Sie können auch eine leichte Komprimierung auf diese Weise hinzufügen.
tar -cf - "$LocalFile" | gzip -1 | \
ssh $RemoteIP "cd '$RemoteDir'; gzip -cd | tar -xf -"
Aufgrund der längeren Übertragungszeit empfehle ich Ihnen nicht, eine starke Komprimierung hinzuzufügen.
Wenn Sie einen Einzeiler möchten, hier ist er:
tar -cf - myFile.txt | gzip -1 | ssh 192.168.1.1 "cd backups; gzip -cd | tar -xf -"
Getestet zum Übertragen von Dateien von RHEL6 zu Solaris11 und umgekehrt von Solaris zu RHEL.
Antwort4
Der erste Befehl „tar -cf -“ erstellt das Tar in der Standardausgabe (stdout) statt in einer normalen Datei.
Dies wird als Standardeingabe über SSH gesendet und als solches vom Serverskript verwendet.
Siehe auch :https://www.cyberciti.biz/faq/wie-verwendet-man-tar-command-durch-das-netzwerk-über-ssh-session/Undhttps://www.linuxjournal.com/content/working-stdin-and-stdout