Wie kann man ein .tar-Archiv mit einer temporären Datei auf ssh senden? Was ist die "-f -" Option in tar?

464
Marco

Wie kann ich die Komprimierung und Dekomprimierung eines Archivs über den Befehl ssh mit dem Befehl tar vornehmen, 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 - 

Dieses Code-Snippet gehört nicht mir, und ich verstehe nicht, wie das -f -im tar-Befehl funktioniert. Die Manpage ist unbrauchbar.

2

4 Antworten auf die Frage

1
Kamil Maciorowski

Mit -f archive.tar, tar -cin dem Archiv schreiben würde, tar -xwürde daraus extrahieren. -f -ist eine spezielle Syntax, die "write to stdout" (beim Erstellen) oder "read from stdin" (beim Extrahieren) bedeutet.

Dies ermöglicht den Einsatz tarin Rohren. Der Clientbefehl leitet taran ssh. Auf der Remote-Seite läuft der SSH-Server ./ScriptServer.shund überträgt den eingehenden Stream an seine Standardeinheit. tar -f -im Skript liest diesen Stream.

Du hast recht, das -f -ist nicht dokumentiert man 1 tar(zumindest in Handbüchern, die ich gelesen habe). Ohne -fdas Tool sollte sowieso stdout oder stdin verwendet werden. Einige andere Tools unterstützen -als speziellen "Dateinamen", um explizit auf "stdout" oder "stdin" zu verweisen. Ich denke, die Unterstützung von -f -in tarist nur eine Konformität mit diesem Halbstandard.

1
JakeGould

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

Welche manSeite betrachten Sie? Die von der Kommandozeile Ihres Systems über man taroder etwas anderes? Diese Online - Manpage Überprüfung auftar -as gut wie dieses -zeigt die folgenden:

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

Also die -fwürde die Eingabe aus einer bestimmten Datei lesen ... Aber was ist dann die -nach der -f? Es ist sicher keine Hölle. Das ist im Grunde ein spezielles Zeichen, das dem Befehl sagt - in diesem Fall -, um die Daten zu erhalten stdin(Standardeingabe) ... Und das stdinkommt vom ersten Skript, das die Ausgabe leitet - über die |Pipe über SSH an das empfangende Skript am Ziel.

0
Sasha Golikov

Hier ist ein Beispiel, ohne ein Skript auf der Empfängerseite zu erstellen. So übertragen Sie Dateien über einen nicht komprimierten Fluss von einem lokalen zu einem entfernten 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 verkettet sie nur. Auf diese Weise können Sie auch eine leichte Komprimierung hinzufügen

tar -cf - "$LocalFile" | gzip -1 | \ ssh $RemoteIP "cd '$RemoteDir'; gzip -cd | tar -xf -" 

Ich empfehle Ihnen nicht, aufgrund einer längeren Übertragungszeit eine tiefe Kompression hinzuzufügen.

Wenn Sie One-Liner wollen, hier ist es:

tar -cf - myFile.txt | gzip -1 | ssh 192.168.1.1 "cd backups; gzip -cd | tar -xf -" 

Getestet, um Dateien von RHEL6 nach Solaris11 und zurück von Solaris nach RHEL zu übertragen.

-1
tonioc

Der erste Befehl "tar -cf -" erstellt die tar-Ausgabe (stdout) anstelle einer regulären Datei.

Dies wird als stdin über ssh gesendet und als solches vom Server-Skript verwendet.

Siehe auch: https://www.cyberciti.biz/faq/howto-use-tar-command-through-network-over-ssh-session/ und https://www.linuxjournal.com/content/working-stdin- und stdout