Die einfachste (und wahrscheinlich richtigste) Antwort lautet "Sie können nicht". Wenn Sie es jedoch versuchen möchten, finden Sie hier ein Bash-Skript, das die Berechtigungen von Dateien unter / var korrigiert, die zu .deb-Paketen gehören.
ANMERKUNGEN:
- Perms für Dateien, die nicht zu einem Paket gehören, werden nicht repariert.
- Es werden keine Perms für Dateien repariert, bei denen das Paket nicht mehr von apt-get heruntergeladen werden kann - z. B. Legacy-Pakete oder Pakete von Drittanbietern.
- AFAIK, keine Dateien in Debian-Paketen haben Tabulatoren im Dateinamen, deshalb habe ich TAB als IFS für die while-read-Schleife verwendet. Ich habe die Dateien Contents-amd64.gz und Contents-i386.gz auf debian sid überprüft und festgestellt, dass es keine Registerkarten gibt, Pakete von Drittanbietern jedoch möglicherweise solche.
Das Skript erstellt eine Liste der installierten Pakete, die Dateien in var enthalten, lädt diese Pakete herunter und ermittelt anschließend mithilfe dpkg-deb -c
von die erforderlichen Berechtigungen.
Der schwierigste Teil war das Schreiben der Funktion zum Konvertieren der Berechtigungszeichenfolge (wie von ls -l
oder angezeigt tar v
) in einen oktalen numerischen Modus, einschließlich der Berücksichtigung von setuid-, setgid- und sticky-Bits. Einige Dinge, die mit einem netten Algorithmus leicht zu schreiben wären In Perl gibt es beispielsweise zu viele Probleme mit Bash, sodass es einfacher ist, es einfach mit roher Gewalt zu erzwingen.
Schließlich wird das Skript so geschrieben, dass es sich im "Debug-Modus" oder "Probelauf" befindet. Um den Eigentümer / die Gruppe / die Dauerwelle tatsächlich zu ändern, kommentieren oder löschen Sie die beiden Zeilen mit den __EOF__
hier angegebenen Dokumentmarkierungen.
#! /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
Das Skript könnte natürlich ganz einfach angepasst werden, um Perms für gepackte Dateien in einem anderen Verzeichnis oder in allen Verzeichnissen zu reparieren.
Dieses Skript wäre viel einfacher gewesen, wenn die $ packagename.list-Dateien /var/lib/dpkg/info
Eigentümer-, Gruppen- und Oktal-Perms sowie den Dateinamen hätten ... aber das tun sie nicht.
chown
Befehl? und wäre geschlossen worden.