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

0

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 no caso de serem alterados ou não serem criados corretamente ou se espelhar os usuários / permissões para esse diretório em um diretório. 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 demorará muito tempo. Eu queria saber se existe um comando / script existente para realizar essa tarefa?

    
por blarg 08.05.2014 / 16:15

3 respostas

0

Como o yeti sugeriu nos comentários, usei o comando find para localizar todos os arquivos e diretórios dentro do diretório e enviar suas permissões / proprietários para um comando chown ou chmod. Eu adicionei a opção -v detalhado assim quando executando os shell scripts resultantes você pode ver o sucesso / 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 executar os arquivos .sh resultantes:

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

Em seguida, execute-os e exiba o feedback detalhado em um arquivo txt:

./chmods > chmods_results.txt

Boom.

    
por 08.05.2014 / 17:41
2

Na linha do comentário do @ yeti, eu pensei sobre isso há algum tempo, e parece lembrar de ter chegado à conclusão de que algo como

find /path/to/dir -printf '%m\t%u\t%g\t%p
while read -rd $'
find /path/to/dir -printf '%m\t%u\t%g\t%p
while read -rd $'%pre%' 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
' > filelist
' 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
' > filelist

e depois

%pre%

funcionaria. Colocar o nome do arquivo por último na saída e usar read e terminadores nulos em vez de novas linhas deve torná-lo 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 componente /path/to/dir inicial do comando find removido, ou seja, %P no lugar de %p .

    
por 08.05.2014 / 17:37
0

Você menciona events e, se tiver realmente muitos arquivos, faz sentido assistir a eles. Você pode querer dar uma olhada em inotifywatch , que "ouve eventos de sistema de arquivos", por exemplo. mudança de permissões de arquivo. No sistema operacional baseado no debian, ele reside no pacote inotify-tools .

    
por 08.05.2014 / 17:39