부모를 기반으로 고정 비트를 재귀적으로 설정

부모를 기반으로 고정 비트를 재귀적으로 설정

t모든 새 파일과 디렉터리에 특정 액세스 마스크가 있고 디렉터리에도 고정 비트 세트( 이 디렉터리 내의 파일 삭제를 제한하는 고정 비트)가 있는 디렉터리를 만들고 싶습니다 .

첫 번째 부분에서는 상위 디렉터리에 대한 기본 ACL을 설정해야 한다는 것을 이해했습니다. 그러나 새 디렉터리는 t상위 디렉터리에서 이 비트를 상속하지 않습니다. 따라서 소유자가 아닌 사람도 하위 디렉터리의 파일을 삭제할 수 있습니다. 이 문제를 해결할 수 있나요?

답변1

그룹 멤버십을 허용하는 구성이며,시험, 그룹 파일을 생성하고 수정하는 동시에 소유자 및 "다른 사람"을 제외하고는 파일 삭제 및 이름 변경을 허용하지 않습니다. 사용자 이름을 사용하여,레프그리고 umask가 022라고 가정합니다.

groupadd acltest
usermod -a -G acltest lev

루트 계정에서 로그아웃하고레프계정. 로그인하고 루트가 되거나 다음을 사용하십시오.스도:

mkdir /tmp/acltest
chown root:acltest /tmp/acltest
chmod 0770 /tmp/acltest
chmod g+s /tmp/acltest
chmod +t /tmp/acltest

setfacl -d -m g:acltest:rwx /tmp/acltest
setfacl -m g:acltest:rwx /tmp/acltest

ACL은 고정 비트를 설정할 수 없으며 고정 비트는 하위 디렉터리에 복사되지 않습니다. 그러나 다음을 사용할 수도 있습니다.inotify또는 파일 시스템의 변경 사항(예: 새 디렉터리)을 감지하고 그에 따라 반응하는 유사한 소프트웨어.

예를 들어, 데비안에서는:

apt-get install inotify-tools

그런 다음 스크립트를 작성하십시오.inotify, 좋다 /usr/local/sbin/set_sticky.sh.

#!/usr/bin/env bash
inotifywait -m -r -e create /tmp/acltest |
while read path event file; do
    case "$event" in
        *ISDIR*)
            chmod +t $path$file
            ;;
    esac
done

실행 권한 부여뿌리: chmod 0700 /usr/local/sbin/set_sticky.sh. 그런 다음 시작 시 (예를 들어) /etc/rc.local또는 적절한 RC 파일 에서 실행합니다 .

/usr/local/sbin/set_sticky.sh &

물론 이 예에서는 /tmp/acltest재부팅 시 사라져야 합니다. 그렇지 않으면 이것이 매력처럼 작동할 것입니다.

답변2

부모를 기반으로 고정 비트를 재귀적으로 설정

고정 비트가 없는 디렉토리는 다음 명령문으로 찾을 수 있습니다. 여기서 -값 앞의 하이픈은 다음 1000과 같이 처리되어야 합니다.이 권한 값과 더 높은 권한 값과 일치하는 접두사.

$ find . -type d \! -perm -1000

setgid따라서 고정 비트와 고정 비트가 설정된 상위 디렉터리가 있는 디렉터리를 설정하는 방법은 다음과 같습니다 .

find그렇지 않은 경우 중첩된 문이 필요합니다.find문은 중첩될 수 없습니다..

그렇기 때문에 대신관로재귀 조건을 사용하면 고정 비트 없이 발견된 디렉터리에 사용됩니다. -k시험고정 비트(이 경우 상위 디렉터리의 고정 비트)가 설정된 경우 true를 반환합니다.

$ find . -type d \! -perm -1000 |while read d; do if [[ -k "$d/.." ]]; then chmod +t,g+s "$d"; fi; done

이봐더 많은 find재미와에 대한 설명setgid.

답변3

다음과 같이 mkdir 함수를 생성하고 파일 끝에 추가할 수 있습니다 vi ~/.bashrc.

mkdir(){
    /bin/mkdir "$@"
    find . -type d \! -perm -1000 |while read d; do if [[ -k "$d/.." ]]; then chmod +t,g+s "$d"; fi; done
}

-k옵션은 여기에 설정된 GUID 대신 고정 비트가 설정되어 있는지 확인합니다 . 이 옵션을 g+s확인하세요.man test

또는 다음을 수행할 수 있습니다.

unalias mkdir;
source ~/.bashrc

그러면 새 하위 디렉터리에 고정 비트가 설정되어야 하지만, 상위 디렉터리에 고정 비트가 설정된 경우에만 해당됩니다.

이 방법은 효과가 있는 것 같지만 모든 사용자에게 효과가 있을지는 확실하지 않습니다!

관련 정보