यूनिक्स: क्या फ़ाइल या निर्देशिका अनुमतियों को "कॉपी" करने का कोई तरीका है?


14

मेरे पास एक डायरेक्टरी में दो फाइलें हैं। एक के पास सही अनुमति है और दूसरे के पास नहीं है। क्या कोई तरीका है जिससे मैं एक फ़ाइल से दूसरी फ़ाइल में अनुमतियों के सेट को "कॉपी" कर सकता हूं?

जवाबों:


15

Chmod उपयोगिता का GNU संस्करण एक फ़ाइल ( ) से दूसरी ( ) में मोड को कॉपी कर सकता हैRFilefile

chmod --reference=RFile file

GNU कोरुटिल्स अधिकांश लिनक्स वितरण और सिगविन, अन्य स्थानों में पाए जाते हैं। सभी chmod कार्यान्वयन इस विकल्प को प्रदान नहीं करते हैं।


हम्म ... ऐसा लगता है कि यह काम करने वाला है, लेकिन मैक ओएस एक्स पर समर्थित नहीं है? वहाँ मुझे केवल अवैध विकल्प मिलता है ...
Svish

2
chmod एक नहीं है बैश आदेश builtin। यह कई यूनिक्स पर उपलब्ध एक अलग उपयोगिता है। --referenceविकल्प जीएनयू संस्करण में शामिल किया गया है; OSX शायद एक chmod का उपयोग करता है जो इसके बजाय BSD के साथ उत्पन्न होता है। OSX मैन chmod : developer.apple.com/Mac/library/documentation/Darwin/Reference/…
quixote

Svish, आप MacPorts के माध्यम से GNU संस्करण स्थापित करने पर विचार कर सकते हैं।
जेरेमी एल

बस यह समझ लें कि यहाँ यह उल्लेख करना उपयोगी cp -dpR <source-file> <dest-file>होगा कि किसी फ़ाइल की प्रतिलिपि बनाते समय, अनुमतियाँ और साथ ही फ़ाइल की प्रतिलिपि बनाएँ।
लॉरेंस

1

मैं इसके साथ आया:

find $SOURCE -mindepth 1 -printf 'chmod --reference=%p\t%p\n'|sed "s/\t$SOURCE/ $DEST/g"|sh

यह पूरी तरह से बुलेट प्रूफ नहीं है, लेकिन मुझे इसकी आवश्यकता है।


0

इसे इस्तेमाल करे:

find /PATH/TO/TARGET -exec chmod --reference /PATH/TO/SOURCE/{} {} \;

यदि यह दो डायरेक्टरी फाइलों पर मेल नहीं खाता है, तो आपको "ऐसी कोई फ़ाइल या निर्देशिका" त्रुटि नहीं दिखेगी।


find /home/myubuntuuser/Desktop/test1 -exec chmod --reference /home/myubuntuuser/Desktop/test2/{} {} \;
रिक सांचेज

chmod: '/ home / myubuntuuser / Desktop / test2 // home / myubuntuuser / Desktop / test1' की विशेषताएँ प्राप्त करने में विफल: ऐसी कोई फ़ाइल या निर्देशिका chmod: '/ home / myubuntuuser / Desktop / test2 // की विशेषताएँ प्राप्त करने में विफल रही' home / myubuntuuser / Desktop / test1 / 111.txt ': ऐसी कोई फ़ाइल या निर्देशिका chmod:' /home/myubuntuuser/Desktop/test2//home/myubususer/Desktop/test1/222.txt 'के गुण पाने में विफल: नहीं ऐसी फ़ाइल या निर्देशिका chmod: '/home/myubuntuuser/Desktop/test2//home/myubuntuuser/Desktop/test1/333.txt' की विशेषताएँ प्राप्त करने में विफल: कोई फ़ाइल या निर्देशिका
रिक सांचेज़

इसे 2 फ़ोल्डरों पर परीक्षण किया गया: test1 और test2। प्रत्येक के पास अलग-अलग अनुमतियों के साथ समान / 111/222 / 333.txt फाइलें हैं। test1 में डिफॉल्ट वाले होते हैं। test2 में 777 अनुमतियां हैं। यह मुझे मिलने वाली त्रुटि है।
रिक सांचेज़

0

आप getfaclफ़ाइल अनुमतियों, स्वामी, समूह और अतिरिक्त ACL (एक्सेस कंट्रोल लिस्ट) की पूरी सूची को पुनः प्राप्त करने के लिए उपयोग कर सकते हैं ।

$ getfacl filename.txt
# file: filename.txt
# owner: score
# group: score
user::rw-
group::---
other::---

यदि आप उस आउटपुट को एक फ़ाइल (जैसे acl.txt) में सहेजते हैं , तो आप इस प्रारूप से फिर से बहाल कर सकते हैं setfacl --restore acl.txt। यदि आप केवल एक फ़ाइल को पुनर्स्थापित करना चाहते हैं, और उस फ़ाइल का मूल फ़ाइल नाम अलग है, तो आप उपयोग करना चाहेंगे setfacl --set-file acl.txt filename.txt(जहां filename.txtनया फ़ाइल नाम है)।

कदम

  1. मूल अनुमतियाँ सहेजें acl.txt:

    $ getfacl filename.txt > acl.txt
    
  2. अनुमतियों को ओवरराइट करें (प्रदर्शन के लिए; यह सिर्फ इतना है कि आप देख सकते हैं कि अगले चरण के कार्यों में इसे बहाल कर सकते हैं)

    $ chmod 777 filename.txt
    $ sudo chown nobody:root filename.txt
    $ ls -l filename.txt
    -rwxrwxrwx 1 nobody root 0 Jan  8 14:24 filename.txt
    
  3. setfaclसे सही अनुमति बहाल करने के लिए उपयोग करें acl.txt:

    $ sudo setfacl --restore acl.txt
    $ ls -l filename.txt
    -rw------- 1 score score 0 Jan  8 14:24 filename.txt
    

फ़ाइल नाम से लिया गया है # file:getfacl , द्वारा की गई टिप्पणी गया है , इसलिए इसे कमांड लाइन पर निर्दिष्ट करने की कोई आवश्यकता नहीं है।

यदि आप उन अनुमतियों को किसी भिन्न फ़ाइल में पुनर्स्थापित करना चाहते हैं, तो आप --set-fileइसके बजाय उपयोग कर सकते हैं --restore:

$ setfacl --set-file acl.txt second_filename.txt

उदाहरण

यदि आप कुछ फ़ाइलों पर अनुमतियों को अधिलेखित करते हैं /usr, लेकिन आपको नहीं पता कि आपके पास कौन सी फाइलें अधिलेखित हैं, तो आप आमतौर पर इसे उसी तरह से कॉन्फ़िगर की गई प्रणाली से पुनर्स्थापित करके ठीक कर सकते हैं।

  1. कार्य प्रणाली से बैकअप अनुमतियाँ (ध्यान दें: getfaclसापेक्ष पथ उत्पन्न करता है, इसलिए आपको cdदोनों मशीनों पर एक सुसंगत स्थान सुनिश्चित करें )

    # cd /
    # getfacl -R usr > /root/acls.txt
    
  2. टूटी हुई अनुमतियों के साथ सिस्टम में ACL डंप की प्रतिलिपि बनाएँ

    $ scp root@working-system:/root/acls.txt .
    $ scp acls.txt root@broken-system:/root/
    
  3. ज्ञात अच्छी मशीन से टूटी हुई अनुमतियों को अधिलेखित करने के लिए ACL डंप को पुनर्स्थापित करें

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