tar: Başlıca `/ 'yi üye adlarından çıkarma


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

Bu sorunu nasıl çözebilir ve /dosya adlarını tutabilirim ?


2
Tam olarak beklendiği gibi çalışmayan nedir?

34
Sorun değil. Sen istemiyoruz tar arşivi lider eğik çizgi. Ciddi anlamda. Sistem kökünüze bir arşiv çıkarmak istiyorsanız, -C /çıkartırken belirtin .
ThiefMaster

Yanıtlar:


69

Bu özelliği devre dışı bırakmak için --absolute-namesveya -Pseçeneğini kullanın .

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

tar fcz bkup.tar.gz --absolute-names /home/foo

54
Bu doğru cevap, ancak çoğu durumda istediğinin bu olmadığını , tam yollarda açılan bir arşivle sonuçlandığına dikkat et!
rubo77

8
-C /@Marcus'un cevabında açıklanan seçeneği kullanmak, birincil amacınızsa, STDERR mesajından kurtulacaktır.
Matt Sanders,

1
@ Rubo77'nin yorumladığı gibi, genellikle bu komutun beklenen sonucu değildir.
alfredocambera

3
Çoğu zaman bir kullanıcının istediği şey bu değildir, çünkü çoğu kişi ihtiyaç duyuncaya kadar kılavuzu okumaz (hiç kimsenin bunun için zamanı yoktur). Bu nedenle, en azından cevabınızı genişletmek, insanların bunun ne olduğunu tam olarak anlamadıklarından emin olmadıkça, bunu yapmamaları konusunda uyaran akıllıca olacaktır. Özellikle cevap olarak kabul edilmek.
Mladen B.

1
@Toskan Örnekleri eklendi
Barmar

89

Bu aslında bir özellik, problem değil. Mutlak konumları olan arşivler bir güvenlik riskidir. Saldırganlar, bu tür arşivleri, kullanıcıları kritik sistem konumlarına dosya yükleme konusunda kandırmak için kullanabilirler.

Evet, kullanabilirsiniz -P. Peki tar'nın öne eğik çizgiyi kaldırmasına izin vermek ve yalnızca arşiv kullanıcısının kök dizinde çıkarmayı açıkça yapmasını istemek yanlış mı? O zaman bilinçli olarak kritik sistem konumlarını etkiliyorlar ve kazayla yapamıyorlar.


5
Bazen özellikler problemdir. Sıfır olmayan bir çıkış durumunda e-postayla gönderilecek bir yedekleme komut dosyası oluşturduktan sonra bu konuyu buldum tar. Bu mesaj, başarılı bir şekilde yanlış e-posta uyarıları almamı sağlayan tarbir durumdan çıkmaya 1neden oldu, çünkü tarbu mesajı STDERR'ye yazıyordu. Bu sorunu @ Marcus'un çözümünün cd /path/to/network/share && tar -cJf scripts.backup.tar.xz -C / home/user/scripts 2>/dev/null || [send an email alert]
ince ayarlı

1
Sanırım kullanmak için bazı kullanım senaryoları var -P- örneğin, FUSE’de bir tür dosya sistemi görüntü yakalama özelliği sağlıyorsanız. Bazı durumlarda cwd, kullanıcının bakış açısından değil, belirli bir dizindeki anlık görüntüyü kaldırmak isteyebilirsiniz .
DIMMSum

81

STDERR'ye basılan "Baştaki` / "üye adlarından çıkarılması" ndan kurtulmak istiyorsanız, ama yine de bu önde gelen eğik çizgileri varsayılan olarak zekice olduğu gibi zekice olduğu gibi bırakmak istiyorsanız, yorumcu timsoft tarafından burada mükemmel bir çözüm gördüm .

Çözüm, dizini kök (/) olarak değiştirmek için -C seçeneğinin kullanılmasını, ardından eğik çizgi olmadan arşivlenecek dosya ağacını belirtmeyi içerir , çünkü şimdi sadece göreceli bir yola ihtiyacınız vardır. Bu, normal tar tar komutuyla aynı şeyi yapar ancak sıyırmaya gerek yoktur:

tar fcz bkup.tar.gz -C / home/foo/

Artımlı yedeklemeler ile çalışmaz. Ama güzel bir cevap.
gajdipajti

Ayrıca kabuk genişleyen (örn. tar c -C / home/foo/*) İle gösterilen tar tar dosyalarını kullanmak istiyorsanız , çünkü kabuk değiştirilen kök hakkında bir şey bilmiyordur. Ancak diğer durumlar için hala iyi bir cevap.
Boris

1
-C /benim için çalışmıyor, dönem. Benim için stderr engellemez.
Acumenus

3
@ ABB -C / 'yi izleyen yolun göreceli olduğundan emin olun.
zurfyx

Bir kullanıcı kök dizinde izinlere sahip değilse, bu yaklaşım işe yarayacak mı?
Mladen B.

31

Bir ay gecikti, ancak durumum için en uygun çözümü buldum (bir kabuk komut dosyasında) ana dizine gidip oradaki komutu çalıştırmak.

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

Onun yerine:

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

9
Aslında bunu kullanarak yapmış olabilirsiniz: tar -zcvf mysite.gz -C / var / www / mysite / Bunun faydası, herhangi bir dizinden yürütebilmenizdir
alfredocambera

Yardımın için teşekkürler. İhtiyacım olan buydu. Tarball'ımda tam yolu, sadece hedef klasörü istemedim.
Christia

Bu muhtemelen doğru bir cevap olarak kabul edilmiş olmalıydı.
Mladen B.

Bunun soruyu nasıl cevapladığını anlamıyorum. Yapılabilecek farklı bir şey. ……… Beğen: S: Los Angeles'tan New York'a nasıl ulaşabilirim? A: Bunun yerine San Francisco'ya gidin.
G-Man

@ G-Man ile aynı fikirdeyim. Bu tamamen farklı bir dizin yapısına sahip bir tar dosyasına yol açacaktır. Bazı durumlarda, bu dizin yapısı aslında en başta daha uygundur, ancak soruyu yanıtlamaz.
Kevin Keane

7

Ben kaba kuvvet yöntemini kullanarak bunu nasıl yaptı budur: 2>&1 | grep -v "Removing leading".

Örneğin:

tar -cf "$BKUPDIR/${BKUPFILE}.tar" --overwrite --exclude '.*' --one-file-system "$SRCDIR" 2>&1 | grep -v  "Removing leading"

4
Bununla ilgili sorun, hata kodunu gizlemesidir. Yani bir bash betiğinde tar'dan hata kodunu kontrol etmek istiyorsanız, o zaman başarı 0 döndürmez.
Brian

@staticx, hata kodu ne olursa olsun 0'dır.
Acumenus

1
@ ABB Komutum ölümcül hata tarverebilir 2.
Jite

1
@Brian çıkış kodunu almak için $ PIPESTATUS kullanabilirsiniz. Bkz. Unix.stackexchange.com/questions/14270/…
simpleuser

3

-CYalnızca tam yollarla sıkıştırmayı önleyen yol için kullanmaya çalışın :

root@server # tar fcz bkup.tar.gz -C /home/ foo/

2

Bu sorunu şu şekilde çözdüm:

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

bu şekilde ilk önce tar arşivine mutlak yollar koymaya çalışmıyorsunuz. Dosya sisteminin kökünde untar isterseniz, sadece

cd / && tar xzf backupt.tar.gz aktardıktan sonra.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.