मैं एक dir (ACL सक्षम) के साथ पुनरावृत्ति की अनुमति कैसे सेट करूँ?


24

उदाहरण के लिए, मैं अपने सहयोगियों को कुछ निर्देशिका तक पहुंच लिखने के लिए देना चाहता हूं। मान लेते हैं कि इसमें उपनिर्देशिका का उपयोग अधिकार 775, फाइलें 664, और साथ ही dir - 775 में कुछ निष्पादन योग्य फाइलें भी थीं।

अब मैं लिखने की अनुमति जोड़ना चाहता हूं। चामोद के साथ, मैं कुछ इस तरह की कोशिश कर सकता था

chmod o+w -R mydir/

लेकिन यह अच्छा नहीं है, क्योंकि मैं dir को विश्व-योग्य नहीं बनाना चाहता हूं - मैं केवल कुछ उपयोगकर्ताओं को ही एक्सेस देना चाहता हूं, इसलिए मैं ACL का उपयोग करना चाहता हूं। लेकिन क्या उन अनुमतियों को सेट करने का एक आसान तरीका है? जैसा कि मैंने देखा, मुझे अलग से कम से कम तीन मामलों (dirs, files, निष्पादन योग्य फ़ाइलें) से निपटने की आवश्यकता है:

find -type d -exec setfacl -m u:colleague:rwx {} \;
find -type f -executable -exec setfacl -m u:colleague:rwx {} \;
find -type f \! -executable -exec setfacl -m u:colleague:rw {} \;

यह इस तरह के एक सरल कार्य के लिए काफी कोड लाइनों लगता है। क्या कोई बेहतर तरीका है?

जवाबों:


40

setfaclजैसे एक पुनरावर्ती विकल्प ( -R) है chmod:

  -R, --recursive
      Apply operations to all files and directories recursively. This
      option cannot be mixed with `--restore'.

यह पूँजी-एक्स की Xअनुमति के उपयोग की अनुमति देता है, जिसका अर्थ है:

  execute only if the file is a directory or already has
  execute permission for some user (X)

इसलिए निम्नलिखित कार्य करना चाहिए:

setfacl -R -m u:colleague:rwX .

(सभी उद्धरण देबल के साथ भेजे गए अनुसार acl-2.2.52 केman setfacl लिए हैं)


4
setfacl में FreeBSD 9 में '-R' झंडा नहीं है
हारून C. de Bruyn

6
फिर यह अच्छा है कि ओपी ने उनके सवाल को [linux]
umläute

याद किया कि ;)
एरॉन सी। डी। ब्रुइन

क्या यह स्वचालित रूप से बाद में बनाई गई नई फ़ाइलों / फ़ोल्डरों पर लागू होता है?
पहेली

सेटफेकल के अपने संस्करण के लिए मैन पेज देखें। विकल्प -Xशामिल नहीं है, जैसा कि अपेक्षित है setfacl 2.2.49
phyatt

5

जैसा कि umläute द्वारा उल्लेख किया गया है, setfacl -Rअपरकेस "X" के साथ जाने का तरीका है, जैसे:

setfacl -R -m u:colleague:rwX .

हालांकि, उन लोगों के लिए जिन्हें एसीएल को फिर से लागू करने की आवश्यकता है (जैसे "उप-निर्देशिकाओं पर पुन: लागू करने की अनुमति" ए ला विंडोज)।

find . -mindepth 1 | xargs -n 50 setfacl -b --set-file=<(getfacl . | sed -e 's/x$/X/')

उस कमांड को विभाजित किया जा सकता है जैसे त्रुटि से बचने के लिए setfacl: foobar: Only directories can have default ACLs

find . -mindepth 1 -type d| xargs -n 50 setfacl -b --set-file=<(getfacl . | sed -e 's/x$/X/')
find . -mindepth 1 -type f| xargs -n 50 setfacl -b --set-file=<(getfacl . | grep -v '^default:' | sed -e 's/x$/X/')

ध्यान दें कि वाक्य रचना <( something )है प्रक्रिया प्रतिस्थापन है, जो पार्टी के लिए विशिष्ट है। यदि आप किसी अन्य शेल का उपयोग करते हैं, तो आपको एक अस्थायी फ़ाइल बनाने की आवश्यकता हो सकती है।


0
for i in $(find /data -mindepth 0 -type d)
do setfacl -m  u:zabbix:r-x $i
    echo "ACL rules set for "$i
done


@ मुरू जिज्ञासा से बाहर, क्यों नहीं?
शादुर

पूरी टिप्पणी एक कड़ी है। इसका अनुसरण करें और पता करें।
मूरू

यदि आप इस दृष्टिकोण का उपयोग करना चाहते हैंfind /data -mindepth 0 -type d -exec setfacl -m u:zabbix:r-X {} \;
sibaz

1
इसका प्रयोग न करें। $(find /data -mindepth 0 -type d)परिणाम पंक्ति को पंक्ति से नहीं लौटाएगा, यह संपूर्ण परिणामों को बफ़र करेगा। यदि एक पंक्ति में एक जगह है, तो आपको $iचर में एक गलत रिकॉर्ड मिलेगा ।
Gnought
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.