특정 폴더에 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/folderwww-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)"후크 direnvchpwd수동으로 코드를 다음과 같이,

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.