अनजाने में मेरी डिस्क अनुमति संरचना को nuked - क्यों?


23

मैं chownभीतर जाने की कोशिश कर रहा था /optऔर किसी कारणवश chownमाता-पिता के पास कूद गया और सब कुछ जान लिया।

क्या कोई सुझाव दे सकता है कि ऐसा क्यों / कैसे हो सकता है और भविष्य में इसे करने से कैसे बचा जाए? यह थोड़ा सा संबंधित है कि किसी दिए गए डायर में कमांड चलाना प्रभावी रूप से जंप कर सकता है और इसे रूट डायर में चला सकता है।

ubuntu: /opt > sudo chown -R root:www-data .*
chown: changing ownership of '../var/lib/lxcfs/proc/cpuinfo': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/proc/meminfo': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/proc/stat': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/proc/uptime': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/proc/diskstats': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/proc/swaps': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/proc': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/devices': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/blkio': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/hugetlb': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/rdma': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/pids': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/freezer': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/cpuset': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/memory': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/perf_event': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/cpu,cpuacct': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/net_cls,net_prio': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/name=systemd': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/unified': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs': No such file or directory
^C
:ubuntu: /opt >

2
मैंने इसे इस तरह से किया होगा: - sudo chown -R root:wwwdata /optthehelp संवाद के अनुसार ... शायद उस पाइप का उपयोग करने से कुछ समस्या पैदा हुई ???
जोशुआ बेस्नेत जुले

13
.*माचिस ..(मूल निर्देशिका, जो है /) - देखें क्या "chmod 777। * -R" chmod माता-पिता निर्देशिका (..) है?
स्टीलड्राइवर

7
@steeldriver जो लगता है कि यह एक जवाब के रूप में पोस्ट किया जाना चाहिए;)
यहोशू बेस्नीटे

2
तो छिपी हुई फ़ाइलों पर अनुमतियाँ सेट करने का सही तरीका क्या है, जो मैं करने की कोशिश कर रहा था?
ड्यूक डगल

4
@JoshuaBesneatte मैं / के साथ शुरू होने वाले तर्कों पर पुनरावर्ती आदेशों को चलाने से बचने की कोशिश करता हूं क्योंकि अधिकांश कीबोर्ड एंटर कुंजी के काफी करीब होते हैं, और बाकी कमांड टाइप करने से पहले इसे गलती से दर्ज करना बहुत आसान है। इस जोखिम को कम करने के लिए, कोई भी cdरूट निर्देशिका में जा सकता है और लीकिंग को छोड़ सकता है / या कमांड को शुरू कर सकता है (, जिसका अर्थ है कि कमांड )टाइप नहीं किया जाएगा जब तक कि मिलान टाइप न हो जाए , Ctrl-C को हिट करने का अवसर दे और बाहर जमानत दें एक बुरी गलती के रूप में (जैसे कि rm -rf /tmp/foo-installT के बजाय Enter दबाएं)।
मोंटी हार्डर

जवाबों:


25

ऐसा इसलिए हुआ क्योंकि आपने उपयोग किया:

sudo chown -R root:www-data .*

जब आपको इसके बजाय इसका उपयोग करना चाहिए था:

sudo chown -R root:www-data ./*

सबसे पहले, -Rलक्ष्य निर्देशिका के तहत सभी निर्देशिकाओं के लिए पुनरावर्ती है।

इसके अतिरिक्त, *वर्तमान निर्देशिका के तहत सभी फ़ाइलों और निर्देशिकाओं का मिलान होगा। अगला, वर्तमान निर्देशिका के ऊपर एक स्तर पर.* सभी फ़ाइलों और निर्देशिकाओं का मिलान करेगा ।

भविष्य में इससे बचने के लिए, आप इन उदाहरणों में कमांड lsनिष्पादित करने से पहले पथ को सत्यापित करने के लिए कमांड का उपयोग कर सकते chownहैं:

ls -a ./*
ls -a *
ls -a .*
ls -a ../*

इससे बचने का एक और तरीका यह है कि जिस डायरेक्टरी में आप कमांड चलाना चाहते हैं, उसका पूरा रास्ता हमेशा इस्तेमाल करें।

यहाँ एक उदाहरण है:

sudo chown -R root:www-data /opt/*

संपादित करें:

आप chmodसभी छिपी हुई फ़ाइलों या निर्देशिकाओं के लिए निम्नलिखित कमांड का उपयोग सीधे के तहत कर सकते हैं /opt(इसके बाद पहला चरित्र मान लें .कि उन्हें छिपाया गया एक पत्र, एक संख्या, एक डैश या एक अंडरस्कोर है जो अधिकांश फ़ाइलों के लिए सही होना चाहिए)।

for i in /opt/.[A-Za-z0-9-_]*; do sudo chmod root:www-data "/opt/$i"; done

आप chmodनिम्न कमांड को चलाकर यह सत्यापित कर सकते हैं कि यह कौन सी फाइलें हैं :

ls /opt/.[A-Za-z0-9-_]*

कमांड का पहला भाग : for i in /opt/.[A-Za-z0-9-_]*कहता है कि, ग्लोब के सभी परिणामों के /opt/.[A-Za-z0-9-_]*लिए प्रत्येक परिणाम को "i" वेरिएबल में असाइन करें।

यहाँ ग्लोब कहता है कि पहला चरित्र होना चाहिए .और यह कि अगला चरित्र [A-Za-z0-9-_] किसी भी वर्ण का होना चाहिए जो कि AZ या az या कोई भी संख्या 0-9 या a -या है _

यह परिणामों को बाहर करेगा .और ..जो वर्तमान निर्देशिका और वर्तमान निर्देशिका के ऊपर की निर्देशिका का प्रतिनिधित्व करता है और इसमें केवल छिपी हुई फाइलें और निर्देशिकाएं शामिल होंगी।

कमांड का दूसरा भाग : do sudo chmod root:www-data "/opt/$i"सभी वैरिएबल के लिए कमांड को चलाने के लिए कहता है जो वर्तमान मान से मेल खाता है $i

आज्ञा का तीसरा भाग : doneकहता है कि मैं समाप्त हो गया हूं।


साथ ही, आप का इस्तेमाल किया -Rके साथ विकल्प chmodऔर -Rविकल्प पुनरावर्ती है और सभी निर्देशिकाओं के लिए लागू होगी और फ़ाइलें।

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


5
मेरा इरादा छिपी हुई फ़ाइलों को लक्षित करना था। मैंने गलती से यह मान लिया था कि छिपी हुई फाइलों को टटोलने के लिए इस्तेमाल किया जाने वाला वाक्यविन्यास जैसा कि यहाँ बताया गया है stackoverflow.com/questions/10375689/… आमतौर पर छिपी हुई फाइलों के लिए वैध वाक्यविन्यास होता है। लगता तो नही देता।
ड्यूक डगल

2
@DukeDougal आपको पहला उत्तर स्वीकार नहीं करना चाहिए जो तुरंत आता है। आम तौर पर स्वीकार करने से 24 घंटे पहले इंतजार करना बेहतर होता है। उस समय में अन्य उपयोगी या बेहतर लिखित उत्तर सामने आ सकते हैं जो स्वीकार करने योग्य होंगे। आप उन सभी उत्तरों को बढ़ा सकते हैं जो आपको लगता है कि उपयोगी हैं। StackExchange "(जो नहीं होना चाहिए) के बारे में" जो पहले उत्तर देता है "लेकिन" जो सबसे अच्छा उत्तर प्रदान करता है "(दोनों सामग्री और स्पष्टता के संदर्भ में)।
जियाकोमो अल्जेटा

11
संपादन भयानक है। यह lsआउटपुट को पार्स करने का सुझाव देता है और जवाब देने के लिए बहुत धीमा है find
वैल का कहना है कि मोनिका

9
(1) कोई वाइल्डकार्ड (ग्लोब / पैटर्न) केवल को छोड़कर बाश में पुनरावर्ती नहीं है **, और यहां तक ​​कि स्पष्ट रूप से सक्षम होना चाहिए। IMHO, की भूमिका के बारे में आपको स्पष्ट होना चाहिए  -R। (2) लोगों को सलाह दी जाती है कि वे सादे का उपयोग करने से बचें *क्योंकि यह शुरुआत के साथ फिल्नाम से मेल खा सकता है -, जिसे तब विकल्पों के रूप में व्याख्या किया जाएगा।  उस से बचाव करना चाहिए, लेकिन मुझे यकीन नहीं है कि सभी सम्मेलन उस सम्मान का सम्मान करते हैं। … (Cont'd)command -- *
स्कॉट

6
(Cont'd)… (3) *,  ./* और यहां तक ​​कि  /opt/* “dot files” खोजने में असफल रहें  ( .*) जब तक कि dotglobविकल्प सेट न हो। जैसा कि  यहोशू बेसनीते और  इलकाचु कहते हैं, chown -R /optऔर chown -R .बेहतर हैं। … (Cont'd)
स्कॉट

45

इस मामले में शेल ग्लोब .*मेल खाता है ..(मूल निर्देशिका) दुर्भाग्य से /:

steeldriver@t400s:/opt$ ls .*
.:

..:
bin  boot  cdrom  dev  etc  home  initrd.img  initrd.img.old  lib  lib32  lib64
libx32  lost+found  media  mnt  opt  proc  root  run  sbin  snap  srv  swapfile  sys
tmp  usr  var  vmlinuz  vmlinuz.old

अतिरिक्त चर्चा के लिए देखें:


6
यह सही है, और बहुत सरल है, उत्तर
17

5

आपकी परेशानी इसलिए हुई क्योंकि एक डॉट से शुरू होने वाली हर चीज से.* मेल खाती है । संदर्भ वर्तमान निर्देशिका है, क्योंकि इस अभिव्यक्ति में एक पथ शामिल नहीं है। इसलिए, यदि वर्तमान निर्देशिका में कोई छिपी हुई फ़ाइलें या फ़ोल्डर हैं , तो आप उनका मिलान करेंगे। लेकिन (जैसा कि आप उस फ़ोल्डर में चलकर देखेंगे ), आप मेल भी खाएंगे और.gitls -a...

और .., ज़ाहिर है, माता-पिता की निर्देशिका है, इसलिए chmod -Rमाता-पिता की निर्देशिका में हर चीज को पुन: लक्षित किया जाता है।


एक पूर्ण पथ जैसे /opt/.*मदद नहीं करेगा, CWD = के साथ भी ऐसा /opt/..ही है । ../opt
पीटर कॉर्ड्स

@Peter: हां, यह सही है: यदि अभिव्यक्ति में एक पथ शामिल है, जो वर्तमान निर्देशिका होने के बजाय संदर्भ (प्रारंभिक बिंदु) देगा। ओपी का मतलब .संदर्भ के रूप में उपयोग करना था, लेकिन यह गायब स्लैश के कारण उस तरह से काम नहीं करता था ...
एलेक्सिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.