Wie kann man ein .tar-Archiv per SSH senden, ohne eine temporäre Datei zu haben? Was ist die Option „-f -“ in Tar?

Wie kann man ein .tar-Archiv per SSH senden, ohne eine temporäre Datei zu haben? Was ist die Option „-f -“ in Tar?

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.tarwürde tar -cin das Archiv schreiben bzw. tar -xdaraus extrahieren. -f -ist eine spezielle Syntax, die „in stdout schreiben“ (beim Erstellen) bzw. „von stdin lesen“ (beim Extrahieren) bedeutet.

Dies ermöglicht die Verwendung tarin Pipes. Der Client-Befehl leitet ihn taran weiter ssh. Auf der Remote-Seite wird der SSH-Server ausgeführt ./ScriptServer.shund ü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 -fdas 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 tarist nur eine Konformität mit diesem Halbstandard.

Antwort2

Ich verstehe nicht, wie das -f -im Tar-Befehl funktioniert, die Manpage ist nutzlos.

Welche manSeite siehst Du Dir an? Die aus der Kommandozeile Deines Systems man taroder eine andere?Überprüfen Sie diese Online-Manpage fürtar-sowiewie dieser—zeigt Folgendes:

-f, --file=ARCHIVE
use archive file or device ARCHIVE

Das -fwü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 stdinkommt 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

verwandte Informationen