ฉันลบ / bin / rm ฉันจะกู้คืนได้อย่างไร


168

เพื่อความสนุกฉันคิดว่าฉันจะใช้คำสั่งนี้กับ Raspberry Pi ที่รัน Raspbian:

sudo rm -f /bin/rm

ฉันคิดว่าฉันสามารถติดตั้งใหม่ได้coreutils: ฉันผิด!

apt-get install --reinstall coreutilsทำให้เกิดข้อผิดพลาดdpkgโดยบอกว่าไม่สามารถลบแพ็คเกจได้ รวบรวมจากแหล่งที่ไม่ได้ทำงานเพราะการใช้งานMakefilerm

ฉันจะrmกลับไปทำงานได้อย่างไร


9
. deb ทั้งหมดนั้นเป็นไฟล์เก็บถาวรคุณสามารถแตกไฟล์และคัดลอกไฟล์ rm ที่สามารถเรียกใช้งานได้ไปยัง / bin
schaiba

1
นี่คือระบบปฏิบัติการอะไร ลินุกซ์? Unix? อื่น ๆ อีก? หาก Linux ซึ่ง distro? 64bit? 32?
terdon

12
ln -s /usr/lib/initramfs-tools/bin/busybox /bin/rm(หรือ/bin/busyboxหรือดึงออกมาจาก initrd)
Stéphane Chazelas

10
Raspberry Pi มีระบบปฏิบัติการในการ์ดหน่วยความจำ SD ดังนั้นคุณสามารถแยกไบนารี rm ออกจากแพ็คเกจบนเครื่องอื่นและคัดลอกกลับลงบนการ์ด ในกรณีใด ๆ แสดงความสามารถเฮฮาคุณดึงและมีตัวหนามากของคุณที่จะยอมรับมันสาธารณชน :)
คริสเตียน

15
@ user645715 37 คนพบคำถามนี้สนุก
Brilliand

คำตอบ:


194
sudo touch /bin/rm && sudo chmod +x /bin/rm
apt-get download coreutils
sudo dpkg --unpack coreutils*

และไม่เคยอีกครั้ง


ทำไมคุณไม่ใช้ sudo กับ apt-get?

เนื่องจากdownloadคำสั่งไม่ต้องการ:

download
การดาวน์โหลดจะดาวน์โหลดแพ็คเกจไบนารีที่กำหนดลงในไดเรกทอรีปัจจุบัน

ดังนั้นหากคุณไม่อยู่ในไดเรกทอรีที่คุณไม่สามารถเขียนได้คุณไม่จำเป็นต้องใช้sudoและมันอาจจะมีปัญหาในภายหลังเนื่องจากคุณจะต้องมีrootสิทธิ์ในการลบ / ย้ายแพ็คเกจ


3
apt-get ต้องทำงานกับ sudo :)
AWippler

31
@AWippler no ในกรณีนี้ไม่ใช่
Braiam

5
โปรดทราบว่าไฟล์ปฏิบัติการที่ว่างเปล่าจะถูกดำเนินการเป็นเชลล์สคริปต์ที่ไม่ทำอะไรเลย /bin/shดังนั้นนั่นหมายความว่าการกล่าวอ้าง ก็จะได้รับง่ายที่จะทำsudo ln -s true /bin/rmหรือดียิ่งขึ้นที่จะมีการทำงานsudo ln -s busybox /bin/rm rm
Stéphane Chazelas

1
apt-getไม่จำเป็นต้องใช้ sudo หากคุณยังไม่ได้ดาวน์โหลด coreutils เพราะไม่เช่นนั้นมันจะไม่สามารถเขียนไปยัง/varที่ที่ debian บันทึกไฟล์ที่ดาวน์โหลด
Kristopher Ives

3
@KristopherIves ผิด ... apt-getดาวน์โหลดแพคเกจเพื่อไดเรกทอรีปัจจุบันเสมอ (ใช่แม้ว่าคุณจะใช้sudo) sudoดังนั้นถ้าคุณอยู่ในไดเรกทอรีที่คุณไม่สามารถเขียนเป็นผู้ใช้ของคุณคุณไม่จำเป็นต้อง กรุณาตรวจสอบ man pages
Braiam

106

debianและอนุพันธ์ (และอาจจะแจกแจงอื่น ๆ ส่วนใหญ่) มาพร้อมกับที่ใช้ในbusyboxinitramfs

busybox รวมยูทิลิตี้บรรทัดคำสั่ง core ส่วนใหญ่ไว้ในไฟล์ปฏิบัติการเดียว

คุณสามารถ symlink ชั่วคราว/bin/rmไปที่/bin/busybox:

ln -s busybox /bin/rm

เพื่อให้ได้งานrm(หลังจากนั้นคุณก็ทำได้apt-get install --reinstall coreutils)

วิธีเดียวกันนั้นสามารถใช้กับโปรแกรมอรรถประโยชน์อื่น ๆ ทั้งหมดที่busyboxมี รายการนั้นแตกต่างจากการปรับใช้หนึ่งไปยังอีก busybox --listคุณจะได้รับรายการที่มี

อย่างไรก็ตามโปรดทราบว่ามันเป็นยูทิลิตี้ที่เกี่ยวข้องในเวอร์ชัน จำกัด บางครั้งพวกเขาสนับสนุนส่วนขยายของ GNU แต่โดยทั่วไปจะไม่และบางอย่างจะไม่สนับสนุนคุณสมบัติมาตรฐาน / POSIX ทั้งหมด (คุณสมบัติบางอย่างสามารถเปิด / ปิดใช้งานได้ในเวลารวบรวม)

อีกทางหนึ่งคุณสามารถใช้zshbuiltin rm:

#! /bin/zsh
zmodload zsh/files
rm "$@"

zsh/filesโมดูลให้มีคำสั่งในตัวไม่กี่เพิ่มเติม ( rm, mv, ln, mkdir, rmdir, chown, chmod, sync) มันมีประโยชน์ในสถานการณ์แบบนี้หรือเมื่อคุณไม่สามารถแยกกระบวนการมากขึ้น แต่มีการzshทำงานแบบโต้ตอบ

ksh93นอกจากนี้ยังมีจำนวนของการเสริม / คำสั่งตัวเลือก buitin แต่ไม่ได้rmในหมู่พวกเขา ( basename, chmod, dirname, getconf, head, mkdir, logname, cat, cmp, cut, uname, wc, sync) คุณสามารถเรียกใช้พวกเขาด้วย:

command /opt/ast/bin/the-command

ในksh93สคริปต์


5
คำตอบที่ดี ทำให้ฉันสงสัยว่า OP จริง ๆ ต้องติดตั้งจริงrmทั้งหมดหรือไม่ ;-)
joeytwiddle

จริง ที่จริงแล้วนี่ทำให้ฉันคิดถึงการลบ coreutils ด้วย ... :-)
Damon

4
@Damon: coreutils ให้รุ่นเพิ่มเติมของคำสั่งพื้นฐานเมื่อเทียบกับ busybox ดังนั้นในขณะที่ busybox อาจจะเพียงพอที่จะตรงกับความต้องการของ SUSv3, coreutils มีคุณสมบัติมากขึ้น; ตัวอย่างเช่น busybox มีการสนับสนุน i18n จำกัด
liori

2
@liori: ฉันล้อเล่นครึ่งถึงแม้ 10-15 ปีที่แล้วฉันอาจจะได้ทำในสถานการณ์นั้นแน่นอน (คุณสมบัติ "เพิ่มเติม" โดยเฉพาะอย่างยิ่ง i18nไม่ได้เปรียบในความคิดของฉัน - แปลไม่ได้และ เรียนรู้การใช้สวิตช์ที่ทำลายสคริปต์บนคอมพิวเตอร์เครื่องอื่นโดยไม่คาดคิดไม่ต้องขอบคุณ) อย่างไรก็ตามทุกวันนี้ฉันดีใจที่มีเพียงระบบ Linux ที่ติดตั้งอย่างราบรื่นโดยที่ฉันไม่ต้องแตะต้องอะไรเลยและไม่ต้องย้าย / ลบ / แก้ไขไฟล์ system / config หรือไบนารี แต่น่าเสียดายที่ยังไม่เพียงพอดังนั้นฉันจึงไม่ได้สัมผัสสิ่งที่ใช้ได้ :-)
Damon

29

ในกรณีapt-getหรือdpkgความต้องการrmและไม่มีrmการติดตั้งใหม่จะไม่สามารถทำได้คุณสามารถเลียนแบบrmด้วยperl:

cat > /bin/rm << "EOF"
#!/usr/bin/perl
foreach (@ARGV) { unlink $_ or warn "$@:$!"; }
EOF
chmod +x /bin/rm

3
โปรดทราบว่ามันไม่ได้จัดการ-rและความจริงที่ว่ามันไม่ได้ส่งคืนสถานะทางออกที่ถูกต้องอาจทำให้เกิดปัญหา
Stéphane Chazelas

6
@StephaneChazelas นั้นเพียงพอที่จะอนุญาตapt-get install --reinstall coreutilsและรับ OP กลับเป็นปกติ
terdon

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

คุณสามารถเลียนแบบrmด้วยmv(ไปที่ 'ถังขยะ')
sendmoreinfo

14

ฉันจะลองรับrmเลขฐานสองที่ถูกต้องจากเครื่องอื่นแล้วใช้scpหรือบางสิ่งเพื่อคัดลอกไปยัง Pi หลักสูตรนี้ใช้งานได้หากscpติดตั้งไว้แล้ว ...

หากscpไม่สามารถใช้งานได้แล้วnc(aka netcat) ในด้านการส่งและทุบตีด้วยการ/dev/tcp/HOST/PORTเปลี่ยนเส้นทางในฝั่งการรับอาจทำงานได้เช่นกัน

หากคุณไม่มีเครื่อง Raspbian เครื่องอื่นคุณสามารถดึงแพ็คเกจ coreutils (รับ.debรุ่นที่เหมาะสม) และแกะมันด้วยdpkg-deb(บน Debian / Ubuntu / Mint / …แม้ว่าจะไม่ได้อยู่ใน Pi):

dpkg-deb --fsys-tarfile coreutils*.deb | tar xf - ./bin/rm

หากคุณไม่มีเครื่องอื่นที่มี dpkg คุณสามารถแตกไฟล์ด้วยar(จากเครื่องมือพัฒนา binutils) และ tar:

ar p coreutils*.deb data.tar.gz  | tar xzf - ./bin/rm

8
หากscpไม่สามารถใช้งานได้แล้วnc(aka netcat) ที่ด้านการส่งและbashการ/dev/tcp/HOST/PORTเปลี่ยนเส้นทางของฝั่งที่รับอาจใช้ได้เช่นกัน
MvG

13

เนื่องจากเป็นเดเบียน (หรืออูบุนตู) จึงมีวิธีง่าย ๆ ในการรับไฟล์:

mkdir /tmp/coreutils
sudo dpkg-deb --extract /var/cache/apt/archives/coreutils_ [tab complete for correct version].deb /tmp/coreutils
sudo cp /tmp/coreutils/bin/rm /bin

วิธีนี้ใช้งานได้เพราะดาวน์โหลด coreutils.deb ก่อนที่จะพยายามติดตั้งและ dpkg-deb รับประกันว่าจะมีอยู่บนระบบที่ใช้เดเบียน

อย่าแยกไปยัง / tmp โดยตรงจะเปลี่ยนการอนุญาตในไดเรกทอรีหลัก

หากคุณกำลังจะเล่นคุณอาจต้องการติดตั้งแพคเกจ busybox-static ซึ่งทำงานได้แม้ว่าคุณจะทำลายทุกอย่างอื่น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.