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
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.
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:
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.
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".
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.
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.
-C /
saat mengekstraknya.Jawaban:
Gunakan opsi
--absolute-names
atau-P
untuk menonaktifkan fitur ini.sumber
-C /
opsi seperti yang dijelaskan dalam jawaban @Marcus akan menghilangkan pesan STDERR jika itu adalah tujuan utama Anda.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.sumber
tar
. Pesan khusus ini menyebabkantar
keluar dengan status1
, yang menyebabkan saya menerima peringatan email palsu tentang cadangan yang berhasil, hanya karenatar
sedang 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]
-P
- misalnya, jika Anda menyediakan beberapa jenis fitur snapshotting filesystem di FUSE. Beberapa saat Anda mungkin ingin menghapus bidikan di direktori tertentu daripadacwd
dari perspektif pengguna.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:
sumber
tar c -C / home/foo/*
), karena shell tidak tahu tentang root yang diubah. Tapi tetap jawaban yang bagus untuk kasus-kasus lain.-C /
tidak bekerja untukku, titik. Itu tidak mencegah stderr untukku.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.
Dari pada:
sumber
Ini adalah bagaimana saya melakukannya dengan menggunakan metode brute force:
2>&1 | grep -v "Removing leading"
.Sebagai contoh:
sumber
tar
Perintah saya mungkin kembali2
karena kesalahan fatal.Coba gunakan
-C
hanya jalur yang akan mencegah kompresi dengan jalur lengkap:sumber
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.sumber