POSIX와 GNU rm은 언제부터 /를 삭제하지 않았나요?

POSIX와 GNU rm은 언제부터 /를 삭제하지 않았나요?

몇 년 동안 GNU 유틸리티는 이 옵션을 사용하여 호출하지 않는 한 rm제거되지 않습니다 . 그러나 이 질서는 오랫동안 집단적 무의식에 자리잡아 위험한 것으로 여겨져 왔으며, 사람들은 여전히 ​​이를 '끔찍한' 질서라고 부르곤 합니다./--no-preserve-rootrm -rf /

rm삭제할 수 없는 규칙이 언제 처음 등장했는지 궁금합니다 /. POSIX 사양을 확인해보니POSIX:2008이 보안 기능이 포함되어 있습니다.POSIX:2001확실히. POSIX 사양의 온라인 버전은 수시로 업데이트되므로 새로운 Subversion이 출시될 때마다 웨이백 머신도 확인하고 발견했습니다.2010년 POSIX:2008 관련 페이지그 당시 삭제할 수 없는 규칙이 나열되어 있는 것을 확인할 수 있었습니다 rm./

그래서 내 질문은 다음과 같습니다.

  • rm/언제 POSIX 사양에 삭제할 수 없는 규칙이 추가되었나요 ? 단일 UNIX 사양 버전 4의 원래 2008 버전에 있었습니까, 아니면 개정판에 추가되었습니까?
  • GNU는 언제 이 제한사항을 추가했습니까 rm? POSIX에 추가되기 전의 일이라고 확신합니다. 그런데 언제 그런 일이 일어났습니까?

답변1

온라인에서 모든 POSIX 2008 버전의 HTML 버전을 찾을 수 있습니다.

2008년판에는 이 내용이 추가되었습니다.

기술적인 정오표는 일반적으로 새로운 기능을 추가하지 않습니다.

이전 버전을 볼 수 있습니다(http://pubs.opengroup.org/onlinepubs/009695399/utilities/rm.html) (POSIX 2004)에는 그러한 텍스트가 없습니다.

새 텍스트가 승인되었습니다.2003-05-09 오스틴 그룹 회의이후 표준 개정에 포함되도록 합니다.

그것은같은 해 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.

rm--preserve-rootGNU 및 --no-preserve-root옵션 추가이는 2003-11-09에 제출되었습니다., 그러나 --preserve-root기본값만 됩니다.2006-09-03 제출, 따라서 coreutils 6.2에서는

FreeBSD는 이미슬래시를 유지하다~부터2004-10-04 제출(이있다“내 속옷이 실제로 얼마나 불에 강한지 알아보세요”커밋 로그), 하지만처음에는 다음과 같은 경우가 아닙니다.POSIXLY_CORRECT, 10년 후까지 그들은 POSIX가 이제 이것을 의무화하는지 확인하는 것을 기억합니다.이 시점에서는 POSIX 모드에서도 수행됩니다..

FreeBSD의 초기 커밋에서는 당시 Solaris가 이미 이 작업을 수행하고 있었다고 언급했습니다.

@JdePB(아래 댓글에서)가 알아냈습니다.Sun 내부 사례 링크솔라리스의 기원에 대한 자세한 내용을 확인하고 제공했으며 솔라리스가 오스틴 그룹에 요청하기 전에 적절한 보호 조치를 취했음을 암시했습니다.

이 제외를 추가하는 이유를 설명합니다. 사람들은 이 일에 대해 스스로 책임을 져야 하지만, 스크립트가 / 제공 여부를 확인하지 않고 이를 수행할 수 있는 상황이 있으며 rm -rf /, 이것이 일부 Sun 고객이 Solaris 패치 이유를 오용했을 때 큰 타격을 입힌 이유입니다(이 링크에 따라). .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추가 프롬프트를 추가합니다 (기본값은 아닙니다).zshrm*tcsh

관련 정보