Come ripristinare la proprietà predefinita di gruppo / utente di tutti i file in / var?


13

Ho accidentalmente cambiato il /varproprietario / gruppo con il mio nome utente e poi l'ho cambiato di nuovo in root, ma non tutti i /varproprietari delle cartelle sono root, quindi c'è comunque modo di riportare il proprietario / gruppo di file / cartelle allo stato predefinito? O almeno quei file / cartelle creati dai pacchetti?


2
Modificato perché la tua domanda generale era un duplicato esatto di Come ripristinare il chowncomando? e sarebbe stato chiuso.
jw013,

Sembra che ci siano alcuni modi per risolvere questo problema come questo, ma non solo per / var e non solo per le distribuzioni basate su rpm.
sepehr,

Quale distro stai correndo?
derobert il

@derobert debian testing aka wheezy
sepehr,

Risposte:


6

Simile a una delle risposte precedenti, se si dispone di una copia della directory con le autorizzazioni corrette denominate "var" nella directory locale, è possibile utilizzare i due comandi seguenti per ripristinare le autorizzazioni nella directory / var.

sudo find var -exec chown --reference="{}" "/{}" \;
sudo find var -exec chmod --reference="{}" "/{}" \;

10

La risposta più semplice (e probabilmente la più corretta) è "Non puoi", ma se vuoi provare, ecco uno script bash che correggerà le autorizzazioni dei file in / var appartenenti ai pacchetti .deb.

APPUNTI:

  • non risolverà i permessi per i file che non appartengono a un pacchetto.
  • non risolverà i permessi per i file in cui il pacchetto non è più disponibile per il download da apt-get, ad esempio pacchetti legacy o di terze parti.
  • AFAIK, nessun file nei pacchetti debian ha schede nel nome del file, quindi ho usato TAB come IFS per il ciclo while-read. Ho controllato il contenuto-amd64.gz e il contenuto-i386.gz per debian sid e confermato che non ci sono schede, ma i pacchetti di terze parti potrebbero averne.

Lo script funziona generando un elenco di pacchetti installati con file in var, scaricando tali pacchetti e quindi utilizzando dpkg-deb -cper scoprire quali dovrebbero essere le autorizzazioni.

La parte più difficile è stata scrivere la funzione per convertire la stringa di autorizzazioni (come visualizzata da ls -lo tar v) in una modalità numerica ottale, incluso il catering per setuid, setgid e sticky bit .... alcune cose che sarebbe facile scrivere con un bel algoritmo in, diciamo, perl sono troppi problemi in bash, quindi è più semplice forzarlo bruto.

Infine, lo script viene scritto in modalità "debug-mode" o "dry-run". Per farlo effettivamente cambiare il proprietario / gruppo / permanenti, commentare o eliminare le due righe con gli __EOF__indicatori del documento qui su di esse.

#! /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

Lo script potrebbe, ovviamente, essere facilmente adattato per correggere i permessi dei file compressi in qualsiasi altra directory o in tutte le directory.

Questo script sarebbe stato molto più semplice se i file $ packagename.list /var/lib/dpkg/infoavessero permessi proprietario, gruppo e ottale così come il nome file ... ma non lo fanno.


1
Bello. Inoltre, potresti essere in grado di sostituire il tuo grep con * .list con dpkg -S /var. Inoltre, dopo aver applicato questo script, è necessario verificare dpkg-statoverride --list '/var/*'.
derobert,

Vero, ma dpkg -Sè lento (motivo per cui ho scritto dlocate). Un buon punto dpkg-statoverride, però .... e il formato di output è perfetto.
Cas

1
Grazie per la sceneggiatura. C'è un errore di battitura in una delle invocazioni sed, in cui lo spazio vuoto viene cambiato in tab, manca l'ultimo '/'. (e mentre ci siamo, perché non scrivere: sed -e 's / + / \ t / g' | \
Chelmite

3

Potresti.

Installa la stessa distribuzione su un altro computer o una macchina virtuale e usa il chmod --referper sincronizzare le autorizzazioni/var


1

La semplice risposta è "non puoi".

Ma .... se hai un filesystem come JFS che ha un registro puoi ripristinarlo con i suoi strumenti. Alcuni gestori di pacchetti ti consentono di ripristinare i suoi pacchetti e forse in questo modo puoi recuperare il proprietario dei tuoi file.

Un altro modo, ma più ingombrante è che puoi montare / var su un altro dispositivo e che i programmi ricreano la directory mancante.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.