권한을 기본값으로 재설정

권한을 기본값으로 재설정

파일이 방금 생성되었을 때 설정된 권한을 갖도록 마스크를 기반으로 권한을 기본값으로 재설정하는 방법

내가 달성하고 싶은 것의 예: umask0022로 설정하여

touch file
mkdir directory

이제 파일의 권한이rw-r--r--

이제 디렉토리의 권한은 다음과 같습니다.rwxr-xr-x

chmod 777 file
chmod 777 directory

이제 파일의 권한이rwxrwxrwx

이제 디렉토리의 권한은 다음과 같습니다.rwxrwxrwx

파일 및 rw-r--r--디렉터리 에 대한 권한을 기본값으로 재설정하는 방법이 있습니까 ?rwxr-xr-xchmod

답변1

빼기 사용은 특정 umask 값에 대해서만 정확합니다. 예를 들어 다음과 같이 사용하는 것이 더 좋습니다.mode & ~umaskPSkocik의 답변에서, 또는 chmod =rw(또는 chmod =rwx디렉토리의 경우) 표준 지정 umask를 적용합니다.ilkkachu가 댓글에서 지적했듯이.


umask어떤 경우에는 0666파일과 디렉터리에서 간단히 권한을 빼서 0777기본 권한을 얻을 수도 있습니다.

$ printf "%04d\n" "$((0777 - $(umask)))"
0755
$ printf "%04d\n" "$((0666 - $(umask)))"
0644

따라서 다음을 신청할 수 있습니다 chmod.

chmod $((0666 - $(umask))) file
chmod $((0777 - $(umask))) directory

Bash에서는 다음을 사용하여 8진수 출력을 강제해야 합니다 printf.

$ printf "%04d\n" "$((0777 - $(umask)))"
0493
$ printf "%04o\n" "$((0777 - $(umask)))"
0755

또 다른 방법은 새 파일과 디렉터리를 만들고 이를 참조로 사용하는 것입니다.

touch file2
mkdir directory2 
chmod --reference=directory2 directory
chmod --reference=file2 file

답변2

마스킹은 마스크를 통해 AND비트 단위로 적용되므로 bitwise negated자신만의 최종 권한 패턴을 만들고 싶다면 다음을 수행할 수 있습니다.

$((mode & ~umask))

다음 주소로 전달할 수 있도록 8진수로 다시 인쇄해야 합니다 chmod.

$ chmod `printf '%o' $((0777 & ~$(umask)))` directory
$ chmod `printf '%o' $((0777 & ~0111 & ~$(umask)))` file
#^additional implicit mask of 0111 for files

여기서 0777은 마스크를 적용할 권한 모드입니다(사용하거나 stat -c %a file가져올 수 있음 stat -c %a directory).

위 내용을 에코하여 프로세스 대체 계산을 확인할 수 있습니다(of의 경우 umask합계 를 0022얻습니다 ).755644

이를 사용하여 일반 함수를 만들 수 있습니다.

#takes a umask as first param and applies it to each folowing param (files)
maskMode(){
  local mask="$1" dmask mode a
  dmask="$((mask & ~0111))"; shift
  for a; do
    mode=0`stat -c "%a" "$a"`
    chmod `printf "%0.4o\n" $(($mode & ~mask))` "$a"
  done
}

특정 용도의 경우 참조 파일을 chmod하는 것도 또 다른 옵션입니다.

답변3

현재 디렉토리를 통해 재귀적으로 실행하려면 -

chmod -R $((777 - `umask`)) .
chmod -R -x+X .

`umask`로 교체하시면 됩니다 $(umask).

답변4

재귀 파일 및 디렉터리

상위 디렉터리의 모든 파일과 디렉터리를 재귀적으로 재설정하려는 경우:

sudo find . -type f -print0 | xargs -0 sudo chmod $((0666 - $(umask)))
sudo find . -type d -print0 | xargs -0 sudo chmod $((0777 - $(umask)))

설명하다

다른 답변은 개별 파일과 디렉토리를 별도로 사용하고 재설정하는 방법(또는 둘 다에 하나의 규칙을 반복적으로 적용하는 방법 chmod -R $((0666 - $(umask)))) 을 보여줍니다 chmod -R $((0777 - $(umask))). (좋은 답변입니다. 감사합니다!)

그러다가 내가 찾았어이 답변find를 사용하여 전체 디렉토리에 선택적으로 권한을 적용하는 방법을 보여줍니다.

find . -type f -print0 | xargs -0 chmod 644

이렇게 하면 파일이 재귀적으로 변경되므로

find . -type d -print0 | xargs -0 chmod 755

디렉토리에 적용됩니다.

이러한 답변을 하나로 묶으면 위의 솔루션이 제공됩니다. 이를 위해서는 각각 GNU 버전의 /option이 필요합니다 find.xargs-print0-0

그것이 다른 사람들에게 도움이 되기를 바랍니다!

관련 정보