Wie stelle ich die standardmäßige Gruppen- / Benutzereigenschaft aller Dateien unter / var wieder her?

13

Ich habe versehentlich den /varBesitzer / die Gruppe in meinen Benutzernamen geändert und ihn dann wieder in den Stammordner geändert, aber nicht alle /varBesitzer der Ordner sind root. Gibt es also eine Möglichkeit, den Besitzer / die Gruppe von Dateien / Ordnern in den Standardzustand zurückzusetzen? Oder zumindest die Dateien / Ordner, die von Paketen erstellt werden?

Sepehr
quelle
2
Bearbeitet , weil Ihre allgemeine Frage ein exaktes Duplikat der war wie zurückzukehren chownBefehl? und wäre geschlossen worden.
JW013
Es scheint , gibt es einige Möglichkeiten, dies zu beheben , wie diese aber nicht nur für / var und nicht nur für rpm - basierten Distributionen.
Sepehr
Welche Distribution betreiben Sie?
Derobert
@derobert debian testing aka wheezy
sepehr

Antworten:

6

Ähnlich wie bei einer der obigen Antworten können Sie mit den folgenden beiden Befehlen Berechtigungen für das Verzeichnis / var wiederherstellen, wenn Sie eine Kopie des Verzeichnisses mit den korrekten Berechtigungen "var" in Ihrem lokalen Verzeichnis haben.

sudo find var -exec chown --reference="{}" "/{}" \;
sudo find var -exec chmod --reference="{}" "/{}" \;
Nathan Buesgens
quelle
10

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 -cvon die erforderlichen Berechtigungen.

Der schwierigste Teil war das Schreiben der Funktion zum Konvertieren der Berechtigungszeichenfolge (wie von ls -loder 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/infoEigentümer-, Gruppen- und Oktal-Perms sowie den Dateinamen hätten ... aber das tun sie nicht.

cas
quelle
1
Nett. Möglicherweise können Sie auch Ihr Grep durch * .list durch ersetzen dpkg -S /var. Außerdem muss nach dem Anwenden dieses Skripts überprüft werden dpkg-statoverride --list '/var/*'.
Derobert
Stimmt, ist aber dpkg -Slangsam (weshalb ich geschrieben habe dlocate). Guter Punkt dpkg-statoverrideaber .... und das Ausgabeformat ist perfekt.
cas
1
Danke für das Drehbuch. In einem der sed-Aufrufe befindet sich ein Tippfehler, bei dem das Leerzeichen in ein Tabulatorzeichen geändert wird und das letzte '/' fehlt. (Und wenn wir schon dabei sind, schreiben Sie doch einfach: sed -es / + / \ t / g '| \
Chelmite
3

Du könntest.

Installieren Sie dieselbe Distribution auf einem anderen Computer oder einer VM und chmod --refersynchronisieren Sie die Berechtigungen für/var

Gänseblümchen
quelle
1

Die einfache Antwort lautet "Sie können nicht".

Aber ... wenn Sie ein Dateisystem wie JFS haben, das ein Protokoll hat, können Sie es mit seinen Werkzeugen wiederherstellen. Bei einigen Paketmanagern können Sie die Pakete neu installieren und auf diese Weise möglicherweise den Eigentümer Ihrer Dateien wiederherstellen.

Eine andere Möglichkeit, die jedoch umständlicher ist, besteht darin, dass Sie / var auf einem anderen Gerät einbinden können und die Programme dann das fehlende Verzeichnis neu erstellen.

Hola Soja Edu Feliz Navidad
quelle