몇 년 동안 GNU rm
유틸리티는 옵션 /
과 함께 호출 되지 않으면 삭제 되지 않습니다 --no-preserve-root
. 그러나이 명령 rm -rf /
은 집단 잠재 의식 속에 매우 오랫동안 위험한 것으로 여겨져 왔으며 사람들은 여전히 ”무서운”명령으로 인용하고있다.
처음 rm
삭제할 수없는 이 규칙이 언제 나타 났는지 궁금 /
했습니다. POSIX 사양을 확인했는데 POSIX : 2008 에는이 안전 기능이 포함되어 있지만 POSIX : 2001 에는 없습니다. POSIX 사양의 온라인 버전은 때때로 새로운 하위 릴리스마다 업데이트되기 때문에 웨이 백 머신 을 확인하고 2010 년부터 POSIX : 2008 의 관련 페이지를 찾아 rm
제거 할 수없는 규칙을 확인할 수있었습니다. /
그때 이미 나열되었습니다.
그래서 내 질문은 :
- POSIX 사양에
rm
제거 할 수없는 규칙이 언제/
추가 되었습니까? 단일 UNIX 사양 버전 4의 원래 2008 년판에 있었습니까? 아니면 개정판에 추가 되었습니까? - 이 제한은 언제 GNU에 추가
rm
되었습니까? POSIX에 추가되기 전인 것이 확실하지만 언제 발생 했습니까?
답변
POSIX 2008 온라인의 모든 버전의 HTML 버전을 찾을 수 있습니다.
- 원본 : http://pubs.opengroup.org/onlinepubs/9699919799.2008edition/utilities/rm.html
- TC1 (2013 년판) http://pubs.opengroup.org/onlinepubs/9699919799.2013edition/utilities/rm.html
- TC2 (2016 년판) http://pubs.opengroup.org/onlinepubs/9699919799.2016edition/utilities/rm.html
2008 년판에 추가되었습니다.
기술 담당자는 일반적으로 새로운 기능을 추가하지 않습니다.
이전 버전 ( http://pubs.opengroup.org/onlinepubs/009695399/utilities/rm.html ) (POSIX 2004)에 해당 텍스트가 없음을 알 수 있습니다.
새로운 텍스트는 2003 년 5 월 9 일 오스틴 그룹 회의 에서 이후 표준 개정에 포함되도록 승인되었습니다 .
같은 해 3 월에 Sun Microsystems의 John Beck 이 요청했습니다 (링크는 공개 그룹 등록이 필요합니다 . 여기에서 개선 요청 번호 5 참조 ).
John Beck은 2003 년 3 월 11 일 화요일에 다음과 같이 썼습니다.
@ page 820 line 31681-31683 section rm comment {JTB-1} Problem: Defect code : 3. Clarification required An occasional user mistake, with devastating consequences, is to write a shell script with a line such as: rm -rf $VARIABLE1/$VARIABLE2 or rm -rf /$VARIABLE1 without verifying that either variable is set, which can lead to rm -rf / being the resulting command. Since there is no plausible circumstance under which this is the desired behavior, it seems reasonable to disallow this. Such a safeguard would, however, violate the current specification. Action: Either extend the exceptions for . and .. on the noted lines to list / as well, or specify that the behavior of rm if an operand resolves to / is undefined.
이 2003-11-09 커밋 에 GNU가 rm
추가 --preserve-root
되고 --no-preserve-root
옵션 이 추가 되었지만 이 2006-09-03 커밋--preserve-root
에서만 기본값 이 되었으므로 coreutils 6.2
FreeBSD는 된 슬래시를 유지 하기 때문에 그 2004년 10월 4일 커밋 (와 “내 속옷이 실제로 얼마나 방염 알아” 로그 커밋)하지만, 경우에 따라 처음에하지POSIXLY_CORRECT
가 POSIX 지금이었다 나중에 십 년간을 확인하기 위해 기억까지, POSIX 모드에서도 수행 된 시점에서 명령 .
FreeBSD 초기 커밋은 그 당시 솔라리스가 이미하고 있다고 언급했습니다.
@JdePB (아래 의견) 는 솔라리스 원산지에 대해 자세히 설명하고 자세히 설명하고 솔라리스가 오스틴 그룹에 요청하기 전에 이미 보호 조치를 취했다고 제안 하는 썬 내부자 이야기에 대한 링크를 발견했습니다 .
해당 제외를 추가하는 이유를 설명합니다. 그들이 할 경우 하나는 자신을 비난 할 수 있지만 rm -rf /
, 일을하는 경우 스크립트가 그것을 할 수있는 경우가있어 rm -rf -- "$1/$2"
그것을 확인하지 않고 $1
/ $2
솔라리스 패치 (링크에 따라)를 잘못 적용 할 때 어떤 일 고객의 불량을 친 일이 제공되었다.
삭제 금지 .
및 ..
그 이전에 그리고 잠재적 사고를 방지하기 위해 다시 추가되었습니다 . rm
여전히 위험한 명령입니다. 그것은 당신이 말한 것을 제거하는 것입니다.
rm -rf /*
cd /tmp && rm -rf .*/ # on some systems where rm -rf ../ still removes
# the content of ../ and shells that still
# may include . and .. in glob expansions.
rm -rf -- "$diretcory"/* # note the misspelled variable name
dir='foo '; rm -rf $dir/*
또한 모든 것을 제거합니다. 셸 파일 이름 완성은 이러한 문제를 일으키는 것으로 알려져 있습니다
rm -rf someth<Tab>/*
다음으로 확장 :
rm -rf something /*
something
디렉토리가 아니기 때문입니다.
쉘 좋아 tcsh
하거나 zsh
전화를하려고 할 때 추가 프롬프트 추가합니다 rm
로모그래퍼 *
(와일드 카드 tcsh
하지 기본적으로).