Tôi đã xóa / bin / rm. Làm thế nào để tôi phục hồi nó?


168

Để cho vui, tôi nghĩ rằng tôi sẽ sử dụng lệnh này trên Raspberry Pi đang chạy Raspbian:

sudo rm -f /bin/rm

Tôi nghĩ rằng tôi chỉ có thể cài đặt lại coreutils: Tôi đã sai!

apt-get install --reinstall coreutilsđưa ra một lỗi từ dpkg, nói rằng nó không thể loại bỏ gói. Biên dịch từ nguồn không hoạt động vì Makefilesử dụng rm.

Làm thế nào tôi có thể rmtrở lại làm việc ?


9
Mỗi .deb về cơ bản là một kho lưu trữ mà bạn có thể giải nén và chỉ cần sao chép rm thực thi vào / bin.
schaiba

1
Hệ điều hành này là gì? Linux? Unix? Thứ gì khác? Nếu Linux, bản phân phối nào? 64 bit? 32?
terdon

12
ln -s /usr/lib/initramfs-tools/bin/busybox /bin/rm(hoặc /bin/busybox, hoặc trích xuất nó từ một initrd)
Stéphane Chazelas

10
Raspberry Pi có HĐH trên thẻ nhớ SD, do đó bạn chỉ cần trích xuất nhị phân rm từ gói trên máy khác và sao chép lại vào thẻ. Trong mọi trường hợp, người đóng thế vui nhộn bạn đã kéo ở đó và rất táo bạo để thừa nhận điều đó một cách công khai :)
Christian

15
@ user645715 37 người tìm thấy câu hỏi này thú vị.
Brilliand

Câu trả lời:


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

Và không bao giờ nữa.


Tại sao bạn không sử dụng sudo với apt-get?

Bởi vì downloadlệnh không yêu cầu nó:

download
tải về sẽ tải gói nhị phân đã cho vào thư mục hiện tại.

Vì vậy, trừ khi bạn đang ở trong một số thư mục bạn không thể viết, bạn không cần sử dụng sudovà sau này bạn có thể gặp sự cố vì bạn sẽ cần rootquyền để xóa / di chuyển gói.


3
apt-get cần được chạy với sudo :)
AWippler

31
@AWippler không, trong trường hợp này là không.
Braiam

5
Lưu ý rằng một tệp thực thi trống được thực thi như một tập lệnh shell không làm gì cả. Vì vậy, có nghĩa là viện dẫn /bin/sh. Nó sẽ đơn giản hơn để làm một sudo ln -s true /bin/rmhoặc thậm chí tốt hơn sudo ln -s busybox /bin/rmđể có một công việc rm.
Stéphane Chazelas

1
apt-getkhông cần sudo nếu bạn chưa tải coreutils vì nếu không nó sẽ không thể ghi vào /varnơi debian lưu các tệp đã tải xuống.
Kristopher Ives

3
@KristopherIves sai ... apt-gettải gói xuống thư mục hiện tại luôn (vâng, ngay cả khi bạn đã sử dụng sudo), vì vậy trừ khi bạn ở trong thư mục bạn không thể viết là người dùng mà bạn không cần sudo. Vui lòng kiểm tra các trang người đàn ông.
Braiam

106

debianvà các dẫn xuất của nó (và có lẽ hầu hết các bản phân phối khác) đi kèm với busyboxđược sử dụng trong initramfs.

busybox gói hầu hết các tiện ích dòng lệnh cốt lõi trong một tệp thực thi.

Bạn có thể tạm thời liên kết /bin/rmtới /bin/busybox:

ln -s busybox /bin/rm

Để có được một công việc rm(sau đó bạn có thể làm của bạn apt-get install --reinstall coreutils).

Phương pháp tương tự có thể được sử dụng cho tất cả các tiện ích khác busyboxbao gồm. Danh sách đó thay đổi từ triển khai này sang triển khai khác. Bạn có thể nhận được danh sách với busybox --list.

Tuy nhiên, lưu ý rằng chúng là phiên bản giới hạn của các tiện ích tương ứng. Đôi khi, chúng hỗ trợ các phần mở rộng GNU, nhưng nói chung là không và một số trong số chúng thậm chí sẽ không hỗ trợ tất cả các tính năng tiêu chuẩn / POSIX (một số tính năng có thể được bật / tắt trong thời gian biên dịch).

Ngoài ra, bạn có thể sử dụng zshrm dựng sẵn:

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

Các zsh/filesmô-đun cung cấp với một vài lệnh dựng sẵn bổ sung ( rm, mv, ln, mkdir, rmdir, chown, chmod, sync). Nó hữu ích trong loại tình huống này hoặc khi bạn không thể rẽ nhánh nhiều quy trình hơn nhưng có zshchạy tương tác .

ksh93cũng có một số phụ / tùy chọn lệnh buitin, nhưng không phải rmtrong số đó ( basename, chmod, dirname, getconf, head, mkdir, logname, cat, cmp, cut, uname, wc, sync). Bạn có thể gọi chúng bằng:

command /opt/ast/bin/the-command

trong một ksh93kịch bản.


5
Câu trả lời chính xác. Làm cho tôi tự hỏi nếu OP thực sự cần phải cài đặt lại thực sự rm. ;-)
joeytwiddle

Thật. Trên thực tế, điều này khiến tôi suy nghĩ về việc xóa coreutils quá ... :-)
Damon

4
@Damon: coreutils cung cấp một phiên bản mở rộng của các lệnh cơ bản so với busybox, vì vậy trong khi busybox có thể đủ để đáp ứng các yêu cầu của SUSv3, coreutils có nhiều tính năng hơn; ví dụ busybox có hỗ trợ i18n hạn chế.
liori

2
@liori: Tôi đã nửa đùa nửa thật, mặc dù cách đây 10 - 15 năm, tôi thực sự có thể đã làm điều đó trong tình huống đó ("tính năng" được thêm vào, đặc biệt là i18n , không phải là một lợi thế theo quan điểm của tôi - bản dịch không thể chấp nhận được, và học cách sử dụng các công tắc bất ngờ phá vỡ các tập lệnh trên một máy tính khác, không cần cảm ơn). Tuy nhiên, hiện nay, tôi rất vui nếu chỉ có một hệ thống Linux chạy trơn tru như đã cài đặt mà không cần tôi chạm vào bất cứ thứ gì và không phải di chuyển / xóa / chỉnh sửa các tệp hoặc tệp hệ thống / cấu hình. Đáng buồn thay, vẫn không phải là trường hợp thường xuyên đủ, vì vậy tôi chắc chắn không chạm vào một cái gì đó hoạt động :-)
Damon

29

Trong trường hợp apt-gethoặc dpkgnhu cầu rmvà không có rmcài đặt lại là không thể, thì bạn có thể mô phỏng rmvới perl:

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

3
Lưu ý rằng nó không xử lý -rvà thực tế là nó không trả về trạng thái thoát chính xác có thể gây ra sự cố.
Stéphane Chazelas

6
@StephaneChazelas nó là đủ để cho phép apt-get install --reinstall coreutilsvà đưa OP trở lại bình thường.
terdon

đó là lý do tại sao tôi viết "trong trường hợp". Coreutils gói không có tập lệnh. thông thường các tập lệnh trước và sau khi cài đặt không thành công do lỗi nếu tập tin tồn tại hoặc không tồn tại, ví dụ nếu chúng cần được gỡ bỏ. Và vâng, đúng là tôi đã quá lười để kiểm tra gói hàng trước.

bạn cũng có thể mô phỏng rmvới mv(đến 'thùng rác')
sendmoreinfo

14

Tôi sẽ thử lấy rmnhị phân chính xác từ một máy khác, sau đó sử dụng scphoặc một cái gì đó để sao chép nó vào Pi. Điều này tất nhiên chỉ hoạt động nếu scpđã được cài đặt ...

Nếu scpkhông có sẵn, thì nc(còn gọi là netcat) ở phía gửi và bash với /dev/tcp/HOST/PORTchuyển hướng ở phía nhận cũng có thể hoạt động tốt.

Nếu bạn không có máy Raspbian khác, bạn có thể truy xuất gói coreutils (lấy .debphiên bản phù hợp) và giải nén nó bằng dpkg-deb(trên Debian / Ubuntu / Mint / Lỗi, ngay cả khi không có trên Pi):

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

Nếu bạn không có một máy tính với dpkg, bạn có thể trích xuất các tập tin với ar(từ các công cụ phát triển binutils) và tar:

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

8
Nếu scpkhông có sẵn, thì nc(aka netcat) ở phía gửi và bashvới /dev/tcp/HOST/PORTchuyển hướng ở phía nhận cũng có thể hoạt động tốt.
MvG

13

Vì đó là debian (hoặc ubfox), nên có một cách dễ dàng để lấy các tệp:

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

Điều này hoạt động vì apt-get đã tải xuống coreutils.deb trước khi thử cài đặt nó và dpkg-deb đảm bảo tồn tại trên một hệ thống dựa trên debian.

Không trích xuất trực tiếp vào / tmp, nó thay đổi quyền trên thư mục mẹ.

Nếu bạn định chơi xung quanh, bạn có thể muốn cài đặt gói busybox-static, hoạt động ngay cả khi bạn phá vỡ mọi thứ khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.