tar: Menghapus awalan `/ 'dari nama anggota

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

Bagaimana saya bisa mengatasi masalah ini dan tetap menggunakan /nama file?

superuser
sumber
2
Apa sebenarnya yang tidak berfungsi seperti yang diharapkan?
34
Itu bukan masalah. Anda tidak ingin memimpin garis miring pada arsip tar. Serius. Jika Anda ingin mengekstrak arsip ke root sistem Anda, tentukan -C /saat mengekstraknya.
ThiefMaster

Jawaban:

69

Gunakan opsi --absolute-namesatau -Puntuk menonaktifkan fitur ini.

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

tar fcz bkup.tar.gz --absolute-names /home/foo
Barmar
sumber
54
Ini adalah jawaban yang benar, tetapi perlu diketahui, bahwa dalam kebanyakan kasus, ini bukan yang Anda inginkan , karena menghasilkan arsip yang mengekstrak di jalur lengkap!
rubo77
8
Menggunakan -C /opsi seperti yang dijelaskan dalam jawaban @Marcus akan menghilangkan pesan STDERR jika itu adalah tujuan utama Anda.
Matt Sanders
1
Seperti yang dikomentari @ rubo77, biasanya ini bukan hasil yang diharapkan dari perintah.
alfredocambera
3
Sebagian besar waktu ini bukan yang diinginkan pengguna, hanya karena sebagian besar dari mereka tidak membaca manual sampai mereka perlu (tidak ada yang punya waktu untuk itu). Jadi, akan lebih bijaksana untuk, setidaknya, memperluas jawaban Anda, memperingatkan orang untuk tidak melakukan ini kecuali mereka benar-benar yakin mereka mengerti apa efeknya. Terutama diterima sebagai jawaban.
Mladen B.
1
@Toskan Contoh ditambahkan
Barmar
89

Itu sebenarnya fitur, bukan masalah. Arsip dengan lokasi absolut adalah risiko keamanan. Penyerang dapat menggunakan arsip seperti itu untuk mengelabui pengguna agar menginstal file di lokasi sistem yang kritis.

Ya, Anda bisa menggunakannya -P. Tapi apa yang salah dengan mengizinkan tar untuk menghapus garis miring, dan hanya membutuhkan pengguna arsip untuk secara eksplisit melakukan ekstraksi di direktori root? Kemudian mereka secara sadar memengaruhi lokasi sistem kritis, dan tidak dapat melakukannya secara kebetulan.

Mark Adler
sumber
5
Terkadang fitur adalah masalah. Saya menemukan utas ini setelah menyiapkan skrip cadangan yang akan mengirim surel dengan status keluar yang tidak nol tar. Pesan khusus ini menyebabkan tarkeluar dengan status 1, yang menyebabkan saya menerima peringatan email palsu tentang cadangan yang berhasil, hanya karena tarsedang menulis pesan ini ke STDERR. Saya memperbaiki masalah ini dengan menggunakan versi saya sendiri dari solusi @ Marcus:cd /path/to/network/share && tar -cJf scripts.backup.tar.xz -C / home/user/scripts 2>/dev/null || [send an email alert]
rubynorails
1
Saya pikir ada beberapa kasus penggunaan untuk menggunakan -P- misalnya, jika Anda menyediakan beberapa jenis fitur snapshotting filesystem di FUSE. Beberapa saat Anda mungkin ingin menghapus bidikan di direktori tertentu daripada cwddari perspektif pengguna.
DIMMSum
81

Jika Anda ingin menghilangkan "Menghapus awalan` / 'dari nama anggota "yang sedang dicetak ke STDERR, tetapi masih ingin mengabaikan garis miring utama seperti yang dilakukan dengan bijak secara default, saya melihat solusi yang sangat baik di sini oleh komentator timsoft.

Solusinya melibatkan menggunakan opsi -C untuk mengubah direktori ke root (/), kemudian menetapkan pohon file untuk diarsipkan tanpa garis miring, karena sekarang Anda hanya perlu jalur relatif. Ini melakukan hal yang sama dengan perintah tar normal, tetapi tidak ada pengupasan yang dibutuhkan:

tar fcz bkup.tar.gz -C / home/foo/
Marcus
sumber
Ini tidak akan berfungsi dengan cadangan tambahan. Tapi jawaban yang bagus.
gajdipajti
Ini juga tidak berfungsi jika Anda ingin tar file dilambangkan dengan shell-ekspansi (misalnya tar c -C / home/foo/*), karena shell tidak tahu tentang root yang diubah. Tapi tetap jawaban yang bagus untuk kasus-kasus lain.
Boris
1
-C /tidak bekerja untukku, titik. Itu tidak mencegah stderr untukku.
Acumenus
3
@ABB pastikan path yang mengikuti -C / relatif.
zurfyx
Akankah pendekatan ini bekerja jika pengguna tidak memiliki izin pada direktori root?
Mladen B.
31

Satu bulan terlambat, tetapi saya menemukan solusi yang paling tepat untuk kasus saya (dalam skrip shell) adalah pergi ke direktori induk dan jalankan perintah di sana.

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

Dari pada:

tar -czf /var/www/mysite.gz /var/www/mysite
amd
sumber
9
Memang Anda bisa melakukannya dengan menggunakan: tar -zcvf mysite.gz -C / var / www / mysite / Manfaatnya adalah Anda dapat menjalankannya dari direktori mana pun
alfredocambera
Terima kasih untuk bantuannya. Inilah yang saya butuhkan. Saya tidak ingin path lengkap di tarball saya, hanya folder tujuan.
Christia
Ini mungkin seharusnya diterima sebagai jawaban yang benar, saya pikir.
Mladen B.
Saya tidak melihat bagaimana ini menjawab pertanyaan sama sekali. Itu sesuatu yang berbeda yang bisa dilakukan. ... ... ... Seperti: T: Bagaimana saya bisa pergi dari Los Angeles ke New York? A: Sebagai gantinya, pergi ke San Francisco.
G-Man
Saya setuju dengan @ G-Man. Ini akan menghasilkan file tar dengan struktur direktori yang sama sekali berbeda. Dalam beberapa kasus, struktur direktori itu sebenarnya lebih tepat di tempat pertama, tetapi tidak menjawab pertanyaan.
Kevin Keane
7

Ini adalah bagaimana saya melakukannya dengan menggunakan metode brute force: 2>&1 | grep -v "Removing leading".

Sebagai contoh:

tar -cf "$BKUPDIR/${BKUPFILE}.tar" --overwrite --exclude '.*' --one-file-system "$SRCDIR" 2>&1 | grep -v  "Removing leading"
bjackfly
sumber
4
Masalah dengan ini adalah menyembunyikan kode kesalahan. Jadi, jika Anda ingin memeriksa kode kesalahan dari tar dalam skrip bash, maka itu tidak akan mengembalikan 0 pada keberhasilan.
Brian
@staticx, kode kesalahannya adalah 0 terlepas.
Acumenus
1
@ABB tarPerintah saya mungkin kembali 2karena kesalahan fatal.
Jite
1
@Brian, Anda dapat menggunakan $ PIPESTATUS untuk mendapatkan kode keluar. Lihat unix.stackexchange.com/questions/14270/…
simpleuser
3

Coba gunakan -Chanya jalur yang akan mencegah kompresi dengan jalur lengkap:

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

Saya memecahkan masalah ini dengan:

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

dengan cara itu Anda tidak mencoba untuk menempatkan path absolut ke arsip tar di tempat pertama. Jika Anda ingin membukanya di root sistem file Anda hanya

cd / && tar xzf backupt.tar.gz setelah mentransfernya.

James
sumber