Fazer backup e restaurar permissões de arquivo

17

Existe uma maneira de fazer backup e restaurar a propriedade e as permissões do arquivo (as coisas que podem ser alteradas com chowne chmod)?

Você pode fazer isso no Windows usando icacls .

E as listas de controle de acesso?

leeand00
fonte
Ajudaria se você declarasse qual distro você está usando, pois distros diferentes usam gerenciadores de pacotes diferentes.
garethTheRed
@garethTheRed, isso também depende do fs que está sendo usado ou apenas da distribuição?
precisa saber é
1
Duvido que isso dependa do sistema de arquivos.
garethTheRed
Até agora, não há resposta perfeita.
kittyGirl

Respostas:

24

Você pode fazer isso com os comandos do pacote acl (que deve estar disponível em todas as distribuições principais, mas pode não fazer parte da instalação base). Eles fazem backup e restauram a ACL quando a ACL está presente, mas também funcionam com permissões básicas, mesmo em sistemas que não oferecem suporte à ACL.

Para fazer backup de permissões no diretório atual e seus subdiretórios recursivamente:

getfacl -R . >permissions.facl

Para restaurar permissões:

setfacl --restore=permissions.facl
Gilles 'SO- parar de ser mau'
fonte
Hmm. Eu realmente preciso ler sobre ACLs.
roaima
1
No arquivo gerado, eles também são relativos a um diretório?
leeand00
2
@ leeand00 Sim, o arquivo gerado sempre usa nomes de arquivos relativos.
Gilles 'SO- stop being evil'
@ Gilles, com base em arquivos unix.stackexchange.com/questions/364517/… setfacl , não pode chmodnovamente, talvez cause conflito?
Kittygirl #
1
@ kittygirl Eu não tenho idéia do que você está perguntando. O que significa “arquivos setfacl e não pode chmod novamente”? O que isso tem a ver com unix.stackexchange.com/questions/364517/… ? Que conflito?
Gilles 'SO- stop be evil'
2

Não estou ciente de nada "pronto para uso" que faria isso. Aqui está um script inicial para você, no entanto, que manipulará permissões básicas. Ele não trata de ACLs de nenhuma descrição - mas sua pergunta as exclui explicitamente. (Ele também falhará nos nomes de arquivos patológicos - aqueles que começam com espaço em branco ou que contêm caracteres não imprimíveis.)

Salve as permissões

find * -depth -exec stat --format '%a %u %g %n' {} + >/tmp/save-the-list

Restaure as permissões

while read PERMS OWNER GROUP FILE
do
    chmod "$PERMS" "$FILE"
    chown "${OWNER}:${GROUP}" "$FILE"
done </tmp/save-the-list
roaima
fonte
você quer dizer que o ACL também falhará nos nomes de arquivos patológicos?
Kittygirl #
@kittygirl Não incluí nenhum processamento de ACLs no scriptlet porque o OP os excluiu explicitamente dos requisitos. Você pode adicionar o que quiser, tendo em mente que o código não é particularmente robusto (consulte o comentário que descreve os nomes de arquivos patológicos).
roaima 02/10
Eu encontrei um problema: não é possível encontrar .htaccess, gitignore...
kittyGirl
0
#!/bin/bash
# prepare files
home="/home/exchange"
cd $home
>acl
echo "#!/bin/bash">recovery_acl.sh
echo "cd $home">>recovery_acl.sh
f='./'
# create acl file sorted by dir_level
for i in `seq 0 15`;do
  find . -mindepth $i -maxdepth $i -type d -exec getfacl {} +|grep -E '*UTS|file:'>>acl
done
sed -i 's/default\:user/\-dm\ u/g' acl
sed -i 's/default\:group/\-dm\ g/g' acl
sed -i 's/user/\-m\ u/g' acl
sed -i 's/group/\-m\ g/g' acl
sed -i 's/\#\ file\:\ /\.\//g' acl
sed -i 's,\\,\\\\,g' acl

while IFS='' read -r line ; do
  # grep dir name
  if echo "$line" | grep -q "$f" ; then
    dir="$line"
    continue
  fi
  echo setfacl $line '"'$dir'"'>>recovery_acl.sh
  # grep non def acl (for files)
  if echo "$line" | grep -q '\-m' ; then
    echo setfacl $line '"'$dir'"'/*>>recovery_acl.sh
  fi
done < "acl"

sed -i "s/\\\134/\\\\\\\134/g" recovery_acl.sh
sed -i "s/\\\040/\\\\ /g" recovery_acl.sh

Este script bash obtém apenas acl dirs (no meu caso, arquivos acls = dir (pai) acl) Após a execução do script, será criada outra "recovery_acl.sh".

Durante a recuperação de erros como "Nenhum arquivo ou diretório" significa que o diretório está vazio ou o nome do diretório possui dois / mais espaços juntos.

Terentev Maksim
fonte