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 를 지워야 한다면 다음과 같은 순서로 진행하면 된다.
ls 로 대상 확인
ls -l /opt/removeme
- bash의 command history 기능을 이용하여 좀전에 입력한 ls 명령어 호출(키보드의 위 화살표 누름)
Ctrl-A 를 눌러서 조금전에 호출한 line의 시작으로 이동
이 기능은 bash 의 readline 기능의 일부이므로 bash 여야 사용이 가능하다.(readline shortcuts 바로 가기)
"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 을 사용한다.