วิธีตั้ง 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ชื่อกลุ่มอยู่ที่ไหน

ในการค้นหากลุ่มที่คุณหรือผู้ใช้ที่เฉพาะเจาะจงอยู่ดูใน unix / linux คุณจะทราบได้อย่างไรว่ากลุ่มใดที่ผู้ใช้ที่ได้รับให้ใช้งานผ่านทางบรรทัดคำสั่ง


1
อาจsetfaclมีการเปลี่ยนแปลง ฉันได้รับข้อผิดพลาดที่ระบุว่า-mไม่ใช่ตัวเลือกที่ถูกต้อง
Ryan Burnette

ไรอัน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/directoryเป็น 700 เช่นนั้นจะทำให้ผู้ใช้รายอื่นไม่สามารถยกเว้นราก superuser ได้ ใน/home/user/directory.

ฉันหวาดระแวงและตั้งค่าการอนุญาต/home/userเป็น 750 ดังนั้นมีเพียงฉันเท่านั้นที่สามารถอ่านเขียนและลงในไดเรกทอรีบ้านของฉัน นี่เป็นผลที่/home/user/Publicคนอื่นไม่สามารถเข้าถึงโฟลเดอร์เช่นนี้ได้ แต่ฉันสามารถอยู่กับมันได้


ตามการอัปเดตคำถามของคุณ: ยังคุณไม่สามารถควบคุมได้ว่าในระบบไฟล์ (นอกเหนือจากการใช้ระบบไฟล์ประเภทอื่นเช่น FAT ซึ่งเป็น discougared อย่างยิ่ง) คุณต้องทำใน webapp ของคุณ หากเว็บแอพของคุณเขียนเป็น PHP คุณสามารถเปลี่ยน umask ได้ทันทีโดยใช้umaskฟังก์ชั่น:

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

คุณสามารถวางสิ่งนี้ลงในไฟล์กำหนดค่าเช่นไฟล์ที่มีรหัสผ่านการเชื่อมต่อฐานข้อมูล (คิดในแอพอย่าง Wordpress)

โปรดจำไว้ว่ามันเป็นค่ากระบวนการบางเว็บเซิร์ฟเวอร์อนุญาตให้คุณตั้งค่าในไฟล์การกำหนดค่าของพวกเขามิฉะนั้นคุณสามารถปรับเปลี่ยนสคริปต์เริ่มต้นเพื่อตั้ง umask ที่ต้องการ โปรดจำไว้ว่าการอนุญาตที่ชอบ755และ644ค่อนข้างอันตรายสำหรับ webapps หากรหัสมีความละเอียดอ่อนทุกคนสามารถอ่านได้


ฉันรู้ว่านี่เป็นของโบราณ แต่ฉันคิดว่ามันควรค่าแก่การกล่าวถึง: ผู้ดูแลระบบสามารถผูกติด/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
ฉันได้เรียนรู้สิ่งใหม่ในวันนี้ :)
อยจอก

1
ที่จริงแล้วเป็นตัวเลือกสำหรับระบบไฟล์บางระบบเช่น NTFS (ไม่ใช่คำสั่งการตั้งค่ารูปแบบการสร้างไฟล์นั้นumask) ขออภัยที่เพิ่มข้อมูลที่สับสน
htorque

umask เปลี่ยนมาสก์การสร้างไฟล์สำหรับกระบวนการปัจจุบัน (เชลล์ปัจจุบัน) หากคุณมีเชลล์ที่เปิดอยู่หรือกระบวนการที่ผู้ใช้เป็นเจ้าของฉันไม่เชื่อว่ามันจะได้รับผลกระทบ คำสั่งนี้จะส่งผลกระทบต่อไฟล์อื่น ๆ ที่สร้างขึ้นนอกไดเรกทอรีจนกว่าคุณจะเปลี่ยนกลับ
เดฟ

1

วิธีแก้ไขปัญหาอื่นอาจเป็นเพียงการตั้งค่ารหัสกลุ่มในไฟล์ที่สร้างในไดเรกทอรีซึ่งทำให้ไฟล์ใหม่เป็นเจ้าของโดยกลุ่มรหัสไดเรกทอรีแทนที่จะเป็นรหัสกลุ่มของผู้ใช้ที่สร้างไฟล์ ดังนั้นฉันคิดว่าคุณสามารถทำได้:

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

chmod 4755 /my/folder

ชุดนี้ได้รับอนุญาตไฟล์พิเศษ setgid ซึ่งจะทำให้ไฟล์ทั้งหมดที่สร้างขึ้นใน/my/folderการเป็นเจ้าของโดยwww-dataกลุ่มซึ่งมีสิทธิ์ rx (5) เพราะไดเรกทอรีแม่


2
คุณเข้าใจผิดว่า GUID สำหรับค่าเลขฐานแปดของ SUID
adampski

1

ให้แก้ปัญหาอับละอองเกสรดำเนินการกับตะขอเปลือกdirenvและ วิธีแก้ไขปัญหาต่อไปนี้อาจเข้ากันได้มากกว่าในกรณีsetfaclที่ระบบของคุณไม่สามารถใช้งานได้ (เช่น macOS)

direnvเป็นตัวสลับสภาพแวดล้อมสำหรับเชลล์ มันรู้วิธีที่จะขอเข้าสู่ทุบตี zsh, tcsh, หอยปลาและภูติโหลดหรือขนตัวแปรสภาพแวดล้อมทั้งนี้ขึ้นอยู่กับไดเรกทอรีปัจจุบัน

ใช้.envrcในการexportกำหนดเองumaskค่าสำหรับ dir ที่เฉพาะเจาะจงและexportvar เอ็ด env จะถูกยกเลิกการโหลดเมื่อคุณออกจากผบว่า

# example .envrc file
export UMASK=0022

กำหนด hook เพื่อเปลี่ยนumaskค่าเมื่อเปลี่ยน dir ที่ทำงาน

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"

ในตอนนี้การเริ่มต้น direnv hook สำหรับ zsh ไม่รองรับchpwdhook หากคำขอเกี่ยวกับการดึง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.