Como restaurar a propriedade do grupo / usuário padrão de todos os arquivos em / var?

13

Eu acidentalmente mudei /var owner / group para meu nome de usuário e mudei-o de volta para root, mas nem todos os proprietários das pastas /var são root, então há alguma maneira de alterar o proprietário / grupo de arquivos / pastas para o estado padrão? Ou pelo menos aqueles arquivos / pastas criados por pacotes?

    
por sepehr 04.10.2012 / 23:18

4 respostas

6

Semelhante a uma das respostas acima, se você tiver uma cópia do diretório com as permissões corretas chamadas "var" em seu diretório local, poderá usar os dois comandos a seguir para restaurar as permissões para o diretório / var.

sudo find var -exec chown --reference="{}" "/{}" \;
sudo find var -exec chmod --reference="{}" "/{}" \;
    
por 14.06.2013 / 21:24
10

A resposta mais simples (e provavelmente a mais correta) é "Você não pode", mas se você quiser tentar, aqui está um script bash que irá corrigir as permissões dos arquivos sob / var pertencentes aos pacotes .deb.

NOTAS:

  • não consertará perms para arquivos que não pertençam a um pacote.
  • ele não consertará permanentes para arquivos nos quais o pacote não está mais disponível para download pelo apt-get - por exemplo, pacotes legados ou de terceiros.
  • AFAIK, nenhum arquivo em pacotes debian tem abas no nome do arquivo, então usei o TAB como o IFS para o loop de leitura de tempo. Eu verifiquei o Contents-amd64.gz e o Contents-i386.gz para o sid debian e confirmei que não há abas, mas pacotes de terceiros podem ter alguns.

O script funciona gerando uma lista de pacotes instalados que possuem arquivos em var, baixando esses pacotes e usando dpkg-deb -c para descobrir quais devem ser as permissões.

A parte mais difícil foi escrever a função para converter a string de permissões (como mostrada por ls -l ou tar v ) em um modo numérico octal, incluindo catering para setuid, setgid e sticky bits .... algumas coisas que seria fácil escrever com um bom algoritmo, digamos, o perl é muito problemático no bash, então é mais fácil apenas forçar brute.

Finalmente, o script é escrito para estar no modo "debug-mode" ou "dry-run". Para realmente alterar o proprietário / grupo / perms, comente ou exclua as duas linhas com os marcadores de documento __EOF__ here neles.

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

O script, é claro, pode ser facilmente adaptado para corrigir perms de arquivo empacotado em qualquer outro diretório, ou em todos os diretórios.

Este script teria sido muito mais simples se os arquivos $ packagename.list em /var/lib/dpkg/info tivessem perms de proprietário, grupo e octal, bem como o nome do arquivo ... mas não o fazem.

    
por 05.10.2012 / 04:42
3

Você poderia.

Instale a mesma distribuição em outra máquina ou em uma VM e use o chmod --refer para sincronizar as permissões para /var

    
por 05.10.2012 / 01:41
1

A resposta simples é "você não pode".

Mas ... se você tem um sistema de arquivos como o JFS que possui um log, você pode restaurá-lo com suas ferramentas. Alguns gerenciadores de pacotes permitem que você reintale seus pacotes e, talvez, com isso, você pode recuperar o proprietário de seus arquivos.

Outra maneira, mas mais complicada, é que você pode montar o / var em outro dispositivo e os programas recriarão o diretório ausente.

    
por 04.10.2012 / 23:45