/ bin / rm을 삭제했습니다. 어떻게 복구합니까?


168

재미로, Raspbian을 실행하는 Raspberry Pi에서이 명령을 사용한다고 생각했습니다.

sudo rm -f /bin/rm

나는 단지 다시 설치할 수 있다고 생각했다 coreutils: 나는 틀렸다!

apt-get install --reinstall coreutilsdpkg에서 패키지를 제거 할 수 없다는 오류가 발생 했습니다. 를 Makefile사용 하기 때문에 소스에서 컴파일이 작동하지 않습니다 rm.

rm다시 작업하려면 어떻게 해야합니까?


9
모든 .deb는 기본적으로 압축을 풀고 rm 실행 파일을 / bin에 복사 할 수있는 아카이브입니다.
schaiba

1
이것은 어떤 OS입니까? 리눅스? 유닉스? 다른 것? 리눅스라면 어떤 배포판입니까? 64 비트? 32?
terdon

12
ln -s /usr/lib/initramfs-tools/bin/busybox /bin/rm(또는 /bin/busyboxinitrd에서 추출)
Stéphane Chazelas

10
Raspberry Pi에는 SD 메모리 카드에 OS가 있으므로 다른 컴퓨터의 패키지에서 rm 바이너리를 추출하여 카드에 다시 복사하면됩니다. 어쨌든, 유쾌한 스턴트를 가져 와서 대담하게 공개적으로 인정하십시오 :)
Christian

15
@ user645715 37 명이이 질문을 재미있게 발견했습니다.
Brilliand

답변:


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

그리고 다시는


apt-get과 함께 sudo를 사용하지 않은 이유는 무엇입니까?

때문에 download명령이 필요하지 않습니다 :

download
download는 주어진 바이너리 패키지를 현재 디렉토리 로 다운로드합니다 .

따라서 일부 디렉토리에 있지 않으면 쓸 수 없으며 사용할 필요가 없으며 sudo나중에 root패키지를 제거 / 이동할 수있는 권한 이 필요 하기 때문에 나중에 문제가 발생할 수 있습니다.


3
apt-get은 sudo로 실행해야합니다 :)
AWippler

31
@AWippler 아니오,이 경우 아니오.
Braiam

5
빈 실행 파일은 아무 것도 수행하지 않는 쉘 스크립트로 실행됩니다. 그래서 그것은 호출하는 것을 의미합니다 /bin/sh. 일을하는 것이 더 간단 sudo ln -s true /bin/rm하거나 더 좋을 sudo ln -s busybox /bin/rmrm입니다.
Stéphane Chazelas

1
apt-getcoreutils를 다운로드하지 않으면 sudo가 필요합니다. 그렇지 않으면 /var데비안이 다운로드 한 파일을 저장하는 위치 에 쓸 수 없기 때문 입니다.
Kristopher Ives

3
@KristopherIves wrong ... apt-get은 패키지를 항상 현재 디렉토리로 다운로드합니다 (예, 사용한 경우에도 sudo). 디렉토리에 있지 않으면 사용자로 쓸 수 없습니다 sudo. 매뉴얼 페이지를 확인하십시오.
Braiam

106

debian그리고 그 파생어 (그리고 아마도 대부분의 다른 배포판)는와 함께 busybox사용됩니다 initramfs.

busybox 대부분의 핵심 명령 줄 유틸리티를 단일 실행 파일로 묶습니다.

일시적으로 심볼릭 링크 /bin/rm할 수 있습니다 /bin/busybox:

ln -s busybox /bin/rm

일하기 rm(그 후에는 할 수 있음 apt-get install --reinstall coreutils).

동일한 방법을 busybox포함 하는 다른 모든 유틸리티에 사용할 수 있습니다 . 이 목록은 배포마다 다릅니다. 로 목록을 얻을 수 있습니다 busybox --list.

그러나 해당 유틸리티의 제한된 버전입니다. 때로는 GNU 확장을 지원하지만 일반적으로 지원하지 않으며 일부는 모든 표준 / POSIX 기능도 지원하지 않습니다 (일부 기능은 컴파일 타임에 활성화 / 비활성화 할 수 있음).

또는 zsh의 내장 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

A의 ksh93스크립트.


5
좋은 대답입니다. OP가 실제로 실제를 다시 설치해야하는지 궁금 rm합니다. ;-)
joeytwiddle

과연. 실제로 이것은 coreutils를 삭제하는 것에 대해서도 생각하게합니다 ... :-)
Damon

4
@Damon : coreutils는 busybox와 비교하여 기본 명령의 확장 버전을 제공하므로 busybox는 SUSv3 요구 사항을 충족하기에 충분하지만 coreutils는 더 기능적입니다. 예를 들어 busybox는 i18n 지원이 제한되어 있습니다.
liori

2
@liori : 나는 10 ~ 15 년 전하지만, 난 아마 실제로 그런 상황 (추가 "기능"에 그것을 한 것, 반 농담 특히 국제화에 - unintellegible 번역을하고, 내 의견으로는 장점이 없습니다 다른 컴퓨터에서 스크립트를 예기치 않게 중단시키는 스위치를 사용하는 방법을 배웁니다 (고마워요). 그러나 요즘에는 Linux 시스템 만 아무 것도 건드리지 않고 시스템 / 구성 파일 또는 바이너리를 이동 / 삭제 / 편집하지 않고도 설치 한대로 원활하게 실행되는 것이 기쁘다. 슬프게도, 여전히 충분하지 않은 경우가 많으므로 반드시 작동하는 것을 만지지 않을 것입니다 :-)
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 패키지에는 스크립트가 없습니다. 일반적으로 파일이 존재하거나 존재하지 않는 경우 (예 : 제거해야하는 경우) 사전 설치 및 사후 설치 스크립트는 오류로 인해 실패합니다. 그리고 네, 패키지를 미리 확인하기에는 너무 게으른 것이 사실입니다.

당신은 또한 에뮬레이션 할 수 rmmv( '휴지통'에)
sendmoreinfo

14

rm다른 컴퓨터에서 올바른 바이너리를 얻은 다음 scp또는를 사용하여 Pi에 복사하려고합니다. 이것은 scp이미 설치된 경우에만 작동합니다 ...

scp사용할 수없는 경우 nc송신 측의 (일명 netcat) 및 /dev/tcp/HOST/PORT수신 측 의 리디렉션을 사용하는 bash도 작동 할 수 있습니다.

다른 Raspbian 머신이없는 경우 coreutils 패키지를 검색하고 ( .deb적절한 버전을 얻으려면 ) dpkg-debPi가 아닌 경우에도 Debian / Ubuntu / Mint /…로 압축을 풉니 다 .

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(일명 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

이것은 apt-get이 설치하기 전에 coreutils.deb를 다운로드했으며 dpkg-deb가 데비안 기반 시스템에 존재하기 때문에 작동합니다.

/ tmp로 직접 추출하지 않으면 상위 디렉토리에 대한 권한이 변경됩니다.

놀러 가려면 busybox-static 패키지를 설치하십시오.이 패키지는 다른 모든 것을 깨뜨려도 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.