언제 POSIX와 GNU rm이 /를 삭제하지 않습니까?


23

몇 년 동안 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에 추가되기 전인 것이 확실하지만 언제 발생 했습니까?


1
관련 : Austin Group Interpretation # 019 (2003). 변경 사항을 설명했지만 구현하지는 않았습니다.
Michael Homer

답변:


28

POSIX 2008 온라인의 모든 버전의 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하지 기본적으로).



1
젊은 협동 SA로서, 나는 rm -rf .*그의 홈 디렉토리에서 SunOS의 사용자 디렉토리에있는 숨겨진 파일을 지우려고 시도했다 . 얼마 후, 모든 전화선이 켜졌습니다.
Aaron D. Marasco

나는 거기에 도착하기 위해 복잡한 방식으로 $ rm -rf. * = rm -rf /를 걸었다.
Escoce

@GuruAdrian은 *는 모든 것을 일치 시킨다는 것을 의미하므로. * = .filename뿐만 아니라 ../ 및 따라서 ../ .. 및 ../../ .. ad infinatum 명령에 대한 비트 공간이 부족할 때까지.
Escoce December

아마도 현대 포탄에서. 항상 그런 식은 아니었다. 15 년 이상 전에 시스템 관리 및 개발에 대한 깊이를 남겼습니다
Escoce
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.