root@server # tar fcz bkup.tar.gz /home/foo/
tar: Removing leading `/' from member names
Jak mogę rozwiązać ten problem i zachować /
nazwy plików?
-C /
podczas rozpakowywania.
root@server # tar fcz bkup.tar.gz /home/foo/
tar: Removing leading `/' from member names
Jak mogę rozwiązać ten problem i zachować /
nazwy plików?
-C /
podczas rozpakowywania.
Odpowiedzi:
Użyj opcji --absolute-names
lub -P
, aby wyłączyć tę funkcję.
tar fczP bkup.tar.gz /home/foo/
tar fcz bkup.tar.gz --absolute-names /home/foo
-C /
opcji opisanej w odpowiedzi @Marcus pozbędzie się komunikatu STDERR, jeśli jest to twój główny cel.
To właściwie funkcja, a nie problem. Archiwa z absolutnymi lokalizacjami stanowią zagrożenie bezpieczeństwa. Atakujący mogą wykorzystać takie archiwa, aby nakłonić użytkowników do zainstalowania plików w krytycznych lokalizacjach systemu.
Tak, możesz użyć -P
. Ale co jest złego w pozwoleniu tarowi na usunięcie ukośnika i po prostu wymaganie od użytkownika archiwum jawnego wyodrębnienia w katalogu głównym? Następnie świadomie wpływają na krytyczne lokalizacje systemu i nie mogą tego zrobić przypadkowo.
tar
. Ta konkretna wiadomość powodowała tar
wyjście ze stanu 1
, co powodowało, że otrzymywałem fałszywe powiadomienia e-mail o pomyślnych kopiach zapasowych, po prostu dlatego, że tar
pisałem tę wiadomość do STDERR. Rozwiązałem ten problem, używając własnej, poprawionej wersji rozwiązania @ Marcus:cd /path/to/network/share && tar -cJf scripts.backup.tar.xz -C / home/user/scripts 2>/dev/null || [send an email alert]
-P
- na przykład, jeśli udostępniasz jakąś funkcję migawek systemu plików w FUSE. Czasami możesz chcieć rozpakować migawkę w określonym katalogu, a nie cwd
z perspektywy użytkownika.
Jeśli chcesz pozbyć się „Usuwania wiodącego„ / ”z nazw członków” drukowanych do STDERR, ale nadal chcesz odrzucić te wiodące ukośniki, tak jak domyślnie tar, widziałem tutaj doskonałe rozwiązanie komentującego timsoft.
Rozwiązanie polega na użyciu opcji -C do zmiany katalogu na katalog główny (/), a następnie określeniu drzewa plików do zarchiwizowania bez początkowego ukośnika, ponieważ teraz potrzebujesz tylko ścieżki względnej. Działa to tak samo jak normalne polecenie tworzenia tar, ale nie jest wymagane usuwanie:
tar fcz bkup.tar.gz -C / home/foo/
tar c -C / home/foo/*
), Ponieważ powłoka nie wie o zmienionym katalogu głównym. Ale wciąż dobra odpowiedź na inne przypadki.
-C /
nie działa dla mnie kropka. Dla mnie to nie przeszkadza stderrowi.
Miesiąc później, ale znalazłem najbardziej odpowiednie rozwiązanie dla mojej sprawy (w skrypcie powłoki) jest przejście do katalogu nadrzędnego i wykonanie tam polecenia.
cd /var/www/
tar -czf mysite.gz mysite
Zamiast:
tar -czf /var/www/mysite.gz /var/www/mysite
Jest to, jak zrobiłem to za pomocą metody brute force: 2>&1 | grep -v "Removing leading"
.
Na przykład:
tar -cf "$BKUPDIR/${BKUPFILE}.tar" --overwrite --exclude '.*' --one-file-system "$SRCDIR" 2>&1 | grep -v "Removing leading"
tar
polecenie może wrócić 2
po błędzie krytycznym.