Copia de seguridad y restauración de permisos de archivos


17

¿Hay alguna manera de hacer una copia de seguridad y restaurar la propiedad y los permisos del archivo (las cosas que se pueden cambiar con chowny chmod)?

Puede hacer esto en Windows usando icacls .

¿Qué pasa con las listas de control de acceso?


Sería útil si dijera qué distribución está utilizando, ya que diferentes distribuciones usan diferentes administradores de paquetes.
garethTheRed

@garethTheRed, ¿también depende de los fs que se usen o solo de la distribución?
leeand00

1
Dudo que dependa del sistema de archivos.
garethTheRed

Hasta ahora, no hay una respuesta perfecta.
kittygirl

Respuestas:


24

Puede hacer esto con los comandos del paquete acl (que debería estar disponible en todas las distribuciones principales, pero podría no ser parte de la instalación base). Realizan copias de seguridad y restauran ACL cuando ACL está presente, pero también funcionan para permisos básicos, incluso en sistemas que no admiten ACL.

Para hacer una copia de seguridad de los permisos en el directorio actual y sus subdirectorios de forma recursiva:

getfacl -R . >permissions.facl

Para restaurar los permisos:

setfacl --restore=permissions.facl

Hmm Yo realmente necesito leer sobre las ACL.
roaima

1
En el archivo generado, ¿son relativos a un directorio también?
leeand00

2
@ leeand00 Sí, el archivo generado siempre usa nombres de archivo relativos.
Gilles 'SO- deja de ser malvado'

@ Gilles, basado en archivos unix.stackexchange.com/questions/364517/… setfacl , entonces no puede chmodvolver a hacerlo , ¿tal vez causará un conflicto?
kittygirl

1
@kittygirl No tengo idea de lo que estás preguntando. ¿Qué significa "los archivos setfacl no pueden chmod nuevamente"? ¿Qué tiene esto que ver con unix.stackexchange.com/questions/364517/… ? Que conflicto
Gilles 'SO- deja de ser malvado'

2

No estoy al tanto de nada "listo para usar" que haga esto. Sin embargo, aquí hay un script de inicio para usted que manejará los permisos básicos. No maneja las ACL de ninguna descripción, pero su pregunta las excluye explícitamente. (También fallará en los nombres de archivos patológicos, aquellos que comienzan con espacios en blanco o que contienen caracteres no imprimibles).

Guarda los permisos

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

Restaurar los permisos

while read PERMS OWNER GROUP FILE
do
    chmod "$PERMS" "$FILE"
    chown "${OWNER}:${GROUP}" "$FILE"
done </tmp/save-the-list

¿Quieres decir que ACL también fallará en los nombres de archivos patológicos?
kittygirl

@kittygirl No incluí ningún procesamiento de ACL en el scriptlet porque el OP los había excluido explícitamente de los requisitos. Puede agregar lo que quiera, teniendo en cuenta que el código no es particularmente robusto (vea el comentario que describe los nombres de archivo patológicos).
roaima

He encontrado un problema: no puede 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 obtiene directorios acl solamente (en mi caso, archivos acls = dir (padre) acl) Después de la ejecución del script, creará otro "recovery_acl.sh".

Al recuperar errores como "No existe tal archivo o directorio" significa que dir está vacío o dirname tiene dos / más espacios juntos.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.