किसी विशिष्ट फ़ोल्डर के लिए umask कैसे सेट करें


23

कुछ स्पष्ट कारणों से मुझे umaskएक विशिष्ट फ़ोल्डर के लिए मूल्य निर्धारित करने की आवश्यकता है । कोई ऐसा कैसे कर सकता है?

धन्यवाद पहले से ही!

अद्यतन १

एक विशिष्ट फ़ोल्डर के लिए umask का उपयोग करने की आवश्यकता का कारण निम्नलिखित है। मेरे पास एक वेब एप्लिकेशन है और जब यह कुछ फाइल बनाता है तो डिफ़ॉल्ट अनुमति 700 होती है। लेकिन मुझे उस फाइल के लिए कम से कम 755 अनुमति की आवश्यकता होती है। मुझे लगता है कि मैं समस्या को अधिक स्पष्ट रूप से समझा सकता हूं।


1
कारण आपके लिए स्पष्ट हो सकते हैं, लेकिन हमारे लिए नहीं। कृपया आप जो करना चाहते हैं उसे साझा करें।
होर्टिके

@htorque। इस कारण को जोड़ा गया कि मुझे अपनी विशिष्ट समस्या में umask का उपयोग करने की आवश्यकता क्यों है।
बख्तियार

जवाबों:


30

आप उपयोग कर सकते हैं setfacl

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

nameसमूह का नाम कहां है

यह जानने के लिए कि आपके या विशिष्ट उपयोगकर्ता के कौन से समूह हैं , यूनिक्स / लिनक्स में देखें कि आपको यह कैसे पता चलता है कि किसी दिए गए उपयोगकर्ता को कमांड लाइन के माध्यम से किस समूह में रखा गया है?


1
शायद setfaclबदल गया है। मुझे एक त्रुटि बताते हुए कहा गया है कि -mयह एक वैध विकल्प नहीं है।
रयान बर्नेट 19

रयान, setfaclनहीं बदला है। सबसे अधिक संभावना है कि आपने उचित समूह नाम (बाद में -m) प्रदान नहीं किया है।
सर्ग

1
बहुत यकीन setfaclहै कि पहुँच नियंत्रण सूचियों के लिए है और नहीं umask। एक बेहतर समाधान लेकिन वास्तव में जो नहीं पूछा गया था, मुझे नहीं लगता।
व्याट8740

कोशिश करें: sudo setfacl -Rdm ...(पुनरावृत्ति के लिए आर को छोड़ें) काम करना चाहिए। @ व्याट8740 (सही)। निश्चित रन होना: man setfaclऔर टाइप करना /-modify। आपको उपयोग करने की आवश्यकता है sudo
जयराम

11

आप प्रति निर्देशिका में umask सेट नहीं कर सकते, यह एक प्रक्रिया-स्तरीय मूल्य है। यदि आपको किसी निर्देशिका में फ़ाइलों को पढ़ने से रोकने की आवश्यकता है, तो संबंधित अनुमतियों को रद्द करें।

उदाहरण के लिए, यदि आपके पास /home/user/directoryकुछ फ़ाइलों और निर्देशिकाओं के साथ एक निर्देशिका है , जो किसी प्रक्रिया से 777 जैसी अनुमति प्राप्त कर सकते हैं /home/user/directory, तो 700 जैसी किसी चीज़ की अनुमति बिट्स सेट करें । इससे अन्य उपयोगकर्ताओं (सुपरसुअर रूट को छोड़कर) को नीचे उतरना असंभव हो जाएगा में है /home/user/directory

मैं पागल हूँ और अनुमति /home/userको 750 पर सेट कर रहा हूँ , इसलिए केवल मैं अपने घर निर्देशिका में पढ़ सकता हूं, लिख सकता हूं और उतर सकता हूं। इसका परिणाम यह होता है कि फोल्डर /home/user/Publicको अन्य लोगों द्वारा एक्सेस नहीं किया जा सकता है, लेकिन मैं इसके साथ रह सकता हूं।


आपके प्रश्न के प्रति अद्यतन: फिर भी, आप इसे नियंत्रित नहीं कर सकते हैं कि फाइलसिस्टम में (FAT की तरह एक अलग फाइलसिस्टम का उपयोग करने के अलावा जो दृढ़ता से अस्वीकृत है), आपको अपने वेबप में ऐसा करने की आवश्यकता है। यदि आपके वेबप को PHP में कोडित किया गया है, तो आप umaskफ़ंक्शन का उपयोग करके उड़ पर umask बदल सकते हैं :

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

आप इसे कॉन्फ़िगरेशन फ़ाइल में रख सकते हैं, जैसे डेटाबेस कनेक्शन पासवर्ड वाली फ़ाइल (Wordpress जैसे एप्लिकेशन में सोच)।

याद रखें कि यह एक प्रक्रिया मूल्य है, कुछ वेबसर्वर आपको अपनी कॉन्फ़िगरेशन फ़ाइलों में इसे सेट करने की अनुमति देते हैं, अन्यथा आप वांछित स्क्रिप्ट को सेट करने के लिए स्टार्टअप स्क्रिप्ट को संशोधित कर सकते हैं। याद रखें कि वेबपृष्ठों के लिए अनुमतियाँ काफी खतरनाक हैं 755और 644यदि कोड संवेदनशील है, तो हर कोई इसे पढ़ सकता है।


मुझे पता है कि यह प्राचीन है, लेकिन मुझे यह ध्यान देने योग्य है कि अभिभावक निर्देशिका अनुमतियों के मुद्दे पर काम करने के लिए प्रशासक माउंट /home/user/Public( mount -o bind /home/user/Public /some/other/place) को बांध सकता है ।
एड्रियन गुंटर

1

फ़ोल्डर के लिए अनुमतियों को बदलने के लिए chmod का उपयोग करें। umask फ़ाइलों के लिए है।

Umask सेट करें कि आपको क्या चाहिए

umask xxx

और अपने किए जाने पर वापस बदलें

umask 022

11
umask = फाइलें और निर्देशिकाएं, fmask = केवल फाइलें, dmask = केवल निर्देशिकाएं। : P
htorque

1
मैं कुछ नया आज :) सीखा
wojox

1
असल में यह कुछ फाइल सिस्टम के लिए विकल्प हैं जैसे NTFS (न कि फाइल क्रिएशन मास्क सेटिंग कमांड umask)। भ्रामक जानकारी जोड़ने के लिए क्षमा करें।
हॉर्टेक

umask वर्तमान प्रक्रिया (वर्तमान शेल) के लिए फ़ाइल-निर्माण मास्क को बदलता है, यदि आपके पास एक अलग शेल ओपन या उपयोगकर्ता के स्वामित्व वाली प्रक्रिया है, तो मुझे विश्वास नहीं है कि यह प्रभावित होगा। यह कमांड निर्देशिका के बाहर बनाई गई किसी भी अन्य फ़ाइल को भी प्रभावित करेगा जब तक कि आप इसे वापस नहीं बदलते।
डेव

1

एक अन्य समाधान केवल निर्देशिका में बनाई गई फ़ाइलों पर समूह आईडी को सेट करना हो सकता है, जो निर्देशिका बनाने वाले उपयोगकर्ता के समूह आईडी के बजाय निर्देशिका समूह आईडी के स्वामित्व वाली नई फ़ाइलों को बनाता है। इसलिए मुझे लगता है कि आप बस कर सकते हैं:

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

chmod 4755 /my/folder

यह सेटगिड विशेष फ़ाइल अनुमति को सेट करता है, जिससे समूह के /my/folderस्वामित्व वाली सभी फाइलें बन जाएंगी www-data, जिसकी मूल निर्देशिका के कारण rx (5) की अनुमति है।


2
आपने SUID ऑक्टल मान के लिए GUID को गलत माना है
adampki

1

शेल हुक के साथ लागू किया गया एथेर समाधान प्रदान करें और direnv। निम्नलिखित समाधान setfaclआपके सिस्टम पर उपलब्ध नहीं होने की स्थिति में अधिक संगत हो सकता है। (उदाहरण के लिए macOS)

direnvशेल के लिए एक पर्यावरण स्विचर है। यह जानता है कि वर्तमान निर्देशिका के आधार पर बैश, zsh, tsh, फिश शेल और एल्विश को कैसे लोड या अनलोड किया जा सकता है ।

उपयोग .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

स्रोत: डायनेमिक-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
}

इसलिए इंटरैक्टिव उपयोग के लिए, ऐसा कुछ काम करेगा (लेकिन, जाहिर है, सुरक्षा प्रदान करने के लिए नहीं)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.