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?
-C /
saat mengekstraknya.
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?
-C /
saat mengekstraknya.
Jawaban:
Gunakan opsi --absolute-names
atau -P
untuk menonaktifkan fitur ini.
tar fczP bkup.tar.gz /home/foo/
tar fcz bkup.tar.gz --absolute-names /home/foo
-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.
tar
. Pesan khusus ini menyebabkan tar
keluar dengan status 1
, yang menyebabkan saya menerima peringatan email palsu tentang cadangan yang berhasil, hanya karena tar
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 daripada cwd
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:
tar fcz bkup.tar.gz -C / home/foo/
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.
cd /var/www/
tar -czf mysite.gz mysite
Dari pada:
tar -czf /var/www/mysite.gz /var/www/mysite
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"
tar
Perintah saya mungkin kembali 2
karena kesalahan fatal.
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.