방금 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
입니다.