root@server # tar fcz bkup.tar.gz /home/foo/
tar: Removing leading `/' from member names
ฉันจะแก้ปัญหานี้และรักษา/
ชื่อไฟล์ไว้ได้อย่างไร?
-C /
เมื่อแตกไฟล์
root@server # tar fcz bkup.tar.gz /home/foo/
tar: Removing leading `/' from member names
ฉันจะแก้ปัญหานี้และรักษา/
ชื่อไฟล์ไว้ได้อย่างไร?
-C /
เมื่อแตกไฟล์
คำตอบ:
ใช้ตัวเลือก--absolute-names
หรือ-P
เพื่อปิดใช้งานคุณสมบัตินี้
tar fczP bkup.tar.gz /home/foo/
tar fcz bkup.tar.gz --absolute-names /home/foo
-C /
ตัวเลือกตามที่อธิบายไว้ในคำตอบ @Marcus จะลบข้อความ STDERR หากเป็นเป้าหมายหลักของคุณ
นั่นเป็นคุณสมบัติจริงไม่ใช่ปัญหา การเก็บถาวรด้วยตำแหน่งที่แน่นอนเป็นความเสี่ยงด้านความปลอดภัย ผู้โจมตีสามารถใช้ไฟล์เก็บถาวรดังกล่าวเพื่อหลอกลวงผู้ใช้ในการติดตั้งไฟล์ในตำแหน่งที่สำคัญของระบบ
-P
ใช่คุณสามารถใช้ แต่มีอะไรผิดปกติกับการอนุญาตให้ tar ลบเครื่องหมายสแลชและต้องการให้ผู้ใช้ของไฟล์เก็บถาวรทำการแยกในไดเรกทอรีรากอย่างชัดเจน จากนั้นพวกเขาจะส่งผลกระทบต่อตำแหน่งของระบบที่สำคัญอย่างมีสติและไม่สามารถทำได้โดยไม่ตั้งใจ
tar
ผมพบว่าหัวข้อนี้หลังจากตั้งค่าสคริปต์การสำรองข้อมูลที่จะส่งอีเมลในสถานะที่ไม่ใช่ศูนย์การออกจาก ข้อความเฉพาะนี้ทำให้เกิดtar
การออกด้วยสถานะ1
ซึ่งทำให้ฉันได้รับการแจ้งเตือนอีเมลเท็จเกี่ยวกับการสำรองข้อมูลที่ประสบความสำเร็จเพียงเพราะtar
เขียนข้อความนี้ไปยัง STDERR ฉันแก้ไขปัญหานี้โดยใช้โซลูชัน @ Marcus เวอร์ชัน tweaked ของตัวเอง:cd /path/to/network/share && tar -cJf scripts.backup.tar.xz -C / home/user/scripts 2>/dev/null || [send an email alert]
-P
- ตัวอย่างเช่นหากคุณให้ฟีเจอร์การถ่ายภาพระบบไฟล์ใน FUSE บางครั้งคุณอาจต้องการยกเลิกการจับภาพสแนปชอตในไดเรกทอรีที่เฉพาะเจาะจงมากกว่าcwd
จากมุมมองของผู้ใช้
หากคุณต้องการที่จะกำจัดของ "การถอดชั้นนำ` /' จากชื่อสมาชิก" ถูกพิมพ์ไป STDERR แต่ยังคงต้องการที่จะออกจากปิดทับชั้นนำเหล่านั้นเป็นอย่างชาญฉลาดไม่ tar โดยเริ่มต้นที่ผมเห็นเป็นทางออกที่ดีที่นี่โดยการแสดงความคิดเห็น timsoft
โซลูชันเกี่ยวข้องกับการใช้อ็อพชัน -C เพื่อเปลี่ยนไดเร็กทอรีเป็นรูท (/) จากนั้นระบุทรีไฟล์เพื่อเก็บถาวรโดยไม่ต้องใช้เครื่องหมายทับหน้าเพราะตอนนี้คุณต้องการพา ธ สัมพัทธ์เท่านั้น สิ่งนี้ทำในสิ่งเดียวกันกับคำสั่ง tar ปกติ แต่ไม่จำเป็นต้องมีการลอก
tar fcz bkup.tar.gz -C / home/foo/
tar c -C / home/foo/*
) เนื่องจากเชลล์ไม่ทราบเกี่ยวกับรูทที่เปลี่ยนแปลง แต่ก็ยังเป็นคำตอบที่ดีสำหรับกรณีอื่น ๆ
-C /
ไม่ได้ผลสำหรับฉันระยะเวลา มันไม่ได้ป้องกัน stderr สำหรับฉัน
ปลายเดือนหนึ่ง แต่ฉันพบวิธีแก้ปัญหาที่เหมาะสมที่สุดสำหรับเคสของฉัน (ในเชลล์สคริปต์) คือไปที่ไดเร็กทอรีพาเรนต์และเรียกใช้งานคำสั่งที่นั่น
cd /var/www/
tar -czf mysite.gz mysite
แทน:
tar -czf /var/www/mysite.gz /var/www/mysite
2>&1 | grep -v "Removing leading"
นี่คือวิธีที่ฉันไม่ได้โดยใช้วิธีการบังคับเดรัจฉาน:
ตัวอย่างเช่น:
tar -cf "$BKUPDIR/${BKUPFILE}.tar" --overwrite --exclude '.*' --one-file-system "$SRCDIR" 2>&1 | grep -v "Removing leading"
tar
คำสั่งของฉันอาจกลับมา2
เนื่องจากข้อผิดพลาดร้ายแรง
ลองใช้-C
สำหรับพา ธ เท่านั้นซึ่งจะป้องกันการบีบอัดด้วยพา ธ ที่สมบูรณ์:
root@server # tar fcz bkup.tar.gz -C /home/ foo/
ฉันแก้ไขปัญหานี้ด้วย:
cd /home/foo && tar czf ~/backup.tar.gz .
ในแบบที่คุณไม่ได้พยายามใส่เส้นทางที่แน่นอนในการเก็บถาวร tar ในสถานที่แรก หากคุณต้องการ untar ที่รากของระบบไฟล์คุณเพียงแค่
cd / && tar xzf backupt.tar.gz
หลังจากถ่ายโอน