tar: Führendes `/ 'aus Mitgliedsnamen entfernen

137
root@server # tar fcz bkup.tar.gz /home/foo/
tar: Removing leading `/' from member names

Wie kann ich dieses Problem lösen und die /Dateinamen beibehalten?

Superuser
quelle
2
Was genau funktioniert nicht wie erwartet?
34
Es ist kein Problem. Sie möchten keine führenden Schrägstriche in einem Teerarchiv. Ernsthaft. Wenn Sie ein Archiv in Ihr Systemstammverzeichnis extrahieren möchten, geben Sie dies -C /beim Extrahieren an.
ThiefMaster

Antworten:

69

Verwenden Sie die Option --absolute-namesoder -P, um diese Funktion zu deaktivieren.

tar fczP bkup.tar.gz /home/foo/

tar fcz bkup.tar.gz --absolute-names /home/foo
Barmar
quelle
54
Dies ist die richtige Antwort. Beachten Sie jedoch, dass dies in den meisten Fällen nicht der Fall ist , da dies zu einem Archiv führt, das in vollständigen Pfaden extrahiert wird.
Rubo77
8
Wenn Sie die -C /in @Marcus 'Antwort beschriebene Option verwenden, wird die STDERR-Nachricht entfernt, wenn dies Ihr primäres Ziel ist.
Matt Sanders
1
Wie @ rubo77 kommentierte, ist dies normalerweise nicht das erwartete Ergebnis des Befehls.
Alfredocambera
3
Meistens ist dies nicht das, was ein Benutzer möchte, einfach weil die meisten von ihnen das Handbuch nicht lesen, bis sie es brauchen (niemand hat Zeit dafür). Es wäre also ratsam, zumindest Ihre Antwort zu erweitern und die Leute davor zu warnen, es sei denn, sie sind sich absolut sicher, dass sie verstehen, was die Wirkung davon ist. Besonders als Antwort akzeptiert zu werden.
Mladen B.
1
@Toskan Beispiele hinzugefügt
Barmar
89

Das ist eigentlich eine Funktion, kein Problem. Archive mit absoluten Standorten sind ein Sicherheitsrisiko. Angreifer könnten solche Archive verwenden, um Benutzer dazu zu verleiten, Dateien an kritischen Systemstandorten zu installieren.

Ja, du könntest es gebrauchen -P. Aber was ist falsch daran, dass tar den Schrägstrich entfernen darf und der Benutzer des Archivs lediglich die Extraktion explizit im Stammverzeichnis ausführen muss? Dann wirken sie sich bewusst auf kritische Systemstandorte aus und können dies nicht aus Versehen tun.

Mark Adler
quelle
5
Manchmal sind Funktionen Probleme. Ich habe diesen Thread gefunden, nachdem ich ein Backup-Skript eingerichtet habe, das eine E-Mail mit einem Exit-Status ungleich Null von versendet tar. Diese bestimmte Nachricht wurde tarmit dem Status beendet 1, was dazu führte, dass ich bei erfolgreichen Sicherungen falsche E-Mail-Warnungen erhielt, einfach weil tardiese Nachricht an STDERR geschrieben wurde. Ich habe dieses Problem behoben, indem ich meine eigene optimierte Version von @ Marcus 'Lösung verwendet habe:cd /path/to/network/share && tar -cJf scripts.backup.tar.xz -C / home/user/scripts 2>/dev/null || [send an email alert]
rubynorails
1
Ich denke, es gibt einige Anwendungsfälle für die Verwendung -P- zum Beispiel, wenn Sie eine Art Dateisystem-Snapshot-Funktion in FUSE bereitstellen. In manchen Fällen möchten Sie möglicherweise einen Snapshot in einem bestimmten Verzeichnis entpacken und nicht cwdaus Sicht des Benutzers.
DIMMSum
81

Wenn Sie loswerden wollen „leading Entfernen` /‘von Mitgliedsnamen“ zu STDERR gedruckt werden, aber immer noch wollen , diese Schrägstriche wie Teer weise standardmäßig tut verlassen, sah ich eine hervorragende Lösung hier durch Kommentator timsoft.

Die Lösung besteht darin, mit der Option -C das Verzeichnis in das Stammverzeichnis (/) zu ändern und dann den zu archivierenden Dateibaum ohne einen führenden Schrägstrich anzugeben , da Sie jetzt nur einen relativen Pfad benötigen. Dies funktioniert genauso wie ein normaler Befehl zum Erstellen von Tar, es ist jedoch kein Strippen erforderlich:

tar fcz bkup.tar.gz -C / home/foo/
Marcus
quelle
Bei inkrementellen Sicherungen funktioniert dies nicht. Aber eine gute Antwort.
Gajdipajti
Es funktioniert auch nicht, wenn Sie Dateien tarieren möchten, die durch Shell-Erweiterung gekennzeichnet sind (z. B. tar c -C / home/foo/*), da die Shell nichts über das geänderte Root-Verzeichnis weiß. Aber immer noch eine gute Antwort für andere Fälle.
Boris
1
-C /funktioniert bei mir nicht, Punkt. Das hindert mich nicht daran.
Acumenus
3
@ABB Vergewissern Sie sich, dass der Pfad nach -C / relativ ist.
Zurfyx
Funktioniert dieser Ansatz, wenn ein Benutzer keine Berechtigungen für das Stammverzeichnis hat?
Mladen B.
31

Einen Monat zu spät, aber ich fand die geeignetste Lösung für meinen Fall (in einem Shell-Skript) darin, in das übergeordnete Verzeichnis zu wechseln und den Befehl dort auszuführen.

cd /var/www/
tar -czf mysite.gz mysite

Anstatt von:

tar -czf /var/www/mysite.gz /var/www/mysite
amd
quelle
9
In der Tat hätten Sie es tun können mit: tar -zcvf mysite.gz -C / var / www / mysite / Der Vorteil ist, dass Sie es von jedem Verzeichnis ausführen können
alfredocambera
Danke für deine Hilfe. Das habe ich gebraucht. Ich wollte nicht den vollständigen Pfad in meinem Tarball, sondern nur den Zielordner.
Christia
Dies hätte wahrscheinlich als richtige Antwort akzeptiert werden müssen, denke ich.
Mladen B.
Ich verstehe nicht, wie dies die Frage überhaupt beantwortet. Es ist etwas anderes, das getan werden könnte. ……… Wie: F: Wie komme ich von Los Angeles nach New York? A: Geh stattdessen nach San Francisco.
G-Man
Ich stimme @ G-Man zu. Dies führt zu einer tar-Datei mit einer völlig anderen Verzeichnisstruktur. In einigen Fällen ist diese Verzeichnisstruktur in erster Linie besser geeignet, aber sie beantwortet die Frage nicht.
Kevin Keane
7

Dies ist , wie ich es tat durch Brute - Force - Methode verwendet: 2>&1 | grep -v "Removing leading".

Zum Beispiel:

tar -cf "$BKUPDIR/${BKUPFILE}.tar" --overwrite --exclude '.*' --one-file-system "$SRCDIR" 2>&1 | grep -v  "Removing leading"
Jackfly
quelle
4
Das Problem dabei ist, dass der Fehlercode ausgeblendet wird. Wenn Sie also den Fehlercode von tar in einem Bash-Skript überprüfen möchten, wird bei Erfolg keine 0 zurückgegeben.
Brian
@staticx, der Fehlercode ist 0, unabhängig davon.
Acumenus
1
@ABB Mein tarBefehl wird möglicherweise 2bei einem schwerwiegenden Fehler zurückgegeben.
2.
1
@ Brian Sie können $ PIPESTATUS verwenden, um den Exit-Code zu erhalten. Siehe unix.stackexchange.com/questions/14270/…
simpleuser
3

Versuchen Sie, -Cnur für den Pfad zu verwenden, um die Komprimierung mit vollständigen Pfaden zu verhindern:

root@server # tar fcz bkup.tar.gz -C /home/ foo/
Nick Tsai
quelle
2

Ich habe dieses Problem gelöst mit:

cd /home/foo && tar czf ~/backup.tar.gz .

Auf diese Weise versuchen Sie nicht, in erster Linie absolute Pfade in das tar-Archiv einzufügen. Wenn Sie es im Stammverzeichnis des Dateisystems entpacken möchten, müssen Sie nur

cd / && tar xzf backupt.tar.gz nach der Übertragung.

James
quelle