सबसे सरल (और शायद सबसे सही) उत्तर है "आप नहीं कर सकते", लेकिन अगर आप कोशिश करना चाहते हैं, तो यहां एक बैश स्क्रिप्ट है जो .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
स्वामी, समूह, और ऑक्टल परमिट के साथ-साथ फ़ाइल नाम में भी होती तो यह स्क्रिप्ट बहुत आसान होती ... लेकिन वे नहीं करते।
chown
किया जाए? और बंद हो गया होता।