'rm .*' 상위 디렉토리를 삭제하셨나요?

'rm .*' 상위 디렉토리를 삭제하셨나요?

이 표현식은 .*bash에 의해 확장되어 현재 디렉터리와 상위 디렉터리를 포함합니다.

$ ls -la
total 2600
drwxrwxrwx   2 terdon terdon 2162688 Sep 10 16:22 .
drwxr-xr-x 142 terdon terdon  491520 Sep 10 15:34 ..
-rw-r--r--   1 terdon terdon       0 Sep 10 16:22 foo
$ echo .*
. ..

rm -rf .*GNU bash를 사용하여 Debian에서 실행 version 4.2.36(1)-release하고 rmfrom 에서 실행 하면 rm (GNU coreutils) 8.13다음 메시지가 나타납니다.

$ rm -rf .*
rm: cannot remove directory: `.'
rm: cannot remove directory: `..'

이것은 GNU입니까 아니면 POSIX입니까? 위 명령이 자동으로 삭제 .되는 *nix 시스템이 있습니까 ..?

또한 이것이 rm쉘의 보안 기능입니까, 아니면 명령 자체입니까?

답변1

이 유틸리티에 대한 POSIX 사양의 최신 버전(2017년 기준) 은 다음과 rm같습니다.여기(이전 글도 그렇고거기) 및 및 삭제를 금지 .합니다 ...

파일 점 또는 점 점(dot-dot)이 피연산자의 기본 이름 부분(즉, 최종 경로 이름 부분)으로 지정되거나 피연산자가 루트 디렉터리로 확인되는 경우 rm은 표준 오류에 진단 메시지를 쓰고 더 이상 아무것도 하지 않아야 합니다. .

@jlliagre가 지적했듯이 관련 부분은 /SUSv4의 새로운 기능입니다.

내가 찾을 수 있는 가장 오래된 공개 유닉스 사양(XPF4 CAE 개정 2(1994)), 이는 지정되었으며 .제거 ..할 수 없습니다. 단, GNU fileutils 변경 로그의 주석에는 이것이 이전 POSIX 사양에 이미 존재했음을 나타냅니다.

dir/..및 에서도 작동 하지만 일부 구현(Solaris 11 및 macOS와 같은 UNIX 인증 구현 포함)은 여전히 ​​또는 ../로부터 보호하지 않습니다 .rm -rf ../rm -rf .*/

역사

초기 유니스

-r이 옵션은 Unix V3(1973)에 추가되었으며 rm디렉터리의 내용만 삭제 하지만 rmdir디렉터리를 삭제하려면 여전히 이 옵션을 사용해야 합니다.

이러한 상황은 Unix V7(1979, Bourne 쉘을 도입하고 대부분의 Unices가 파생됨)에서 변경되었습니다. rm -r이제 디렉터리도 삭제되고 ..디렉터리 트리는 삭제되지 않습니다. 이것매뉴얼 페이지상태:

..실수로 비슷한 일을 하여 반사회적인 결과를 피하기 위한 목적으로만 파일을 삭제하는 것은 금지되어 있습니다 rm -r .*.

rm -r .*(누군가는 이것이 아직이라고 말할 수도 있지만사회에 어긋난다포함된 모든 것을 제거하기 때문입니다 ..

여전히 삭제를 허용 하지만 연결을 해제 하거나 항목을 입력 .하지는 않습니다 . 그런 다음 현재 디렉터리를 지우는 것이 효과적인 방법입니다....rm -r .

또한 보호는 리터럴 ..인수 에만 적용되며 dir/..또는 에는 적용되지 않습니다 ./... 따라서 rm -rf ./.*상위 디렉터리의 모든 항목은 여전히 ​​재귀적으로 삭제됩니다.

흥미롭게도 이는 .glob이 확장할 수 있는 버그/버기 기능을 이미 해결했습니다. 이 문제는 1980년대 후반(1990)과 (2005)에 Forsyth 쉘(원래 Minix 쉘과 pdksh의 기반)에서 수정되었지만 ..다른 쉘, 특히 확장 기능을 포함해야 하는 POSIX 언어에서는 수정되지 않았습니다. (그롭을 제외한) glob에 or 가 포함되어 있지 않은 문제의 일부만 해결하고 을 사용하면 다음을 수행하여 문제를 해결할 수 있습니다.zshfishsh.*...readdir()bashshopt -s dotglob.xxx...kshFIGNORE='@(.|..)'

정확히 금지 사항이 추가되는 경우가 .항상 명확한 것은 아니며 각 Unix에 따라 다릅니다. 다음은 몇 가지 결과입니다.

BSD

.금지 사항은 2.9BSD(1983)와 2.10BSD(1987), 4.2BSD(1983)와 4.3BSD(1986) 사이에 추가되었습니다.이 변경 사항은 unix-history-repo에 1985년의 타임스탬프를 가지고 있습니다.).

$ wget -qO- http://www.tuhs.org/Archive/PDP-11/Distributions/ucb/2.9BSD/root.tar.gz |
    zgrep -ao 'rm: canno[[:print:]]*'
rm: cannot remove `..'
$ wget -qO- http://www.tuhs.org/Archive/PDP-11/Distributions/ucb/2.10bsd.tar.gz |
    zgrep -ao 'rm: canno[[:print:]]*'
rm: cannot remove `.' or `..'
rm: cannot remove `.' or `..'\n");

및 참조dir/.dir/..이러한 변화는 1988년(BSD 4.3 네트워크/1).

현재까지 rmFreeBSD(및 macOS와 같은 파생 제품)는 여전히 현재 디렉터리나 상위 디렉터리를 지웁니다 rm -rf ./( rm -rf ../중요함 rm -rf .*/).

시스템 V

V7 이후의 AT&T Unix 파생 제품에 대한 소스 코드나 바이너리가 공개적으로 제공되지 않기 때문에 정보가 많지 않습니다. 온라인 매뉴얼에서 HPUX(System III 기반)는 여전히 제거만 비활성화한다고 언급 ..하지만 실제로는 두 가지 모두 비활성화합니다. 이는 적어도 SysIII가 제거를 비활성화하지 않을 수 있음을 의미합니다 .(편집하다: 보고있다SysIII rm소스 코드, Unix V7 이후 거의 변경되지 않았습니다).

내가 확인한 다른 모든 온라인 매뉴얼에는 POSIX와 호환되어야 하는 제거 .또는 억제에 대한 언급이 있습니다...

Solaris는 여전히 rm현재 디렉토리나 상위 디렉토리를 비웁니다.rm -rf ./rm -rf ../

암소 비슷한 일종의 영양

이것GNU fileutils의 초기 변경 로그모든 역사적 정보가 있습니다.

처음에는 제거되거나 금지되지 .않았지만 1990 년과 1991년 사이에 먼저 금지된 다음 둘 다(포함) 금지되었습니다 .....dir/.

다른

보시다시피, zsh, (또는 모든 glob)의 확장 에는 또는 (심지어 시뮬레이션 모드에서도) .*이 포함되지 않습니다 . 따라서 내장 함수 (이렇게 하면 얻을 수 있음 )는 특별히 취급 되지 않습니다 . 따라서 해당 내장 기능을 사용하면 해당 항목 을 지울 수도 있고 삭제할 수는 없습니다 ....shrmzmodload zsh/files...zshrm -rf .rm -rf .....rm -rf .*...

Busybox 0.52(2001)에는 합계 rm삭제를 비활성화하는 .기능이 추가되었습니다...

관련 정보