Script para verificar recursivamente as permissões e proprietários de um diretório e escrever um script shell para recriá-los

Script para verificar recursivamente as permissões e proprietários de um diretório e escrever um script shell para recriá-los

Estou tentando escrever um script de shell para preservar e reescrever todas as permissões/grupos em um diretório grande com vários subdiretórios, caso eles sejam alterados ou não sejam criados corretamente ou se espelharem os usuários/permissões para este diretório em uma máquina diferente.

Algo como:

chown adam:brown /var/blarg
chmod 770 /var/blarg
chown adam:brown /var/blarg/toast.file
chmod 777 /var/blarg/toast.file

...etc

Fazer isso manualmente levará muito tempo. Eu queria saber se existe um comando/script existente para realizar esta tarefa?

Responder1

Seguindo as linhas do comentário de @yeti, pensei sobre isso há algum tempo e parece que me lembro de ter chegado à conclusão de que algo como

find /path/to/dir -printf '%m\t%u\t%g\t%p\0' > filelist

e então

while read -rd $'\0' perms user group file; do 
  if [ -e "$file" ]; then
    chown "$user:$group" "$file"
    chmod "$perms" "$file"
  else
    echo "warning: $file not found"
  fi
done < filelist

podia funcionar. Colocar o nome do arquivo por último na saída e usar readterminadores nulos em vez de novas linhasdevetorne-o seguro mesmo para nomes de arquivos com espaços e outros caracteres especiais. Dependendo de onde você deseja executar o segundo comando, pode ser mais conveniente usar o nome do arquivo com o /path/to/dircomponente principal do findcomando removido, ou seja, %Pno lugar de %p.

Responder2

Como o Yeti sugeriu nos comentários, usei o comando find para localizar todos os arquivos e diretórios dentro do diretório e gerar suas permissões/proprietários em um comando chown ou chmod. Eu adicionei a -vopção detalhada para que, ao executar os scripts de shell resultantes, você possa ver os sucessos/erros dos comandos:

find /var/blarg -printf 'chown -v %u:%g %p\n' > chowns.sh
find /var/blarg -printf 'chmod -v %m %p\n' > chmods.sh

Agora basta tornar os arquivos .sh resultantes executáveis:

chmod +x chowns.sh; chmod +x chmods.sh

Em seguida, execute-os e envie o feedback detalhado para um arquivo txt:

./chmods > chmods_results.txt

Estrondo.

Responder3

Você menciona events, e se você tiverrealmentemuitos arquivos, faz sentido observá-los. Você pode dar uma olhada em inotifywatch, que "escuta eventos do sistema de arquivos", por exemplo, alteração de permissões de arquivo. No sistema operacional baseado em Debian, ele reside no pacote inotify-tools.

informação relacionada