를 통해 전체 파일 시스템을 삭제하는 악명 높은 실수를 저지른 후 sudo rm -rf /*
, 내가 한 끔찍한 피해를 복구하고 방금 6 년 동안 잃어버린 사실에 대처 한 후 왜 그렇게 할 수 있는지 궁금해지기 시작했습니다. 이 실수가 발생하는 것을 막기 위해 할 수있는 일.
나에게 제안 된 한 가지 해결책은 내 계정에서 루트 액세스를 취소하는 것이지만 많은 명령이 루트 액세스를 필요로하고 매일 수십 개의 명령을 실행해야 할 때 불편하기 때문에 불편합니다.
시스템을 백업하는 것이 확실한 방법입니다. 그러나 백업을 복원하려면 가동 중지 시간이 필요하며 시스템에 따라 가동 중지 시간이 며칠 또는 몇 주일 수 있으며 경우에 따라 허용되지 않을 수 있습니다.
내 질문은 : 사용자가 파일 시스템을 삭제하려고 할 때 확인을 구현하지 않는 이유는 무엇입니까? 그래서 실제로 그렇게하고 싶을 때 Y를 누르거나 입력하십시오. 적어도 그렇지 않으면 모든 것을 잃지 않습니다.
답변
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
됩니다.
기본적으로 이러한 방식으로 시스템을 삭제하지 못하도록하는 세 가지 보호 방법이 있습니다.
- 권한-일반 사용자는 중요한 파일을 제거 할 수 없습니다. 당신은 이것을 sudo로 우회했습니다.
- 디렉토리-기본적으로 rm은 디렉토리를 제거하지 않습니다. -r 플래그로 이것을 우회했습니다.
- 쓰기 방지 된 파일-기본적으로 rm은 쓰기 방지 된 파일을 삭제하기 전에 확인을 요청합니다 (모든 손상을 중지하지는 않았지만 시스템을 복구 할 수 없게되기 전에 프롬프트를 표시했을 수 있음). -f 플래그를 사용하여이 보호를 우회했습니다.
을 실행 rm /path/to/folder/*
하지 않고 폴더의 모든 내용을 제거하려면을 수행하십시오 rm -rf /path/to/folder
. 그러면 보호 기능 mkdir /path/to/folder
이 트리거 --preserve-root
되고 폴더의 모든 도트 파일이 제거됩니다.
답변
safe-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
없이 sudo
1 과 -f
깃발은 좋은 아이디어이다 를 추가alias
쉘이 차종에 대한 rm
의 -i
플래그 기본. 이 방법 rm
은 모든 파일을 삭제하기 전에 묻습니다.
alias rm='rm -i'
마찬가지로 유용한 플래그는 -I
“3 개 이상의 파일을 제거하기 전에 한 번만 또는 재귀 적으로 제거 할 때”라는 경고 만 표시합니다 -i
.
alias rm='rm -I'
이러한 별칭의 일반적인 위험은 다른 환경을 사용할 때 심각하게 역효과를 낳을 수 있습니다.
1 : sudo
별칭을 무시합니다 . alias sudo='sudo '
하지만 정의하면 해결할 수 있습니다 .
답변
확인이 이미 있으며 문제는 -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 맨 페이지를 읽고 그것을 발견했습니다.
답변
백업없이 실행하면 실수를하지 않도록주의해야합니다. 그리고 하드웨어가 절대 실패하지 않기를 바랍니다. (RAID조차도 결함이있는 RAM으로 인한 파일 시스템 손상을 방지 할 수 없습니다.) 이것이 첫 번째 문제입니다. (나는 당신이 이미 알고 있고 앞으로 백업을 할 것이라고 가정합니다.)
그러나 다음과 같은 실수 가능성을 줄이기 위해 할 수있는 일이 있습니다.
- 별명
rm='rm -I'
을 세 개 이상 삭제하면 프롬프트가 표시됩니다. - alias mv and cp to
mv -i
andcp -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 ~/
언제든지 위험한 명령이 포함되지 않습니다 . 만 변경하여 “팔” ls
로 rm
라인의 시작으로 이동 제어 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 키를 누르기 전에 추가로 생각하십시오 . 특히 전체 백업이 없거나 지금은 백업에서 복원해야 할 때가 아닙니다.
답변
짧은 대답은 그러한 명령을 실행하지 않는 것입니다.
긴 이야기는 그것이 커스터마이징의 일부라는 것입니다. 기본적으로 여기에는 두 가지 요소가 있습니다. 하나는 모든 파일을 자유롭게 수정할 수 있다는 사실입니다.
두 번째는 rm 명령이 폴더 아래의 모든 파일을 삭제하는 데 유용한 구문 설탕을 제공한다는 것입니다.
효과적으로 이것은 유닉스 머신의 단순한 단순한 교리로 재건 될 수 있습니다. 모든 것이 파일 입니다. 더 나은 문제를 만들기 위해 액세스 제어가 있지만 사용에 의해 대체됩니다.
수도
나는 이것이 실행될 수 없도록 별칭이나 함수를 추가 할 수 있다고 생각합니다.
답변
시스템 파일 공간 사용량이 크지 않은 경우 (그리고 오늘날 ‘immense’는 ‘수백 기가 바이트 이상’을 의미) 가상 머신 인스턴스를 생성하고 항상 내부에서 작업합니다. 복구에는 백업 인스턴스 사용이 수반됩니다.
또는 chroot jail을 만들어 그 안에서 작업 할 수 있습니다. 휴지통에 들어간 경우에도 복구가 필요하지만 실행중인 시스템을 사용하면 더 쉽게 복구 할 수 있습니다.
답변
rm
매우 오래된 유닉스 명령이며 사용자 친 화성을 염두에두고 설계되지 않았을 것입니다. 권한이 있으면 요청 된 내용을 정확하게 수행하려고합니다. 많은 신규 사용자의 함정은 코드를 자주보고 sudo
사용하는 것에 대해 많이 생각하지 않는다는 것입니다. 직접 같은 파일 수정 기능 rm
, dd
, chroot
, 등의 사용에 각별한주의가 필요합니다.
요즘에는 trash-clitrash
에서 (dodo없이) 사용하고 싶습니다 . 실수로 삭제 한 파일을 쉽게 검색 할 수 있다는 점에서 Windows의 휴지통과 같은 기능을합니다. 우분투에는 이미 파일에 휴지통 폴더와 휴지통으로 이동 기능이 내장되어 있습니다.
그럼에도 불구하고 실수를 할 수 있으므로 전체 파일 시스템을 백업해야합니다.