कैसे / var के तहत सभी फ़ाइलों के डिफ़ॉल्ट समूह / उपयोगकर्ता स्वामित्व को पुनर्स्थापित करने के लिए?


13

मैंने गलती से /varमालिक / समूह को अपने उपयोगकर्ता नाम में बदल दिया और फिर इसे वापस रूट में बदल दिया, लेकिन सभी /varफ़ोल्डरों के स्वामी जड़ नहीं हैं, इसलिए डिफ़ॉल्ट स्थिति में फ़ाइलों / फ़ोल्डरों के स्वामी / समूह को वापस बदलने के लिए वैसे भी है? या कम से कम उन फ़ाइलों / फ़ोल्डरों को जो पैकेजों द्वारा बनाए गए हैं?


2
संपादित किया गया है क्योंकि आपका सामान्य प्रश्न था कि कमांड को कैसे वापस chownकिया जाए? और बंद हो गया होता।
jw013

ऐसा लगता है वहाँ की तरह इसे ठीक करने के कुछ तरीके हैं इस एक नहीं लेकिन सिर्फ / var के लिए और न सिर्फ आरपीएम आधारित वितरण के लिए।
सेफ़र

कौन से डिस्ट्रो चल रहे हो?
derobert

@derobert डेबियन उर्फ खरखरा परीक्षण
sepehr

जवाबों:


6

उपरोक्त उत्तरों में से एक के समान, यदि आपके पास अपनी स्थानीय निर्देशिका में "var" नाम की सही अनुमतियों वाली निर्देशिका की एक प्रति है, तो आप / var निर्देशिका में अनुमतियों को पुनर्स्थापित करने के लिए निम्नलिखित दो आदेशों का उपयोग कर सकते हैं।

sudo find var -exec chown --reference="{}" "/{}" \;
sudo find var -exec chmod --reference="{}" "/{}" \;

10

सबसे सरल (और शायद सबसे सही) उत्तर है "आप नहीं कर सकते", लेकिन अगर आप कोशिश करना चाहते हैं, तो यहां एक बैश स्क्रिप्ट है जो .deb पैकेज से संबंधित / var के तहत फ़ाइलों की अनुमतियों को ठीक करेगा।

टिप्पणियाँ:

  • यह एक पैकेज से संबंधित फ़ाइलों के लिए परमिट को ठीक नहीं करेगा।
  • यह उन फ़ाइलों के लिए परमिट को ठीक नहीं करेगा जहाँ पैकेज अब डाउनलोड के लिए उपलब्ध नहीं है - जैसे कि विरासत या तीसरे पक्ष के पैकेज।
  • AFAIK, डेबियन पैकेज की कोई फाइल फाइलनाम में टैब्स नहीं है, इसलिए मैंने TAB का उपयोग IFS के रूप में समय-समय पर लूप के लिए किया है। मैंने कॉन्टेंट्स-amd64.gz और कॉन्टेंट्स-i386.gz को डेबियन साइड के लिए चेक किया है और पुष्टि की है कि टैब नहीं हैं, लेकिन थर्ड-पार्टी पैकेज में कुछ हो सकता है।

स्क्रिप्ट उन स्थापित पैकेजों की सूची तैयार करके काम करती है, जिनके पास var में फाइलें होती हैं, उन पैकेजों को डाउनलोड करना और फिर dpkg-deb -cयह पता लगाने के लिए कि अनुमतियाँ क्या होनी चाहिए।

सबसे कठिन हिस्सा है (जैसा कि द्वारा प्रदर्शित अनुमतियाँ स्ट्रिंग परिवर्तित करने के लिए समारोह लिख रहा था ls -lया tar vएक अष्टाधारी संख्यात्मक मोड के लिए), setuid, setgid के लिए खानपान, और चिपचिपा बिट्स .... कुछ चीजें हैं जो एक अच्छा एल्गोरिथ्म के साथ लिखने के लिए आसान हो सकता है सहित , कहो, पर्ल बहुत ज्यादा परेशानी में हैं, इसलिए इसे सिर्फ बल देना आसान है।

अंत में, स्क्रिप्ट को "डिबग-मोड" या "ड्राई-रन" मोड में लिखा जाता है। वास्तव में इसे बदलने के लिए स्वामी / समूह / परमिट, टिप्पणी-आउट या __EOF__उन पर दस्तावेज़ मार्कर के साथ दो पंक्तियों को हटा दें।

#! /bin/bash

perm_string_to_mode() {
  string="$1"
  let perms=0

  [[ "${string}" = ?r???????? ]] && perms=$(( perms +  400 ))
  [[ "${string}" = ??w??????? ]] && perms=$(( perms +  200 ))
  [[ "${string}" = ???x?????? ]] && perms=$(( perms +  100 ))
  [[ "${string}" = ???s?????? ]] && perms=$(( perms + 4100 ))
  [[ "${string}" = ???S?????? ]] && perms=$(( perms + 4000 ))
  [[ "${string}" = ????r????? ]] && perms=$(( perms +   40 ))
  [[ "${string}" = ?????w???? ]] && perms=$(( perms +   20 ))
  [[ "${string}" = ??????x??? ]] && perms=$(( perms +   10 ))
  [[ "${string}" = ??????s??? ]] && perms=$(( perms + 2010 ))
  [[ "${string}" = ??????S??? ]] && perms=$(( perms + 2000 ))
  [[ "${string}" = ???????r?? ]] && perms=$(( perms +    4 ))
  [[ "${string}" = ????????w? ]] && perms=$(( perms +    2 ))
  [[ "${string}" = ?????????x ]] && perms=$(( perms +    1 ))
  [[ "${string}" = ?????????t ]] && perms=$(( perms + 1001 ))
  [[ "${string}" = ?????????T ]] && perms=$(( perms + 1000 ))

  echo $perms
}

# generate a list of installed packages that have files etc in /var
grep -l /var/ /var/lib/dpkg/info/*.list  | \
  sed -e 's:/var/lib/dpkg/info/::' -e 's/\.list$//' | \
  xargs dpkg -l | \
  awk '/^[hi]/ {print $2}' > /tmp/packages.list

# clean out the apt cache, so we only have one version of each package
apt-get clean

# download the packages as if we were going to reinstall them
# NOTE: packages which are no longer available for download
# will not have their permissions fixed.  apt-get will complain about
# those packages, so you can get a list by redirecting or tee-ing the
# output of this script.
xargs apt-get -y -d -u --reinstall install < /tmp/packages.list

for pkg in $(cat /tmp/packages.list) ; do
   PKGFILE="/var/cache/apt/archives/${pkg}_*.deb"

   if [ -e $PKGFILE ] ; then

     dpkg-deb -c /var/cache/apt/archives/${pkg}_*.deb | \
       awk '/\.\/var\// {print $1, $2, $6}' | \
       sed -e 's/ /\t/' -e 's/ /\t' | \
       while IFS=$'\t' read permstring ownergroup filename ; do
          # don't change owner/group/perms on symlinks
          if ! [[ "${permstring}" =~ ^l ]] ; then
            mode=$(perm_string_to_mode $permstring)
            # change "owner/group" to "owner:group" for chown
            ownergroup=${ownergroup//\//:}
            # remove leading '.' from filename
            filename=${filename#?}
cat <<__EOF__
            chown "$ownergroup" "$filename"
            chmod "$mode" "$filename"
__EOF__ 
         fi
       done
     echo
   fi
done

बेशक, स्क्रिप्ट आसानी से किसी भी अन्य निर्देशिका में, या सभी निर्देशिकाओं में पैक-फ़ाइल अनुमति को ठीक करने के लिए अनुकूलित की जा सकती है।

यदि $ packagename.list फ़ाइलें /var/lib/dpkg/infoस्वामी, समूह, और ऑक्टल परमिट के साथ-साथ फ़ाइल नाम में भी होती तो यह स्क्रिप्ट बहुत आसान होती ... लेकिन वे नहीं करते।


1
अच्छा लगा। इसके अलावा, आप अपने grep को * .list से बदल सकते हैं dpkg -S /var। इसके अलावा, इस स्क्रिप्ट को लागू करने के बाद, किसी को भी जांच करने की आवश्यकता है dpkg-statoverride --list '/var/*'
derobert

सच है, लेकिन dpkg -Sधीमा है (यही वजह है कि मैंने लिखा dlocate)। के बारे में अच्छी बात है dpkg-statoverride, हालांकि .... और आउटपुट स्वरूप एकदम सही है।
कैस

1
स्क्रिप्ट के लिए धन्यवाद। एक सेड इनवोकेशन में एक टाइपो है, जहां रिक्त टैब में बदल जाता है, यह अंतिम '/' को याद कर रहा है। (और जब हम उस पर हैं, तो बस क्यों नहीं लिखें: sed -e 's / + / \ t / g' | \
Chelmite

3

आप ऐसा कर सकते हैं।

किसी अन्य मशीन या VM पर समान वितरण स्थापित करें, और इसके chmod --referलिए अनुमतियों को सिंक्रनाइज़ करने के लिए उपयोग करें/var


1

सरल उत्तर है "आप नहीं कर सकते"।

लेकिन .... अगर आपके पास JFS जैसा फाइल सिस्टम है जिसमें लॉग है तो आप इसे टूल के साथ रिस्टोर कर सकते हैं। कुछ पैकेज मैनेजर आपको पैकेजों को फिर से जारी करने की अनुमति देते हैं और शायद इस तरह से आप अपने फाइलों के मालिक को पुनर्प्राप्त कर सकते हैं।

एक और तरीका है लेकिन अधिक बोझिल है कि आप किसी अन्य डिवाइस पर / var को माउंट कर सकते हैं और कार्यक्रमों से लापता निर्देशिका को फिर से बनाएंगे।

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