मैं गलती से एक निर्देशिका पर chmod -R + x। मैं सही अनुमतियों को कैसे पुनर्स्थापित करूं?


20

खैर, विशिष्ट होने के लिए, यह था chmod -R 755। अब हर फाइल निष्पादन योग्य है, जो मुझे नहीं चाहिए। मैं सोच रहा हूं कि मुझे प्रत्येक फ़ाइल के पहले दो बाइट को देखना चाहिए #!, लेकिन क्या यह सब कुछ कवर करेगा? क्या मुझे इसके बजाय fileसब कुछ देखने और उस पर अपने निर्णय को आधार बनाने के लिए उपयोग करना चाहिए ? या, अधिक संभावना है, क्या ऐसा करने का एक बेहतर तरीका है?

एक निर्देशिका और सेट -x के माध्यम से पुनरावृत्ति करने के लिए पसंदीदा तरीका क्या है जो फ़ाइलों को 'निष्पादन योग्य' नहीं माना जाता है?


क्या आपने ऐसा किया /या किसी अन्य निर्देशिका में?
gvkv

1
@gvkv: नहीं /, एक निर्देशिका पूरी तरह से मेरे स्वामित्व में है।
लैरी वांग

1
@ भविष्य में आपको शायद सभी अनुमतियों का बलात्कार करने के बजाय + x के कुछ प्रकार का उपयोग करना चाहिए, और संभवतः सभी फाइलों पर लिखना होगा।
एक्सनोटेरासाइड

@xenoterracide: सहमत। जो मैं वास्तव में चाहता था, वह था समूह को मेरी ही तरह परमिशन देना (जो हो रहा था!), मैंने टाइप करने से पहले सिर्फ इतना ही नहीं सोचा था।
लैरी वांग

हम कितनी फाइलों के बारे में बात कर रहे हैं? कितने पर अमल होना चाहिए? क्या फ़ाइल नामों से बताने का कोई तरीका है?
डेविड थॉर्नले

जवाबों:


15

यहां कोई मैजिक बुलेट नहीं है। अनुमतियाँ जानकारी ले जाती हैं जो हमेशा निरर्थक नहीं होती हैं।

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

प्रति-उपयोगकर्ता निर्देशिका में, आपको उन फ़ाइलों के बारे में चिंता करनी होगी जो विश्व-पठनीय नहीं हैं। वहां कोई आपकी मदद नहीं कर सकता।

निष्पादन के लिए, अंगूठे का एक अच्छा नियम वह सब कुछ बनाना होगा जो ऐसा नहीं लगता है कि इसे निष्पादित किया जा सकता है, कोई भी अपमानजनक नहीं हो सकता है। कर्नेल उन लिपियों को निष्पादित कर सकता है, जिनके पहले दो बाइट हैं #!, ELF बायनेरिज़ जिनके पहले चार बाइट हैं, \x7fELFजहाँ \x7fमान 12 के साथ बाइट है, और कुछ दुर्लभ फ़ाइल प्रकार (a.out, कुछ भी पंजीकृत है binfmt_misc)। इसलिए निम्नलिखित कमांड को आपकी अनुमतियों को एक उचित स्थिति में पुनर्स्थापित करना चाहिए (4 या zsh को मिटाता है, अन्यथा findनिर्देशिका ट्री को ट्रैव करने के लिए उपयोग करें; चेतावनी, सीधे ब्राउज़र में टाइप किया गया):

for x in **/*; do
  if ! [ -f "$x" ]; then continue; fi # skip all but regular files
  case $(head -c 4 "$x") in
    "#!"??) :;; # skip script
    "\x7fELF") :;; # skip ELF executable
    *) chmod a-x "$x";;
  esac
done

ध्यान दें कि लिनक्स पर एक निर्देशिका ट्री की बैक अप और रीस्टोर करने का एक सरल तरीका है, और संभवतः एसीएल समर्थन के साथ अन्य यूनियनों:

getfacl -R >saved-permissions
setfacl --restore=saved-permissions

धन्यवाद! सौभाग्य से, मुझे लगता है कि सब कुछ इन दो श्रेणियों में आता है। अगर यह कुछ भी याद आती है, तो मैं बाद में इससे निपट सकता हूं।
लैरी वांग

**/*आवश्यकता है कि ध्यान में रखें globstar
क्रिस डाउन

मैं इस स्क्रिप्ट में दो बदलावों की सिफारिश करूंगा। एक, findग्लोबस्टार के बजाय उपयोग करें ; दो, सिर fileको देखने के बजाय, कमांड का उपयोग करके देखें कि यह क्या है और वहां से शाखा है।
शादुर

@ बहादुर findकी तुलना में कम विश्वसनीय है globstar, globstarलगभग हर मामले में बेहतर है।
क्रिस डाउन

1
@Gilles "अगर आपके पास है, तो यह बहुत बेहतर है", न केवल यह तेज है, यह अधिक विश्वसनीय भी है (और अप्रत्याशित SNAFUs नहीं है)।
क्रिस डाउन

6

मुझे विश्वास है कि आप कुछ ऐसा चाहते हैं

find dir -type f -exec chmod ugo-x '{}' +

यह सभी नियमित फ़ाइलों के लिए दिखता है, पुनरावर्ती रूप से dir में, (यह निर्देशिकाओं, और उपकरणों को छोड़कर) और निष्पादन योग्य बिट को निकालता है।

मैं यहां शुरू करूंगा, और फिर उन फ़ाइलों को बनाने के लिए अपना रास्ता काम करूंगा जो निष्पादन योग्य, निष्पादन योग्य होने चाहिए।

निम्नलिखित को ठीक उसी तरह से काम करना चाहिए जैसा आपने पूछा था (यह सभी नियमित फ़ाइलों को ढूंढ लेगा, उन्हें # के लिए grep करेगा! और यदि मिला है तो x बिट्स को हटा दें)

find . -type f | xargs grep -L #! | xargs chmod ugo-x

संभवतः ऊपर का एक बेहतर संस्करण (कम पाइप)

find . -type f -exec grep -L #! '{}' + | xargs chmod ugo-x 

3
रहे हैं या नहीं grep -L '^#!'कम से कम (उद्धरण के लिए आवश्यक हैं, और ^पंक्ति के आरंभ में मिलान को प्रतिबंधित), लेकिन के रूप में यह मेल खाता है यह अभी भी बहुत अनुमोदक है #!किसी भी लाइन पर। xargsरिक्त स्थान या उद्धरण वर्णों वाले फ़ाइल नामों का उपयोग करना विफल हो जाएगा; उपयोग xargs -d '\n'(GNU की आवश्यकता है xargs)।
गिल्स एसओ- बुराई पर रोक '21

0

ठीक है, एक शेबंग लाइन के बिना, फ़ाइल को मुख्य रूप से साथ शेल स्क्रिप्ट के रूप में निष्पादित किया जाएगा /bin/sh। आपको लगता है कि एक अच्छी शुरुआत है और इस धारणा पर कि प्रश्न में निर्देशिका में मिशन-महत्वपूर्ण फाइलें शामिल नहीं हैं, शायद कुछ grepऔर chmodकॉम्बो को निष्पादित करने के लिए बहुत जोखिम नहीं है । आप एक गलत पोज़िटिव, अर्थात, एक शेबंग लाइन के साथ फाइल कर सकते हैं, जो उनके निष्पादन योग्य बिट सेट के लिए नहीं हैं, लेकिन निर्देशिका में क्या है, इस उद्देश्य के बारे में अधिक जानकारी के बिना, आप केवल यह तय कर सकते हैं कि क्या आपके लिए एक महत्वपूर्ण अस्तित्व संबंधी खतरा है प्रणाली और / या डेटा।


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