특정 폴더에 umask를 설정하는 방법


23

몇 가지 명백한 이유로 umask하나의 특정 폴더에 대한 값 을 설정해야 합니다. 어떻게 할 수 있습니까?

미리 감사드립니다!

업데이트 1

특정 폴더에 umask를 사용해야하는 이유는 다음과 같습니다. 웹 응용 프로그램이 있으며 파일을 만들 때 기본 권한은 700입니다. 그러나 해당 파일에 대해 755 이상의 권한이 필요합니다. 문제를 더 명확하게 설명 할 수 있다고 생각합니다.


1
그 이유는 당신에게는 명백 할 수도 있지만 우리에게는 그렇지 않을 수도 있습니다. 원하는 것을 공유하십시오.
— htorque

@htorque. 특정 문제에서 umask를 사용해야하는 이유를 추가했습니다.
— Bakhtiyor

답변:


30

당신은 사용할 수 있습니다 setfacl

setfacl -d -m group:name:rwx /path/to/your/dir

name그룹 이름은 어디에 있습니까

귀하 또는 특정 사용자가 속한 그룹을 찾으려면 유닉스 / 리눅스에서 명령 행을 통해 특정 사용자가 어떤 그룹에 속 하는지 어떻게 알 수 있습니까?


1
아마도 setfacl바뀌었을 것입니다. -m유효한 옵션이 아니라는 오류가 발생 합니다.
— Ryan Burnette 2016 년

라이언 setfacl은 바뀌지 않았습니다. 올바른 그룹 이름을 제공하지 않은 것 같습니다 ( -m).
— sergk

1
액세스 제어 목록setfacl 에 대한 것이지 확실 하지 않습니다 umask. 더 나은 해결책이지만 실제로 묻지 않은 것은 아닙니다.
— Wyatt8740

시도하십시오 : sudo setfacl -Rdm ...(재귀를 위해 R을 생략하십시오) 작동합니다. @ Wyatt8740 (올바른). 특정 실행하려면 : man setfacl을 입력하십시오 /-modify. 을 사용해야 sudo합니다.
— JREAM

11

디렉토리 당 umask를 설정할 수 없으며 이는 프로세스 레벨 값입니다. 다른 사람이 디렉토리의 파일을 읽지 못하게하려면 해당 권한 비트를 취소하십시오.

예를 들어, /home/user/directory프로세스에서 777과 같은 권한을 얻을 수있는 일부 파일과 디렉토리가있는 디렉토리의 경우 권한 비트를 /home/user/directory700과 같이 설정하십시오 . 그러면 다른 사용자 (슈퍼 유저 루트 제외)가 다운 될 수 없습니다. 에서 /home/user/directory.

편집증이고 권한 /home/user을 750으로 설정하므로 홈 디렉토리에서 읽고 쓰거나 내릴 수 있습니다. 결과적 /home/user/Public으로 다른 사람이 같은 폴더에 액세스 할 수는 없지만 그와 함께 살 수는 있습니다.


질문 업데이트 당 : 여전히, 당신은 파일 시스템에서 그것을 제어 할 수 없습니다 (강력하게 낙담 된 FAT와 같은 다른 파일 시스템 유형을 사용하는 것을 제외하고), 당신은 webapp에서 그렇게해야합니다. webapp가 PHP로 코딩 된 경우 다음 umask함수를 사용하여 umask를 즉시 변경할 수 있습니다 .

<?php
umask(0022);
// other code
?>

데이터베이스 연결 암호가 포함 된 파일 (Wordpress와 같은 앱에서 생각)과 같은 구성 파일에이를 넣을 수 있습니다.

프로세스 값이며 일부 웹 서버에서는 구성 파일에서이를 설정할 수 있습니다. 그렇지 않으면 시작 스크립트를 수정하여 원하는 umask를 설정할 수 있습니다. 코드가 민감한 경우 모든 사람이 읽을 수 있는 권한 은 웹앱 755과 유사 하고 644매우 위험하다는 점을 기억하십시오 .


나는 이것이 고대인이라는 것을 알고 있지만 언급 할 가치가 있다고 생각합니다. 관리자는 상위 디렉토리 권한 문제를 해결하기 위해 mount /home/user/Public( mount -o bind /home/user/Public /some/other/place)를 바인딩 할 수 있습니다 .
— Adrian Günter

1

폴더의 권한을 변경하려면 chmod를 사용하십시오. umask는 파일 용입니다.

필요에 따라 umask를 설정하십시오.

umask xxx

완료되면 다시 변경

umask 022

11
umask = 파일 및 디렉토리, fmask = 파일 만, dmask = 디렉토리 만 : P
— htorque

1
나는 오늘 새로운 것을 배웠다 :)
— wojox

1
실제로 이는 NTFS와 같은 특정 파일 시스템에 대한 옵션입니다 (파일 작성 마스크 설정 명령 umask아님). 혼란스러운 정보를 추가하여 죄송합니다.
— htorque

umask는 현재 프로세스 (현재 쉘)에 대한 파일 생성 마스크를 변경합니다. 다른 쉘 열기 또는 사용자 소유 프로세스가있는 경우 영향을받지 않을 것이라고 생각합니다. 이 명령은 다시 변경할 때까지 디렉토리 외부에서 작성된 다른 파일에도 영향을줍니다.
— Dave

1

또 다른 해결책은 디렉토리에서 작성된 파일에 그룹 ID를 설정하는 것입니다. 그러면 파일을 작성한 사용자의 그룹 ID 대신 디렉토리 그룹 ID가 새 파일을 소유하게됩니다. 그래서 나는 당신이 할 수 있다고 생각합니다.

chown www-data:www-data /my/folder

chmod 4755 /my/folder

이렇게하면 setgid 특수 파일 권한이 설정되어 생성 된 모든 파일 /my/folder이 www-data그룹에서 소유하게되며 , 상위 디렉토리로 인해 rx (5) 권한이 있습니다.


2
SUID 8 진수 값에 대한 GUID를 잘못 생각했습니다
— adampski

1

쉘 후크 및로 구현 된 다른 솔루션을 제공하십시오 direnv. setfacl시스템에서 사용할 수없는 경우 다음 솔루션이 더 호환 될 수 있습니다 . (예 : macOS)

direnv쉘의 환경 전환기입니다. 현재 디렉토리 에 따라 환경 변수 를로드하거나 언로드 하기 위해 bash, zsh, tcsh, fish shell 및 elvish에 연결하는 방법을 알고 있습니다.

사용 .envrc에 대한 export사용자 정의 umask특정 해줄 가치, 그리고 export당신이 그 디렉토리를 떠날 때 에드 ENV var에 언로드됩니다.

# example .envrc file
export UMASK=0022

umask작업 디렉토리가 변경되면 값 을 변경하는 후크를 정의하십시오 .

function _umask_hook {
  if [[ -n $UMASK ]]; then
    umask "$UMASK"
  elif [[ $OSTYPE == darwin* ]]; then
    umask 0077
  else
    umask 0022
  fi
}

# To make the code more reliable on detecting the default umask
function _umask_hook {
  # Record the default umask value on the 1st run
  [[ -z $DEFAULT_UMASK ]] && export DEFAULT_UMASK="$(builtin umask)"

  if [[ -n $UMASK ]]; then
    umask "$UMASK"
  else
    umask "$DEFAULT_UMASK"
  fi
}

# zsh hooks
# trigger _umask_hook once working dir is changed
add-zsh-hook chpwd _umask_hook

# bash
# Append `;` if PROMPT_COMMAND is not empty
PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND;}_umask_hook"

당분간 zsh의 direnv 후크 초기화는 chpwd후크를 지원하지 않습니다 . 이 페이지가 표시 될 때 풀 요청 GH-514 가 병합되지 않은 경우 주석하세요 eval "$(direnv hook zsh)"후크 direnv에 chpwd수동으로 코드를 다음과 같이,

if (( $+commands[direnv] )) && ! (( $+functions[_direnv_hook] )); then
  _direnv_hook() {
    eval "$(command "direnv" export zsh)";
  }
  typeset -agU precmd_functions;
  if [[ -z ${precmd_functions[(r)_direnv_hook]} ]]; then
    precmd_functions=( _direnv_hook ${precmd_functions[@]} )
  fi

  typeset -agU chpwd_functions;
  if [[ -z ${chpwd_functions[(r)_direnv_hook]} ]]; then
    chpwd_functions=( _direnv_hook ${chpwd_functions[@]} )
  fi
fi

출처 : dynamic-umask-based-on-cwd.md


0

관련이 있지만이 경우 적용되지 않는 다음 클립은 다음과 같습니다 .zshrc.

# Change the umask automatically for some directories; use 0022 as the default
chpwd () {
    case $PWD in
        $HOME/[Dd]ocuments*)
            if [[ $(umask) -ne 077 ]]; then
                umask 0077
                echo -e "\033[01;32mumask: private \033[m"
            fi;;
        */[Ww]eb*)
            if [[ $(umask) -ne 072 ]]; then
                umask 0072
                echo -e "\033[01;33mumask: other readable \033[m"
            fi;;
        /vol/nothing)
            if [[ $(umask) -ne 002 ]]; then
                umask 0002
                echo -e "\033[01;35mumask: group writable \033[m"
            fi;;
        *)
            if [[ $(umask) -ne 022 ]]; then
                umask 0022
                echo -e "\033[01;31mumask: world readable \033[m"
            fi;;
    esac
}

따라서 대화식 사용의 경우 이와 같은 것이 작동하지만 분명히 보안을 제공하지는 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.