chmod 숫자 모드를 사용하여 setgid 비트 설정을 해제합니다.

chmod 숫자 모드를 사용하여 setgid 비트 설정을 해제합니다.

chmod방금 setgid 비트를 설정 해제할 때 몇 가지 흥미로운 동작을 발견했습니다 .

$ mkdir test
$ chmod 2755 test
$ stat -c '%a %n' test
2755 test  # as expected
$ chmod 0755 test
$ stat -c '%a %n' test
2755 test  # what? see below
$ chmod 00755 test
$ stat -c '%a %n' test
755 test  # double what?!

놀랍게도 setgid 비트를 설정 해제하려고 하면 chmod 0755작동하지 않습니다. 그러나 매뉴얼 페이지에는 이것이 예상되는 동작이라고 명시되어 있습니다.

SETUID 및 SETGID 비트

파일의 그룹 ID가 사용자의 유효 그룹 ID 또는 사용자의 보충 그룹 ID 중 하나와 일치하지 않는 경우, chmod는 사용자에게 적절한 권한이 없는 한 일반 파일에 대해 set-group-ID 비트를 지웁니다. 다른 제한 사항으로 인해 MODE 또는 RFILE의 set-user-ID 및 set-group-ID 비트가 무시될 수 있습니다. 이 동작은 기본 chmod 시스템 호출의 정책과 기능에 따라 달라집니다. 의심스러운 경우 기본 시스템 동작을 확인하세요.

chmod는 명시적으로 달리 지정하지 않는 한 디렉토리의 set-user-ID 및 set-group-ID 비트를 유지합니다. u+s 및 gs와 같은 기호 모드를 사용하여 비트를 설정하거나 지울 수 있습니다.숫자 모드를 사용하여 이러한 비트를 설정할 수 있습니다(지울 수는 없음).

(강조 추가)

따라서 chmod 0755setgid 비트를 설정 해제한다는 의미는 아닌 것 같습니다. 그럼 왜 chmod 00755취소하나요? chmod아무 소용 없을 것 같아다섯숫자 패턴의 숫자. 다시 매뉴얼 페이지에서:

숫자 패턴은 다음에서 유래합니다.하나에서 넷4, 2, 1 값의 비트를 더하여 얻은 8진수(0-7)입니다. 생략된 숫자에는 앞에 0이 붙는 것으로 간주됩니다.

(강조 추가)

여기서 무슨 일이 일어나고 있는 걸까요? chmod단일 선행 0을 무시하기로 결정한 이유 는 무엇 입니까? 왜 이런 일이 일어나는 걸까요?아니요두 개의 앞에 오는 0을 무시하시겠습니까?

(chmod(GNU Coreutils) 8.6이 포함된 Debian Stretch 9.1)

답변1

찾았어요! 이 정보는 매뉴얼 페이지에는 없지만 Coreutils 온라인 매뉴얼에서 확인할 수 있습니다. 재치 있게:

대부분의 시스템에서 디렉토리의 set-group-ID 비트가 설정된 경우 새로 생성된 서브파일은 해당 디렉토리와 동일한 그룹을 상속하고 새로 생성된 하위 디렉토리는 상위 디렉토리의 set-group-ID 비트를 상속합니다. 일부 시스템에서는 디렉토리의 set-user-ID 비트가 새 서브디렉토리의 set-user-ID 비트와 마찬가지로 새 서브파일의 소유권에 비슷한 영향을 미칩니다. 이러한 메커니즘을 사용하면 새 파일을 사용 chmod하거나 chown공유할 필요성이 줄어들어 사용자가 파일을 더 쉽게 공유할 수 있습니다.

이러한 편의 메커니즘은 디렉토리의 set-user-ID 및 set-group-ID 비트에 의존합니다. chmod같은 명령을 사용하여 디렉터리에서 이러한 비트를 정기적으로 지우 면 mkdir메커니즘이 덜 편리해지고 파일 공유가 더 어려워집니다. 따라서 유사한 명령은 chmod사용자가 기호 모드에서 구체적으로 언급하거나 연산자 숫자 모드(예: "=755")를 사용하거나 설정하지 않는 한 디렉토리의 set-user-ID 또는 set-group-ID 비트에 영향을 미치지 않습니다. 숫자 모드에서 지우거나 5자리 이상의 8진수 숫자 모드에서 지웁니다.

인용하다:https://www.gnu.org/software/coreutils/manual/html_node/Directory-Setuid-and-Setgid.html

답변2

어쩌면 이것은 Debian Stretch 9.1의 chmod 버그일까요? Ubuntu 12.04, Ubuntu 16.04.3, CentOS 6.9 및 CentOS 7.4에서 제대로 작동합니다.

관련 정보