एक उपयोगकर्ता के घर निर्देशिका में फ़ाइल अनुमतियों को ठीक करने की आवश्यकता है


24

क्या किसी के पास एक उपकरण या स्क्रिप्ट है जो किसी निर्देशिका पर फ़ाइल अनुमतियों को पुन: दर्ज करेगा?

उबंटू लिनक्स मशीन पर, त्रुटि में पूर्ण 777 अनुमतियों (उपयोगकर्ता, समूह, अन्य - पढ़ने, लिखने, निष्पादित करने) के साथ फ़ाइलों का एक गुच्छा एक यूएसबी डिस्क पर कॉपी किया गया था। मैं उन्हें उपयोगकर्ता की निर्देशिका में वापस लाना चाहता हूं।

निर्देशिकाएँ 775 होनी चाहिए और अन्य सभी फाइलें 664 हो सकती हैं। सभी फाइलें चित्र, दस्तावेज या एमपी 3 हैं, इसलिए उनमें से कोई भी निष्पादन योग्य होने की आवश्यकता नहीं है। यदि निर्देशिका बिट सेट है, तो इसे निष्पादन की आवश्यकता है, अन्य बुद्धिमान को बस उपयोगकर्ता और समूह की जरूरत है, पढ़ें और लिखें।

मुझे लगा कि यह जाँचने लायक है कि क्या शेल लिपि को एक साथ हैक करने से पहले ऐसी उपयोगिता मौजूद है :)


यहाँ एक मैंने पहले बनाया था: http://timwise.blogspot.com/2008/08/reseting-home-folder-permissions-in.html
टिम एबेल

जवाबों:


51

यह काम कर जाना चाहिए:

find /home/user -type d -print0 | xargs -0 chmod 0775
find /home/user -type f -print0 | xargs -0 chmod 0664

1
+1 का उपयोग करने के लिए -0 / xargs -0 :-)।
साल्स्के

14

मिल अकेले चाल के साथ कर सकते हैं:

find /home/user -type f -exec chmod 0664 {} \;
find /home/user -type d -exec chmod 0775 {} \;

प्रत्येक प्रविष्टि के लिए एक चोदन को देखने से रोकने के लिए:

find /home/user -type f -exec chmod 0664 {} +
find /home/user -type d -exec chmod 0775 {} +

(यह प्रभावी रूप से सभी फ़ाइलों की सूची के साथ एक बार chmod को कॉल करता है, बजाय प्रति फ़ाइल एक chmod पैरामीटर के रूप में)


6
Xargs का उपयोग करने की तुलना में धीमा, जैसा कि आप हर फ़ाइल के लिए एक chmod forking कर रहे हैं, जहाँ xargs एक chmod प्रक्रिया को कई फ़ाइलों के साथ चलाएगा क्योंकि यह एक कमांड लाइन पर फिट हो सकती है। एक बहुत बड़े पेड़ पर, यह उचित अंतर कर सकता है।
डेविड पस्ले

1
इसके अलावा, Print0 / xargs -0 बहुत अजीब फ़ाइलनाम भी संभाल लेगा; खोजने के बारे में इतना यकीन नहीं -exec।
साल्के

8

यह उत्तर आपकी समस्या को हल नहीं करेगा, लेकिन कोई व्यक्ति इसे एक समान समस्या के लिए उपयोगी पा सकता है, जहाँ फाइलों को अनुमति से कम अनुमति होती है।

# chmod -R . u=rwX,g=rX,o=rX

जादू एक्स के बजाय एक्स अनुमति है। Chmod manpage इस प्रकार वर्णन करता है:

निष्पादित / खोज केवल अगर फ़ाइल एक निर्देशिका है या पहले से ही कुछ उपयोगकर्ता के लिए अनुमति निष्पादित है

यह आपके मामले में उपयुक्त नहीं है क्योंकि आपकी फ़ाइलों ने अनुमति निष्पादित की है, दूसरे परीक्षण से मेल खाएगी।


1
जी 775 और 664. के लिए rwx होना चाहिए
aventurin

1

मैंने फ़्रीहाइट के समाधान से एक स्क्रिप्ट बनाई, यह बुनियादी तर्क जाँच जोड़ता है।

#!/bin/sh

if [ $# -lt 1 ]; then
    echo "USAGE: $0 <path>"
    exit 1
fi

find $1 -type d -print0 | xargs -0 chmod 0755
find $1 -type f -print0 | xargs -0 chmod 0644

अच्छा विचार। हालाँकि, दूसरी पंक्ति एक त्रुटि फेंकता है जब लक्ष्य एक निर्देशिका है chmod: missing operand after ‘0644’:। क्या मैं यह देखने के लिए जांच के साथ बयान दर्ज कर सकता हूं कि क्या लक्ष्य मौजूद है? if [ -d $1 ]; then find $1 -type d -print0 | xargs -0 chmod 0755; fi; if [ -f $1 ]; then find $1 -type f -print0 | xargs -0 chmod 0644; fi
अंडर

यह लगभग सही है; लेकिन अगर लक्ष्य एक निर्देशिका है, तो आप इसमें फ़ाइलों को चोदना भूल गए, और यदि यह एक फ़ाइल है, तो आपको केवल उस फ़ाइल को ही चोदना होगा।
शॉन

0

इस मामले में कि आप ssh का उपयोग कर रहे हैं, यह ~/.sshअनुमतियों को संशोधित नहीं करने के लिए अच्छा विचार है ।

DIR=/home/user
find $DIR -type d -not -path "$DIR/.ssh" -print0 | xargs -0 chmod 0775
find $DIR -type f -not -path "$DIR/.ssh/*" -print0 | xargs -0 chmod 0664

0

मैंने दूसरे दिन एक बहुत ही सरल बैश स्क्रिप्ट बनाई क्योंकि मुझे अनुमतियाँ ठीक करने की आवश्यकता थी। बुनियादी, गैर-रूट, फ़ाइल और फ़ोल्डर अनुमतियों को रीसेट करने की औपचारिक उपयोगिता क्यों नहीं है?

स्क्रिप्ट 755 सभी फ़ोल्डरों और 644 पुस्तकालयों के लिए खोज का उपयोग करता है। तब यह देखने के लिए प्रत्येक फाइल का परीक्षण करता है कि उसमें बाइनरी एल्फ हेडर है या नहीं। यदि नहीं, तो यह शेलबैंग के लिए पहले दो पात्रों में स्कैन करता है#! । यह 755 उन उदाहरणों और 644 के बाद बाकी सब कुछ यह देखने के लिए जाँचता है कि फ़ाइल में पहले से ही अनुमति है या नहीं।

विशेष मामलों को एक अपवाद के साथ हैंडल किया जाता है जैसे कि *.bakफाइलों को अनदेखा करना।

#!/bin/bash
read -r -p "Correct file and folder permissions? [y/N] " chse
if [[ "$chse" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
  echo "Processing ..."
  find -H $(pwd) -type d -exec chmod 0755 {} \;
  # set dirs to 755
  find -H $(pwd) -type f \( -iname '*.so.*' -o -iname '*.so' \) -exec chmod 0644 {} \;
  # libs
  IFS=$'\n'
  for value in $(find -H $(pwd) -type f ! \( -iname '*.so.*' -o -iname '*.so' -o -iname '*.bak' \) -printf '%p\n'); do
    tstbin=$(readelf -l "$value" 2>/dev/null | grep -Pio 'executable|shared')
    if [ -z "$tstbin" ]; then
      tstbat=$(cat "$value" | head -c2 | grep -io '#!')
      if [ -n "$tstbat" ]; then
        perm=$(stat -c '%a' "$value")
        if [ "$perm" != "755" ]; then
          chmod 755 $value
          echo "Set script  755 $value"
          # set batch to 755
        fi
      else
        perm=$(stat -c '%a' "$value")
        if [ "$perm" != "644" ]; then
          chmod 644 $value
          echo "Set regular 644 $value"
          # set regular files to 644
        fi
      fi
      # above aren't elf binary
    else
      perm=$(stat -c '%a' "$value")
      if [ "$perm" != "755" ]; then
        chmod 755 $value
        echo "Set binary  755 $value"
        # set elf binaries to 755
      fi
    fi
  done
  unset IFS
  # process linux permissions for files and folders
else
  echo "Aborted."
fi

0

मुझे एक सरलीकृत सी-शेल समाधान मिला। यह पूरी तरह से मूर्खतापूर्ण सबूत नहीं हो सकता है लेकिन अधिकांश निर्देशिकाओं के लिए काम करना चाहिए। यह यूनिक्स की 'फ़ाइल' कमांड को काम करता है, और अनुमतियों को निष्पादित करने के लिए उन्हें वापस रीसेट करने के लिए फाइल निष्पादित करता है:

find /home/user -type d | xargs chmod 0775
find /home/user -type f | xargs -0 chmod 0664
find /home/user -type f -exec file {} \; | grep executable | cut -d":" -f1 | xargs chmod 0775

1
यह केवल कुछ उत्तरों को नहीं दोहराता है, यह एक त्रुटि और कार्यक्षमता का परिचय देता है जिसे ओपी ने नहीं पूछा था।
राल्फफ्राइडल

0

एक विकल्प, जो मूल अनुरोध का बिल्कुल जवाब नहीं देता है, लेकिन अधिक संभावना है कि ओपी का इरादा क्या है, अनुमतियों को प्रतीकात्मक रूप से निर्दिष्ट करना है। उदाहरण के लिए, मुझे लगता है कि ओपी "जनता के लिए लेखन पहुंच को दूर करना चाहता है, और सभी फाइलों से निष्पादन योग्य अनुमति को दूर करना चाहता है"।

यदि आप प्रतीकात्मक अनुमति प्रतिनिधित्व का उपयोग करते हैं तो यह संभव है।

  • उल्लू "जनता से लेखन हटाएं" ("ओ" - अन्य, "-" - निकालें, "w" - लिखें)
  • कुल्हाड़ी "केवल फ़ाइलों पर सभी के लिए निष्कासन निष्पादित करें" ("एक - सभी," - "- निकालें," x "- निष्पादित करें)

स्पष्ट रूप से "0664" सेट करने के बजाय इसे इस तरह से लिखना कि आप गलती से उन फ़ाइलों को अतिरिक्त अनुमति देने से बचते हैं जो पहले बंद थीं। उदाहरण के लिए, यदि कोई फ़ाइल 0770 थी तो वह गलती से 0664 नहीं होगी।

पहली आवश्यकता का उपयोग करने के लिए आप बस इसका उपयोग कर सकते हैं chmod:

chmod --recursive o-w $dir

दूसरी आवश्यकता करने के लिए:

find $dir -type f -exec chmod a-x {} +

या दोनों करने के लिए:

find $dir -type f -exec chmod a-x,o-w {} +
find $dir -type d -exec chmod o-w {} +
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.