rm –rf 로 인한 대형 사고 예방하기

개요

rm 은 매우 위험한 명령어라 주의깊게 사용해야 한다.

 컨디션이 괜찮고 평온한 일상일 때야 실수할 확률이 적겠지만 연이은 야근으로 체력과 집중력이 떨어졌거나 장애 처리등으로 고도의 스트레스를 받거나 작업중에 전화가 계속 오는등 실수를 유발할  있는 환경에서는 작은 실수가 큰 참극을 부를수 있다.

예로 개인 폴더에서 hidden 인 파일들을 삭제하려고 명령어를 입력했다고 가정해보자.


$ rm -rf ./*


하지만 오타나 실수로 아래 명령어를 쳤고 하필 root 로 로그인중이었다면 해당 시스템에 치명적인 손실을 입힐 수 있다.

# rm -rf /*


실수를 저지르고 이를 통해 배우고 성장하는 건 꼭 필요하지만 rm –rf 로 운영 중인 서비스를 날리는 것은 말하기 부끄러운 실수인 것도 사실이다.

 

"rm -rf /" 등으로 인한 초대형 사고를 예방하기 위한 좋은 작업 습관을 정리해 본다.   

비파괴적인(Non-Destructive) 명령어로 검증

Unix의 login shell로 GNU bash 나 zsh 같은 readline 을 지원하는 쉘을 사용해야 실수를 최소화 할 수 있다.  (참고 - bash 명령어 히스토리 관리 - readline 사용법 및 line 편집, reverse search 등 단축키 요약)

Linux외 Unix에서는 별도로 설치해야 할수 있지만(최근 버전의 Solaris 에는 bash가 들어있다) 미리 컴파일된 package를 찾아서라도 웬만하면 bash를 설치하자   


rm -rf 같이 파괴적인(Destructive) 명령어를 사용할 일이 있다면 ls등 비파괴적인 명령어를 먼저 수행하여 지우려는 대상이 맞는지 확인 후에 수행한다..


예로 /opt/removeme 를 지워야 한다면 다음과 같은 순서로 진행하면 된다.


  1. ls 로 대상 확인

    ls -l /opt/removeme
  2. bash command history 기능을 이용하여 좀전에 입력한 ls 명령어 호출(키보드의  화살표 누름)
  3. Ctrl-A  눌러서 조금전에 호출한 line 시작으로 이동

    이 기능은 bash 의 readline 기능의 일부이므로 bash 여야 사용이 가능하다.(readline shortcuts 바로 가기) 

  4. "ls -l" 을 "rm -rf " 로 수정후 실행하고 정상적으로 수행되었는지 확인. 


파괴적인 명령어 사용전 비파괴적인 명령어로 확인하는 습관은 SQL 작업을 할 경우에도 유용하게 사용할 수 있다.

예로 UPDATE나 DELETE 구문전에 SELECT로 영향받는 레코드의 수를 확인한 후에 SELECT에 사용한 WHERE 조건을 재활용하여 UPDATE, DELETE 구문을 생성하면 된다.



rm 을 안전 옵션으로 실행 

 일반적인 리눅스 배포판에는 GNU의 coreutil package 의 rm 명령어가 포함되어 있고 여기에는 --preserve-root 이라는 옵션이 있다. 이 옵션을 사용하면 실수로 rm -rf / 를 수행해도 다음과 같은 에러를 내며 수행을 거부한다.    

$ rm -rf /


rm: it is dangerous to operate recursively on ‘/’
rm: use --no-preserve-root to override this failsafe


다음과 같이 .bash_profile이나 .profile 같은 쉘 초기화 설정 파일에 rm 명령어를 -i(interactive) 옵션과 --preserve-root 옵션을 추가하여 alias 지정하는 것을 추천한다. 

alias rm='rm -i --preserve-root *' 


안전하게 설계된 삭제 프로그램 사용

일반적인 rm 대신 안전하게 설계된 trash-cli 을 사용한다.