cp เขียนทับ vs rm จากนั้น cp


18

เมื่อฉันพยายามที่จะเขียนทับไฟล์ไบนารีที่มีการเปิดตัวในขณะนี้cpล้มเหลวในการเขียนทับ แต่มันก็เป็นไปได้ที่จะมันแล้วrm cpตัวอย่างเช่น:

user@poste:~$ cp binaryFile /tmp
user@poste:~$ sudo cp /tmp/binaryFile binaryFile 
[sudo] password for user:
cp: cannot create regular file `binaryFile`: Text file busy
user@poste:~$ sudo rm binaryFile 
user@poste:~$ sudo cp /tmp/binaryFile  binaryFile 
user@poste:~$ file binaryFile 
binaryFile : ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x7ce005d9eb50e2574246b6a881e625802f7e49f2, not stripped

มีความคิดอะไรไหม


2
หัวข้อเล็ก ๆ ที่น่าสนใจ แต่ควรอยู่ใน Unix / Linux.SE IMO
underscore_d

คำตอบ:


41

ในกรณีแรกคุณกำลังพยายามเขียนทับเนื้อหาของไฟล์ที่กำลังเรียกใช้เป็นโปรแกรม Linux ไม่อนุญาต - ถ้าเป็นเช่นนั้นคุณจะเขียนทับรหัสได้ทันทีเนื่องจากระบบปฏิบัติการกำลังดำเนินการอยู่ ความแตกต่างแรกจะทำให้โปรแกรมขัดข้องหรือทำให้การทำงานผิดพลาด

แต่ในกรณีที่สองคุณไม่ได้เปลี่ยนเนื้อหาของไฟล์เก่า - คุณกำลังสร้างไฟล์ใหม่แทนที่ของมันในขณะที่ไฟล์เก่าจะเสียชื่อไฟล์ แต่ไม่ทำให้แตะต้องเนื้อหา

(โปรดจำไว้ว่าrmไม่มีเทคนิคการลบไฟล์มันเพียงแค่ลบลิงค์ไดเรกทอรี - คล้ายกับวิธีlnเพิ่มลิงค์ไปยังไฟล์เดียวกันเฉพาะเมื่อไฟล์ไม่มีลิงค์และไม่มีการอ้างอิงไฟล์ที่เปิดอยู่มันจะถูกลบโดยอัตโนมัติ)

ระบบอ้างอิงไฟล์ที่ใช้งานโดย inode ของพวกเขาดังนั้นจึงไม่สำคัญว่าพวกเขามีชื่อไฟล์เดียวกัน - มันยังคงเป็นไฟล์เก่าที่ยังคงเปิดอยู่โดยระบบและแม้ว่ามันจะไม่มีลิงค์อีกต่อไปมันจะถูกลบทิ้งเท่านั้น เมื่อทุกโปรแกรมปิด


7
เคล็ดลับอื่น ๆ ที่มักใช้โดยใช้ตรรกะเดียวกัน: เปิดไฟล์ (ชั่วคราว) ในซอฟต์แวร์ของคุณและลบทันทีโดยไม่ต้องปิดไฟล์ก่อน โปรแกรมของคุณยังคงสามารถใช้งานได้ตามที่ต้องการและเมื่อโปรแกรมของคุณปิด (ควบคุม) หรือลืมที่จะปิด (เช่นโปรแกรมของคุณล้มเหลวโดยไม่ต้องล้างข้อมูล) ระบบจะถูกลบโดยอัตโนมัติ (สิ้นสุดโปรแกรมไม่ว่าจะเกิดอะไรขึ้นเผยแพร่การอ้างอิงถึงโปรแกรมทั้งหมดที่มีในไฟล์)
Tonny

2
นั่นเป็นเหตุผลที่เมื่อคุณลบไฟล์บันทึกบางส่วนของกระบวนการทำงานคำสั่ง df จะไม่ส่งคืนขนาดที่แก้ไขจนกว่าคุณจะหยุดกระบวนการ
M4rty

มีวิธีใดบ้างสำหรับโปรแกรมภายนอก (ที่มีสิทธิ์พิเศษรูท) เพื่อค้นหาและสร้างตัวจัดการใหม่สำหรับ inode ที่ห้อยต่องแต่งนี้? ฉันคิดว่ามีโปรแกรมที่ใช้สิ่งนี้เป็น "คุณลักษณะด้านความปลอดภัย" ดังนั้นจึงน่าสนใจที่จะเข้าใจเรื่องราวทั้งหมด
BenPen

3
@BenPen: บน Linux ใช่ - ใช้/proc/*/fdเพื่อเข้าถึงและเลือกลิงก์ ()เพื่อเพิ่มลิงค์ใหม่ไปยังระบบไฟล์
grawity

3
@BenPen และ grawity: ที่จริงแล้วคุณไม่สามารถเชื่อมโยงกลับ inode ในโครงสร้างไดเรกทอรีถ้ามันมีการเชื่อมโยงศูนย์แม้จะมีlinkat()สำหรับเหตุผลด้านความปลอดภัย (ยกเว้นกฎนี้ยกเว้นว่าสร้างขึ้นopen(O_TMPFILE)เพื่อให้เริ่มต้นด้วยศูนย์ลิงก์) หากคุณลองlinkat()ส่งคืน ENOENT แม้เป็นรูท ดูคำตอบของฉันสำหรับคำถามนั้นเพื่อให้สคริปต์ Perl ทำงานได้จริงlinkatและพิสูจน์ว่ามันใช้งานไม่ได้แม้ในขณะที่ root: /
Peter Cordes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.