전체 파일 시스템을 삭제할 수있는 이유는 무엇입니까?


24

를 통해 전체 파일 시스템을 삭제하는 악명 높은 실수를 저지른 후 sudo rm -rf /*, 내가 한 끔찍한 피해를 복구하고 방금 6 년 동안 잃어버린 사실에 대처 한 후 왜 그렇게 할 수 있는지 궁금해지기 시작했습니다. 이 실수가 발생하는 것을 막기 위해 할 수있는 일.

나에게 제안 된 한 가지 해결책은 내 계정에서 루트 액세스를 취소하는 것이지만 많은 명령이 루트 액세스를 필요로하고 매일 수십 개의 명령을 실행해야 할 때 불편하기 때문에 불편합니다.

시스템을 백업하는 것이 확실한 방법입니다. 그러나 백업을 복원하려면 가동 중지 시간이 필요하며 시스템에 따라 가동 중지 시간이 며칠 또는 몇 주일 수 있으며 경우에 따라 허용되지 않을 수 있습니다.

내 질문은 : 사용자가 파일 시스템을 삭제하려고 할 때 확인을 구현하지 않는 이유는 무엇입니까? 그래서 실제로 그렇게하고 싶을 때 Y를 누르거나 입력하십시오. 적어도 그렇지 않으면 모든 것을 잃지 않습니다.



20
"왜 그렇게 할 수 있습니까?" 왜 should't 이 가능? 디렉토리 계층의 내용을 삭제해야 할 이유가 완벽하게 /있으며 /etc/, 삭제하기에는 거의 나쁜 하위 세트가 많이 있습니다 ( 예 :). rm어떤 디렉토리를 쉽게 삭제할 수 있는지 또는 쉽게 삭제할 수 없는지를 결정하는 것은 단순한 일이 아닙니다 .
chepner

2
제목에 "시스템을 삭제할 수있는 이유는 무엇입니까?" 반면 질문 자체는 "내 질문은 : 사용자가 파일 시스템을 삭제하려고 할 때 확인을 구현하지 않는 이유는 무엇입니까?"입니다. 따라서 이것은 질문을 불분명하게 만듭니다. 당신의 실제 질문은 어느 것이므로 적어도 무엇을 대답해야하는지 알고 있습니까? 명확하게 게시물을 편집하십시오
Sergiy Kolodyazhnyy

3
실제로 여기서 무엇이 문제입니까? 세 가지를 볼 수 있습니다. (1) 왜 가능합니까? (2) 방지하는 방법, (3) 확인을 실시하지 않는 이유는 무엇입니까? -그들은 같은 질문이 아니며, 첫 번째는 추론을 요구하고, 두 번째는 도구를 요구합니다. (세 번째는 두 번째와 관련이 있지만 여전히 동일하지는 않습니다. 확인이 무언가를 막는 유일한 방법은 아닙니다.)
ilkkachu

10
질문 작성자에게 설명을 요구 하지 않으면 전혀 언급하지 마십시오 . 플래그가 무엇인지 알지 못하거나 백업이없는 등 OP의 결함이 무엇인지 설명하는 자체 축하 의견이 많이 있습니다. 많은 사용자들이 백업을하고 이해하지 못하는 명령을 실행할 수 없을 정도로 현명하다는 것을 알고 매우 기쁩니다. 그것은 그들에게는 절대적으로 좋지만 아마도 지금 까지이 교훈을 배운 OP에게는 근본적으로 도움이되지 않습니다. 따라서 우리 자신의 광채를 멈추지 말고 질문에 대답하십시오.
terdon

답변:


16

rm저수준 시스템 도구입니다. 이러한 도구는 모든 시스템에 있어야하는 한 최대한 간단하게 구축됩니다. rm스크립트에서 사용할 수 있도록 확인 프롬프트와 관련하여 잘 알려진 동작이있을 것으로 예상됩니다.

rm /*rm 명령이이 형식으로 표시되지 않으므로 프롬프트 할 특수 사례를 추가 할 수 없습니다. *와일드 카드로 전달되기 전에 쉘에 의해 확장되는 rm특별한 경우를 필요로하는 실제 명령은 같은 것, 그래서 rm /bin /boot /dev /etc /home /initrd.img /lib /lib64 /lost+found /media /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var /vmlinuz. 이 경우를 확인하기 위해 코드를 추가하면 (아마도 다른 리눅스에서는 다를 수 있음) 복잡한 과제 일뿐만 아니라 미묘한 오류가 발생하기 쉽습니다. 표준 리눅스 rm는 옵션 /없이 제거하는 것을 거부함으로써 시스템 파괴로부터 기본적으로 보호 --no-preserve-root됩니다.

기본적으로 이러한 방식으로 시스템을 삭제하지 못하도록하는 세 가지 보호 방법이 있습니다.

  1. 권한-일반 사용자는 중요한 파일을 제거 할 수 없습니다. 당신은 이것을 sudo로 우회했습니다.
  2. 디렉토리-기본적으로 rm은 디렉토리를 제거하지 않습니다. -r 플래그로 이것을 우회했습니다.
  3. 쓰기 방지 된 파일-기본적으로 rm은 쓰기 방지 된 파일을 삭제하기 전에 확인을 요청합니다 (모든 손상을 중지하지는 않았지만 시스템을 복구 할 수 없게되기 전에 프롬프트를 표시했을 수 있음). -f 플래그를 사용하여이 보호를 우회했습니다.

을 실행 rm /path/to/folder/*하지 않고 폴더의 모든 내용을 제거하려면을 수행하십시오 rm -rf /path/to/folder. 그러면 보호 기능 mkdir /path/to/folder이 트리거 --preserve-root되고 폴더의 모든 도트 파일이 제거됩니다.


3
"rm은 잘 알려진 동작을 가질 것으로 예상됩니다"그리고 실제로 POSIX 표준에 의해 지정된 도구 중 하나입니다. "he * 와일드 카드는 rm에 전달되기 전에 쉘에 의해 확장됩니다."정확히, 모든 유형의 매개 변수에 대한 검사를 추가하면 실제 디렉토리 및 파일에 대한 심볼릭 링크가 /될 수 있으므로 많은 조합과 고려가 필요하므로 실용적이지 않습니다. 그리고 표준의 개념으로 돌아가서, 그러한 점검을 추가하면 일관된 행동을
멈출 수

이것이 바로 safe-rm래퍼가있는 이유 입니다 rm.이 방법을 사용하면 전체 임의의 명령 줄 대신 모든 단일 인수를 확인하고 구성 가능한 블랙리스트에 없는지 확인한 다음 rm확인 된 인수 로만 호출 할 수 있습니다. 그것은 매우 복잡하거나 오류가 발생하지 않습니다.
디저트

59

safe-rmsafe-rm 설치rm우발적 인 삭제를 방지하기 위해 명령을 감싸는 래퍼”를 만나십시오 .

safe-rm rm은 제거 할 수없는 파일 및 디렉토리의 구성 가능한 블랙리스트에 대해 지정된 인수를 검사하는 래퍼 로 대체 하여 중요한 파일이 실수로 삭제되는 것을 방지합니다 .

이러한 보호 된 파일 또는 디렉토리 중 하나를 삭제하려는 사용자는이를 수행 할 수 없으며 대신 경고 메시지가 표시됩니다. ( man safe-rm)

위의 설치 링크가 작동하지 않으면 sudo apt install safe-rm대신 사용하십시오. 기본 구성에는 이미 시스템 디렉토리가 포함되어 있습니다. rm /*예를 들어 보겠습니다.

$ rm /*
safe-rm: skipping /bin
safe-rm: skipping /boot
safe-rm: skipping /dev
safe-rm: skipping /etc
safe-rm: skipping /home
safe-rm: skipping /lib
safe-rm: skipping /proc
safe-rm: skipping /root
safe-rm: skipping /sbin
safe-rm: skipping /sys
safe-rm: skipping /usr
safe-rm: skipping /var
…

보시다시피, /home개인 파일이 저장된 것으로 가정 하면 삭제하지 못하게 됩니다. 그러나 ~직접 삭제하려고하면 하위 디렉토리 나 하위 디렉토리를 삭제할 수 있습니다. ~/precious_photos디렉토리 를 추가하려면 물결표가 해결 된 safe-rm설정 파일로 절대 경로 를 추가하십시오 /etc/safe-rm.conf.

echo /home/dessert/precious_photos | sudo tee -a /etc/safe-rm.conf

당신이 실행하는 경우에 rm없이 sudo1-f깃발은 좋은 아이디어이다 를 추가alias 쉘이 차종에 대한 rm-i플래그 기본. 이 방법 rm은 모든 파일을 삭제하기 전에 묻습니다.

alias rm='rm -i'

마찬가지로 유용한 플래그는 -I"3 개 이상의 파일을 제거하기 전에 한 번만 또는 재귀 적으로 제거 할 때"라는 경고 만 표시합니다 -i.

alias rm='rm -I'

이러한 별칭의 일반적인 위험은 다른 환경을 사용할 때 심각하게 역효과를 낳을 수 있습니다.


1 : sudo별칭을 무시합니다 . alias sudo='sudo '하지만 정의하면 해결할 수 있습니다 .


25

확인이 이미 있으며 문제는 -f명령에 있습니다 --force. 사용자가 강제로 작업을 수행하면 수행중인 작업을 알고있는 것으로 간주됩니다 (분명히 실수가 추가 될 수 있음).

예를 들면 :

 rm -r ./*
 rm: remove write-protected regular file './mozilla_mvaschetto0/WEBMASTER-04.DOC'? N
 rm: cannot remove './mozilla_mvaschetto0': Directory not empty
 rm: descend into write-protected directory './pulse-PKdhtXMmr18n'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-bolt.service-rZWMCb'? n
 rm: descend into write-protected directory './systemd-private-     890f5b31987b4910a579d1c49930a591-colord.service-4ZBnUf'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-fwupd.service-vAxdbk'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-minissdpd.service-9G8GrR'? 
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-ModemManager.service-s43zUX'? nn
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-rtkit-daemon.service-cfMePv'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-systemd-timesyncd.service-oXT4pr'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-upower.service-L0k9rT'? n

--force옵션 과 다릅니다 : 확인을받지 못하고 파일이 삭제됩니다.

문제는 명령과 해당 매개 변수를 알고 명령에 대한 자세한 내용을 탐색하는 것 man입니다 (자습서에서 명령을 찾은 경우). 예를 들어 명령을 처음봤을 때 tar xzf some.tar.gz"무엇을 xzf의미합니까? "

그런 다음 tar 맨 페이지를 읽고 그것을 발견했습니다.


나는 그것이 관련이 있다고 생각하지 않습니다. rm이 쓰기 방지 또는 기타 파일을 처음 요청하는 시점에서 이미 중요한 파일을 모두 삭제했을 수 있습니다.
Jonas Schäfer

1
개인적으로 저는 항상 -f폴더를 삭제해야 한다고 생각했습니다 . 나는 확인하고 불평하는 프롬프트를 열었지만 단지 -r필요하다는 것을 알게되었습니다 . 나는 rm -rf그것이 스크립트에서 매우 유용하기 때문에 표준이되었다고 가정 합니다 (존재하지 않는 것을 삭제하려고하기 때문에 스크립트가 실패하는 것을 원하지 않습니다). rm -r쉘에있을 때 "기본"으로 사용하는 것에 주의를 기울여야합니다. 이해할 수없는 "기본"가정은 없어야합니다. 특히 sudo에서는 사람들이 사람 일 것입니다. 최소한 이것이 더 안전합니다.
캡틴 맨

2
Rmdir은 폴더를 삭제하는 가장 안전한 방법입니다
AtomiX84

rm기본적으로 확인을 요구하지 않으며 쓰기 방지 된 디렉토리 및 파일 만 요구합니다. 컴퓨터에서 해당 명령을 실행 한 경우 많은 파일을 삭제했을 수 있습니다. 당신이 필요한 경우 rm확인을 요청, 당신은 전달해야 -i매개 변수를. 예 :rm -ir ./*
Dan

8

백업없이 실행하면 실수를하지 않도록주의해야합니다. 그리고 하드웨어가 절대 실패하지 않기를 바랍니다. (RAID조차도 결함이있는 RAM으로 인한 파일 시스템 손상을 방지 할 수 없습니다.) 이것이 첫 번째 문제입니다. (나는 당신이 이미 알고 있고 앞으로 백업을 할 것이라고 가정합니다.)


그러나 다음과 같은 실수 가능성을 줄이기 위해 할 수있는 일이 있습니다.

  • 별명 rm='rm -I'을 세 개 이상 삭제하면 프롬프트가 표시됩니다.
  • alias mv and cp to mv -iand cp -i(대부분의 일반적인 사용 사례 는 대상 파일을 덮어 쓰지 않아도 됨 ).
  • 별명 sudo='sudo '의 첫 번째 인수에 별칭 확장을 할 수sudo

내가 발견은 rm -I보다 훨씬 더 유용하다 rm -i. 일반적으로 정상적인 사용 중에는 프롬프트가 표시되지 않으므로 예상하지 못한 경고 메시지는 훨씬 더 눈에 띄고 더 나은 경고입니다. 으로 -i(내가 발견하기 전에 -I), I는 입력에 익숙해 \rm비활성화 별칭 확장에, 확인 된 후 나는 제대로 명령을 입력 한 것입니다.

당신은 당신 을 구하기 위해 rm -i또는 -I별명 에 의존하는 습관을 갖고 싶지 않습니다 . 결코 사용하지 않기를 바라는 것이 안전선입니다. 대화식으로 삭제할 일치 항목을 대화식으로 선택하거나 글로브가 추가 파일과 일치하는지 확실하지 않은 경우 수동으로을 입력하십시오 rm -i .../*whatever*. (별명이없는 환경에있는 경우에도 좋은 습관입니다).

지방 손가락을 방어 Enter입력하여 ls -d /*foo*첫번째 다음 위쪽 화살표와 그로 변경, rm -r사용자 입력을 완료 한 후. 따라서 명령 행에는 rm -rf ~/언제든지 위험한 명령이 포함되지 않습니다 . 만 변경하여 "팔" lsrm라인의 시작으로 이동 제어 A, ALT-D로하고, 추가 -r또는를 -f완성 입력에게 한 후 ~/some/sub/dir/명령의 일부를.

삭제하는 내용에 따라 실제로 ls -d첫 번째를 실행 하거나 탭 완성으로 표시되는 내용에 아무것도 추가하지 않으면 실제로 실행 하지 마십시오. rm( -r또는 없이 -rf) 시작할 수 있으므로 그냥 control-a / control-right (또는 alt + f) / space / -r입니다.

(컨트롤 화살표 또는 alt + f / b와 같이 빠르게 이동하여 단어별로 이동하고 alt + backspace 또는 alt + d 또는 control-w를 사용하여 전체 단어를 죽이는 데 사용되는 강력한 편집 키 바인딩을 bash / readline에 사용하십시오. -u는 줄의 시작 부분을 죽이고 control- /는 한 단계 너무 멀리 갈 경우 편집을 취소합니다. 물론 control-r / control-s로 검색 할 수있는 위쪽 화살표 기록)

-rf실제로 읽기 전용 파일을 제거하라는 메시지를 표시하기 위해 필요한 경우가 아니면 피하십시오 .

sudo명령에서 Return 키를 누르기 전에 추가로 생각하십시오 . 특히 전체 백업이 없거나 지금은 백업에서 복원해야 할 때가 아닙니다.


6

짧은 대답은 그러한 명령을 실행하지 않는 것입니다.

긴 이야기는 그것이 커스터마이징의 일부라는 것입니다. 기본적으로 여기에는 두 가지 요소가 있습니다. 하나는 모든 파일을 자유롭게 수정할 수 있다는 사실입니다.

두 번째는 rm 명령이 폴더 아래의 모든 파일을 삭제하는 데 유용한 구문 설탕을 제공한다는 것입니다.

효과적으로 이것은 유닉스 머신의 단순한 단순한 교리로 재건 될 수 있습니다. 모든 것이 파일 입니다. 더 나은 문제를 만들기 위해 액세스 제어가 있지만 사용에 의해 대체됩니다.

수도

나는 이것이 실행될 수 없도록 별칭이나 함수를 추가 할 수 있다고 생각합니다.


4

시스템 파일 공간 사용량이 크지 않은 경우 (그리고 오늘날 'immense'는 '수백 기가 바이트 이상'을 의미) 가상 머신 인스턴스를 생성하고 항상 내부에서 작업합니다. 복구에는 백업 인스턴스 사용이 수반됩니다.

또는 chroot jail을 만들어 그 안에서 작업 할 수 있습니다. 휴지통에 들어간 경우에도 복구가 필요하지만 실행중인 시스템을 사용하면 더 쉽게 복구 할 수 있습니다.


이것은 아마도 가장 효과적인 답변 일 것입니다. 제 3 자 스크립트까지도 모든 피해를 막을 수 있기 때문입니다. 실제 맬웨어에 대해서만 걱정하면됩니다.
PyRulez

다른 각도에 대한 생각. 처음에는 왜 재귀 삭제를 수행해야하는지 묻는 것이 좋습니다. 프로젝트를 제거하는 스크립트 등이 필요할 수도 있습니다.
Loren Rosen

"처음에 재귀 삭제를 수행해야하는 이유를 묻는 것이 좋습니다." 명령이 내장되어 있지 않다고해서 여전히 실수를 할 수는 없습니다. 타사 스크립트는 일부 디렉토리에서 파일을 하나씩 삭제할 수 있습니다. 그리고 하나의 파일 만 터치하는 시스템을 중단시키는 다른 방법이 있습니다. 그러나 교체 rm와 함께하는 것은 safe-rm적어도 도움이됩니다.
PyRulez

스크립트에 대한 나의 생각은 '프로젝트'나 이와 유사한 개념이 내장되어 있다는 것이었다. 프로젝트 루트에 빈 파일이 .project_root있거나 파일 시스템이 파일을 지원하는 경우 디렉토리 자체의 속성 일 수 있습니다. 그런 다음 스크립트는 파일 루트로 이동하여 프로젝트 루트를 찾고 현재 디렉토리가 프로젝트에 없다고 불평합니다. 또는 프로젝트가 모두 같은 위치에있는 경우 스크립트에서 프로젝트 이름을 지정해야 할 수 있습니다. 여전히 잘못된 프로젝트를 삭제할 수는 있지만 전체 시스템을 파괴 할 수는 없습니다.
Loren Rosen

... 또한 변형은 chrootDocker와 같은 것을 사용하는 것입니다 (실제로 chroot덮개 아래에서 사용한다고 생각 합니다). 다른 파일 만 읽으려면 읽기 전용 파일 시스템을 마운트하십시오.
Loren Rosen

3

rm매우 오래된 유닉스 명령이며 사용자 친 화성을 염두에두고 설계되지 않았을 것입니다. 권한이 있으면 요청 된 내용을 정확하게 수행하려고합니다. 많은 신규 사용자의 함정은 코드를 자주보고 sudo사용하는 것에 대해 많이 생각하지 않는다는 것입니다. 직접 같은 파일 수정 기능 rm, dd, chroot, 등의 사용에 각별한주의가 필요합니다.

요즘에는 trash-clitrash 에서 (dodo없이) 사용하고 싶습니다 . 실수로 삭제 한 파일을 쉽게 검색 할 수 있다는 점에서 Windows의 휴지통과 같은 기능을합니다. 우분투에는 이미 파일에 휴지통 폴더와 휴지통으로 이동 기능이 내장되어 있습니다.

그럼에도 불구하고 실수를 할 수 있으므로 전체 파일 시스템을 백업해야합니다.

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