실수로 rm -rf / *를 방지하려면 어떻게해야합니까? 완화 된 권한이있었습니다. 나는 권한에

방금 rm -rf /*실수로 달렸 지만 rm -rf ./*슬래시 다음에 별표를 나타냅니다.

alias rm='rm -i'그리고 --preserve-root기본적으로 저를 저장하지 않았기 때문에 이에 대한 모든 자동 안전 장치가있다?


나는 뿌리를 내리지 않고 명령을 즉시 취소했지만 내 Bash 프롬프트가 이미 깨져 있음을 알았 기 때문에 어딘가에 어떤 완화 된 권한이있었습니다. 나는 권한에 의존하고 루트 sudo가 아닌 것을 원치 않으며 (와 같은 실수를 할 수 있음 ) 시스템의 어딘가에 하나의 파일이 없기 때문에 신비한 버그를 찾고 싶지 않기 때문에 백업 및 sudo좋습니다. 이 특정 사례에 더 나은 것을 원합니다.


두 번 생각하고 뇌를 사용하는 것에 대해. 나는 실제로 그것을 사용하고 있습니다! 그러나 10 가지 다른 복잡한 프로그래밍 작업을 해결하기 위해 사용하고 있습니다. 나는이 작업에 깊이 빠져 있습니다. 플래그와 경로를 확인하는 데 필요한 두뇌 능력이 없으며 명령과 인수로 생각조차하지 않습니다. 나는 ‘빈 현재 디렉토리’와 같은 행동의 관점에서 생각합니다. 내 두뇌의 다른 부분은 그것들을 명령으로 번역하고 때로는 실수를합니다. 나는 컴퓨터가 적어도 위험한 것들을 수정하기를 원합니다.



답변

내가 따르는 트릭 중 하나 #rm명령 을 사용하는 동안 처음부터 시작하는 것 입니다.

root@localhost:~# #rm -rf /

rm잘못된 파일 / 디렉토리에서 실수로 실행되는 것을 방지 합니다. 확인되면 #처음부터 제거하십시오 . 이 트릭은 Bash에서 시작하는 단어로 #인해 해당 단어와 해당 줄의 나머지 문자가 모두 무시 되기 때문에 작동합니다 . 따라서 명령은 무시됩니다.

또는

중요한 디렉토리를 막으려면 한 가지 더 요령이 있습니다.

-i해당 디렉토리에 이름이 지정된 파일을 작성하십시오 . 그런 이상한 파일을 어떻게 만들 수 있습니까? 사용 touch -- -i또는touch ./-i

이제 시도해보십시오 rm -rf *:

sachin@sachin-ThinkPad-T420:~$ touch {1..4}
sachin@sachin-ThinkPad-T420:~$ touch -- -i
sachin@sachin-ThinkPad-T420:~$ ls
1  2  3  4  -i
sachin@sachin-ThinkPad-T420:~$ rm -rf *
rm: remove regular empty file `1'? n
rm: remove regular empty file `2'? 

여기서 명령 줄로 *확장 -i되므로 명령이 궁극적으로됩니다 rm -rf -i. 따라서 제거 전에 명령이 프롬프트됩니다. 당신은 당신이 파일을 넣을 수 있습니다 /, /home/, /etc/, 등

또는

--preserve-root옵션으로 사용하십시오 rm. 에서 rm새에 포함 된 coreutils패키지이 옵션은 기본값입니다.

--preserve-root
              do not remove `/' (default)

또는

사용 안전 RM은

웹 사이트에서 발췌 :

Safe-rm은 / bin / rm을 래퍼로 바꾸어 실수로 중요한 파일이 삭제되는 것을 방지하기위한 안전 도구로, 제거 할 수없는 파일 및 디렉토리의 구성 가능한 블랙리스트에 대해 지정된 인수를 검사합니다.

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

$ rm -rf /usr
Skipping /usr

답변

너의 문제:

실수로 rm -rf / *를 실행했지만 rm -rf ./*를 의미했습니다 (슬래시 다음에 별표 표시).

해결책 : 그렇게하지 마십시오! 실제로 ./는 경로의 시작 부분에 사용하지 마십시오 . 슬래시는 명령에 값을 추가하지 않으며 혼란을 야기 할뿐입니다.

./*는와 같은 의미 *이므로 위의 명령은 다음과 같이 작성하는 것이 좋습니다.

rm -rf *

관련 문제가 있습니다. 나는 누군가가 그 가정들은 다음의 식을 참조 FOO같은 값으로 설정됩니다 /home/puppies. 필자는 오늘날 주요 소프트웨어 공급 업체의 설명서에서 실제로 이것을 보았습니다.

rm -rf $FOO/

그러나 FOO설정되어 있지 않으면이 평가되어 rm -rf /시스템의 모든 파일을 제거하려고 시도합니다. 후행 슬래시는 필요하지 않으므로 실제로는 사용하지 마십시오.

다음은 동일한 작업을 수행하며 시스템을 손상시킬 가능성이 적습니다.

rm -rf $FOO

이 팁을 어려운 방법으로 배웠습니다. 14 년 전에 처음으로 슈퍼 유저 계정을 만들었을 때 실수로 rm -rf $FOO/쉘 스크립트에서 실행 되어 시스템을 파괴했습니다. 다른 4 명의 sysadmins는 이것을보고 이렇게 말했습니다. 모든 사람이 한 번만합니다. 이제 설치 미디어 (36 플로피 디스크)가 있습니다. 고쳐라. ‘

다른 사람들은 여기와 같은 솔루션을 권장 --preserve-root하고 safe-rm. 그러나 이러한 솔루션이 모든 Un * xe- 변형체에 존재하는 것은 아니며 Solaris, FreeBSD & MacOSX에서는 작동하지 않을 수 있습니다. 또한, safe-rm당신은 당신이 사용하는 모든 단일 리눅스 시스템에 패키지를 추가로 설치해야합니다. 에 의존 safe-rm하는 경우 새 작업을 시작했는데 safe-rm설치 되지 않은 경우 어떻게됩니까? 이 도구는 목발이며 알려진 기본값을 사용하고 작업 습관을 향상시키는 것이 훨씬 좋습니다.


답변

이것이 “Serverfault”에 있기 때문에 다음과 같이 말하고 싶습니다.

많은 수의 서버 / 관리자 / 사용자로 구성된 서버가있는 경우 누군가 가 잘못된 디렉토리로 이동 rm -rf했거나 chown잘못된 디렉토리입니다.

최소한의 MTTR로 영향을받는 서비스를 백업 할 계획이 있어야합니다.


답변

최선의 해결책은 rm직접 사용하지 않는 습관을 바꾸는 것 입니다.

한 가지 방법은 echo rm -rf /stuff/with/wildcards*먼저 실행하는 것 입니다. 와일드 카드의 출력이 적절한 지 확인한 다음 셸 기록을 사용하여을 사용하지 않고 이전 명령을 실행하십시오 echo.

또 다른 방법은 echo명령을 삭제하려는 내용이 눈에 띄는 경우 로 제한하는 것입니다. 디렉토리의 모든 파일을 제거하는 대신 디렉토리를 제거하고 새 디렉토리를 작성하십시오. 기존 디렉토리의 이름을로 변경 DELETE-foo한 다음 foo적절한 권한 으로 새 디렉토리를 작성 하고 마지막으로 제거하는 것이 DELETE-foo좋습니다. 이 방법의 부작용은 기록에 입력 한 명령이입니다 rm -rf DELETE-foo.

cd ..
mv somedir DELETE-somedir
mkdir somedir                 # or rsync -dgop DELETE-somedir somedir to preserve permissions
ls DELETE-somedir             # just to make sure we're deleting the right thing
rm -rf DELETE-somedir

항상 존재해야하거나 디렉토리를 다시 만들 수있는 권한이 없기 때문에 디렉토리를 유지해야하기 때문에 많은 파일을 삭제해야하는 경우 파일을 다른 디렉토리로 이동하고 해당 디렉토리를 삭제하십시오. .

mkdir ../DELETE_ME
mv * ../DELETE_ME
ls ../DELETE_ME
rm -rf ../DELETE_ME

( Alt+ .키를 누르십시오.)

내부에서 디렉토리를 삭제하는 것은 매력적이기 때문에 rm -rf .오타의 위험이 적습니다. 불행히도 일반적인 시스템에서는 그렇게 할 수 없습니다. 당신은 위해 할 수있는 rm -rf -- "$PWD"오타의 위험이 높은 대신하지만 그들 중 대부분은 아무것도 제거하지로 이어집니다. 이것은 쉘 히스토리에 위험한 명령을 남깁니다.

가능하면 버전 관리를 사용하십시오. 당신은 rm, 당신 cvs rm또는 무엇이든 하지 않으며 , 그것은 취소 할 수 없습니다 .

Zsh에는 rm디렉토리의 모든 파일을 나열하는 인수를 사용하여 실행하기 전에 프롬프트를 표시하는 옵션이 있습니다 . rm_star_silent(기본적으로 켜짐)을 실행하기 전에 프롬프트 rm whatever/*하고 rm_star_wait(기본적으로 꺼짐) 확인할 수없는 10 초 지연을 추가합니다. 프롬프트가 표시 될 것으로 예상되므로 일부 디렉토리에서 모든 파일을 제거하려는 경우 이는 제한적으로 사용됩니다. 이 같은 오타 방지 할 수 있습니다 rm foo *를 들어 rm foo*.

rm명령 변경과 관련하여 더 많은 솔루션이 떠 있습니다 . 이 접근 방식의 한계는 언젠가는 실제 머신을 사용하고 확인을 기대할 때 안전하고 rm자동으로 전화 rm하고 다음으로 백업을 복원한다는 것입니다.


답변

언급했듯이 항상 별칭을 사용할 수 있습니다.

what_the_hell_am_i_thinking() {
   echo "Stop." >&2
   echo "Seriously." >&2
   echo "You almost blew up your computer." >&2
   echo 'WHAT WERE YOU THINKING!?!?!' >&2
   echo "Please provide an excuse for yourself below: " 
   read 
   echo "I'm sorry, that's a pathetic excuse. You're fired."
   sleep 2
   telnet nyancat.dakko.us
}

alias rm -fr /*="what_the_hell_am_i_thinking"

또한 명령 줄 트위터 클라이언트와 통합하여 rm -fr /*루트로 하드 디스크를 닦아서 자신에게 거의 굴욕을 느끼는 방법을 친구들에게 알릴 수 있습니다 .


답변

예 : 루트로 일하지 말고 행동하기 전에 항상 두 번 생각하십시오.

또한 https://launchpad.net/safe-rm 과 같은 것을 살펴보십시오 .


답변

실수를 방지하는 가장 간단한 방법 rm -rf /*은 모든 rm명령 사용을 피하는 것입니다 ! 사실, 나는 rm /bin/rm명령을 완전히 없애기 위해 항상 달려 가고 싶어했습니다! 아니, 난 안면이 아니에요

대신 command -delete옵션을find 사용 하지만 먼저 파일을 삭제하기 전에 삭제할 파일을 미리 보는 것이 좋습니다.

find | less

최신 버전 find에서 디렉토리 이름을 생략하면 현재 디렉토리가 내재적으로 사용되므로 위의 내용은 다음과 같습니다.

find . | less

삭제하려는 파일이 확실하면 -delete옵션 을 추가 할 수 있습니다 .

find path/to/files -delete

따라서 find 사용하는 것이 안전 할 뿐만 아니라 더욱 표현력뛰어나 므로 특정 패턴과 일치하는 디렉토리 계층 구조의 특정 파일 만 삭제하려면 다음과 같은 표현식을 사용하여 미리 본 후 파일을 삭제할 수 있습니다.

find path/to/files -name '*~' | less
find path/to/files -name '*~' -delete

find더 안전한 것 외에 배우고 사용해야하는 많은 이유가 rm있기 때문에 시간을내어 사용 방법을 익히면 나중에 스스로에게 감사 할 것 find입니다.