সবচেয়ে সহজ (এবং সম্ভবত সবচেয়ে সঠিক) উত্তরটি "আপনি পারবেন না", তবে আপনি যদি চেষ্টা করতে চান তবে এখানে একটি বাশ স্ক্রিপ্ট রয়েছে যা .deb প্যাকেজভুক্ত / var এর অধীন ফাইলগুলির অনুমতিগুলি ঠিক করবে।
মন্তব্য:
- এটি কোনও প্যাকেজের অন্তর্ভুক্ত নয় এমন ফাইলগুলির পার্সম ঠিক করবে না।
- এটি সেই ফাইলগুলির জন্য পার্মস ঠিক করে না যেখানে প্যাকেজটি অ্যাপটি-গেটের মাধ্যমে ডাউনলোডের জন্য আর উপলব্ধ নেই - যেমন উত্তরাধিকার বা তৃতীয় পক্ষের প্যাকেজ।
- আফাইক, ডেবিয়ান প্যাকেজগুলিতে কোনও ফাইলের ফাইলের ট্যাব নেই, তাই আমি পড়ার সময় লুপের জন্য টিএফকে আইএফএস হিসাবে ব্যবহার করেছি। আমি ডেবিয়ান সিডের জন্য সামগ্রী-amd64.gz এবং বিষয়বস্তু- i386.gz পরীক্ষা করেছি এবং নিশ্চিত করেছি যে কোনও ট্যাব নেই, তবে তৃতীয় পক্ষের প্যাকেজগুলির কিছু থাকতে পারে।
স্ক্রিপ্টটি ইনস্টল করা প্যাকেজগুলির একটি তালিকা তৈরি করে যা ভারে ফাইল রয়েছে, সেই প্যাকেজগুলি ডাউনলোড করে এবং তারপরে dpkg-deb -c
অনুমতিগুলি কী হবে তা সন্ধান করে।
সবচেয়ে শক্ত অংশটি সেমুড, সেটগিড এবং স্টিকি বিট সহ ক্যাটারিং সহ একাধিক সংখ্যা মোডে অনুমতি দ্বারা স্ট্রিং রূপান্তর করার জন্য ( ls -l
বা দ্বারা প্রদর্শিত tar v
) ফাংশনটি লিখছিল ... এমন কিছু জিনিস যা একটি সুন্দর অ্যালগরিদম দিয়ে লিখতে সহজ হবে ইন, বলুন, পার্ল বাশ-এ খুব বেশি সমস্যায় পড়েছে, সুতরাং এটিকে কেবল প্রাণঘাতী করা সহজ।
শেষ পর্যন্ত, স্ক্রিপ্টটি "ডিবাগ-মোড" বা "ড্রাই-রান" মোডে থাকতে লেখা হয়। এটিকে প্রকৃতপক্ষে মালিক / গোষ্ঠী / পার্মসকে পরিবর্তন করতে, মন্তব্য-আউট করতে বা __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
স্ক্রিপ্টটি অবশ্যই অন্য যে কোনও ডিরেক্টরিতে বা সমস্ত ডিরেক্টরিতে প্যাকেজড-ফাইল পারম ঠিক করার জন্য খুব সহজেই অভিযোজিত হতে পারে।
এই স্ক্রিপ্টটি অনেক সহজ হত যদি $ প্যাকেজনাম.লিস্ট ফাইলগুলির /var/lib/dpkg/info
মালিক, গোষ্ঠী এবং অষ্টাল পার্মের পাশাপাশি ফাইলের নাম ছিল ... তবে সেগুলি তা না।
chown
সঠিক নকল ছিল ? এবং বন্ধ হয়ে যেত।