En basit (ve muhtemelen en doğru) cevap "Yapamazsınız" dır, ancak denemek istiyorsanız, .deb paketlerine ait / var altındaki dosyaların izinlerini düzelten bir bash betiği.
NOTLAR:
- bir pakete ait olmayan dosyalar için izinleri düzeltmez.
- paketin artık apt-get tarafından indirilemediği dosyalar için izinleri düzeltmez - örneğin eski veya üçüncü taraf paketleri.
- AFAIK, debian paketlerindeki hiçbir dosyanın dosya adında sekmeleri yoktur, bu yüzden tab-read döngüsü için TAB'yi IFS olarak kullandım. Debian sid için Contents-amd64.gz ve Contents-i386.gz'yi kontrol ettim ve sekme olmadığını doğruladım, ancak üçüncü taraf paketlerinde bazı olabilir.
Komut dosyası, var dosyalarına sahip kurulu paketlerin bir listesini oluşturarak, bu paketleri indirerek ve sonra dpkg-deb -c
izinlerin ne olması gerektiğini bulmak için kullanılır.
En zor kısmı, izin dizesini ( ls -l
veya ile gösterildiği gibi tar v
) setuid, setgid ve yapışkan bitler için yiyecek-içecek dahil olmak üzere sekizli bir sayısal moda dönüştürme işlevini yazıyordu .... güzel bir algoritma ile yazılması kolay olan bazı şeyler diyelim ki, perl bash'da çok fazla sorun, bu yüzden onu kaba kuvvetle zorlamak daha kolay.
Son olarak, komut dosyası "hata ayıklama modu" veya "kuru çalışma" modunda yazılır. Sahip / grup / izinleri gerçekten değiştirmesini sağlamak için, __EOF__
burada belge işaretleyicileri bulunan iki satırı yorumlayın veya silin .
#! /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
Komut dosyası, elbette, herhangi bir dizinde veya tüm dizinlerde paketlenmiş dosya izinlerini düzeltmek için kolayca kolayca uyarlanabilir.
Bu komut dosyası /var/lib/dpkg/info
, dosya adının yanı sıra sahip, grup ve sekizli izinlerin yanı sıra dosya adının yanı sıra $ packagename.list dosyalarına sahip olsaydı çok daha basit olurdu ...
chown
? Sorusunun tam bir kopyası olduğu için düzenlendi. ve kapatılacaktı.