몇 년 동안 GNU 유틸리티는 이 옵션을 사용하여 호출하지 않는 한 rm
제거되지 않습니다 . 그러나 이 질서는 오랫동안 집단적 무의식에 자리잡아 위험한 것으로 여겨져 왔으며, 사람들은 여전히 이를 '끔찍한' 질서라고 부르곤 합니다./
--no-preserve-root
rm -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 버전을 찾을 수 있습니다.
- 원래: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-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-root
GNU 및 --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
추가 프롬프트를 추가합니다 (기본값은 아닙니다).zsh
rm
*
tcsh