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


13

Mudei acidentalmente /varproprietário / grupo para o meu nome de usuário e depois mudei de volta para raiz, mas nem todos os /varproprietários das pastas são raiz. Portanto, existe alguma maneira de voltar a mudar o proprietário / grupo de arquivos / pastas para o estado padrão? Ou pelo menos os arquivos / pastas criados por pacotes?


2
Editado porque sua pergunta geral era uma duplicata exata de Como reverter o chowncomando? e teria sido fechado.
Jw013 04/04

Parece que existem algumas maneiras de corrigir isso como este, mas não apenas para / var e não apenas para distribuições baseadas em rpm.
sepehr

Qual distro você está executando?
Derobert # 4/12

@derobert debian testing aka
wheezy

Respostas:


6

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

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

10

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

NOTAS:

  • não corrigirá permissões para arquivos que não pertencem a um pacote.
  • ele não corrigirá permissões para arquivos em que o pacote não está mais disponível para download pelo apt-get - por exemplo, pacotes herdados ou de terceiros.
  • AFAIK, nenhum arquivo nos pacotes debian tem guias no nome do arquivo, então usei a TAB como o IFS para o loop while-read. Eu verifiquei o conteúdo-amd64.gz e o conteúdo-i386.gz quanto ao debian sid e confirmei que não existem guias, mas os pacotes de terceiros podem ter alguns.

O script funciona gerando uma lista de pacotes instalados com arquivos em var, dpkg-deb -cfazendo o download desses pacotes e usando-os para descobrir quais devem ser as permissões.

A parte mais difícil foi escrever a função para converter a sequência de permissões (como exibida por ls -lou tar v) em um modo numérico octal, incluindo restauração de bits setuid, setgid e sticky .... algumas coisas que seriam fáceis de escrever com um bom algoritmo em, digamos, perl são muitos problemas no bash, por isso é mais fácil forçá-lo com força bruta.

Por fim, o script foi escrito para estar no modo "depuração" ou "execução a seco". Para que ele realmente altere o proprietário / grupo / permissões, comente ou exclua as duas linhas com os __EOF__marcadores de documento aqui.

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

Obviamente, o script pode ser facilmente adaptado para corrigir permissões de arquivo compactado em qualquer outro diretório ou em todos os diretórios.

Esse script seria muito mais simples se os arquivos $ packagename.list /var/lib/dpkg/infocontinham permissões de proprietário, grupo e octal, bem como o nome do arquivo ... mas eles não têm.


1
Agradável. Além disso, você poderá substituir seu grep por * .list por dpkg -S /var. Além disso, após a aplicação desse script, é necessário verificar dpkg-statoverride --list '/var/*'.
Derobert

É verdade, mas dpkg -Sé lento (e é por isso que escrevi dlocate). Bom ponto dpkg-statoverride, porém ... e o formato de saída é perfeito.
6282

1
Obrigado pelo script. Há um erro de digitação em uma das invocações sed, onde o espaço em branco é alterado para tab, faltando o final '/'. (e enquanto estamos nisso, por que não escrever: sed -e / s / + / \ t / g '| \
Chelmite 13/09/2014

3

Você poderia.

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


1

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

Mas .... se você tiver um sistema de arquivos como o JFS que possua um log, poderá restaurá-lo com suas ferramentas. Alguns gerenciadores de pacotes permitem reintegrar seus pacotes e, talvez, dessa maneira, você possa recuperar o proprietário dos arquivos.

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.