Sauvegarder et restaurer les autorisations de fichiers

17

Existe-t-il un moyen de sauvegarder et de restaurer la propriété et les autorisations des fichiers (les choses qui peuvent être modifiées avec chownet chmod)?

Vous pouvez le faire dans Windows en utilisant icacls .

Qu'en est-il des listes de contrôle d'accès?

leeand00
la source
Il serait utile que vous indiquiez la distribution que vous utilisez, car différentes distributions utilisent différents gestionnaires de packages.
garethTheRed
@garethTheRed, cela dépend-il aussi du fs utilisé, ou juste de la distribution?
leeand00
1
Je doute que cela dépende du système de fichiers.
garethTheRed
Jusqu'à présent, il n'y a pas de réponse parfaite.
kittygirl

Réponses:

24

Vous pouvez le faire avec les commandes du package acl (qui devraient être disponibles sur toutes les distributions grand public, mais qui pourraient ne pas faire partie de l'installation de base). Ils sauvegardent et restaurent l'ACL lorsque l'ACL est présent, mais ils fonctionnent également pour les autorisations de base même sur les systèmes qui ne prennent pas en charge l'ACL.

Pour sauvegarder récursivement les autorisations dans le répertoire en cours et ses sous-répertoires:

getfacl -R . >permissions.facl

Pour restaurer les autorisations:

setfacl --restore=permissions.facl
Gilles 'SO- arrête d'être méchant'
la source
Hmm. J'ai vraiment besoin de lire sur les ACL.
roaima
1
Dans le fichier généré, sont-ils également relatifs à un répertoire?
leeand00
2
@ leeand00 Oui, le fichier généré utilise toujours des noms de fichiers relatifs.
Gilles 'SO- arrête d'être méchant'
@ Gilles, basé sur les fichiers unix.stackexchange.com/questions/364517/… setfacl ne peut alors chmodplus, peut-être provoquera un conflit?
kittygirl
1
@kittygirl Je n'ai aucune idée de ce que vous demandez. Que signifie «les fichiers setfacl ne peuvent plus chmod»? Qu'est-ce que cela a à voir avec unix.stackexchange.com/questions/364517/… ? Quel conflit?
Gilles 'SO- arrête d'être méchant'
2

Je ne suis au courant de rien "sur étagère" qui pourrait faire cela. Voici un script de démarrage pour vous, qui gérera les autorisations de base. Il ne gère aucune liste de contrôle d'accès, quelle que soit sa description, mais votre question les exclut explicitement. (Il échouera également sur les noms de fichiers pathologiques - ceux commençant par un espace ou contenant des caractères non imprimables.)

Enregistrez les autorisations

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

Restaurer les autorisations

while read PERMS OWNER GROUP FILE
do
    chmod "$PERMS" "$FILE"
    chown "${OWNER}:${GROUP}" "$FILE"
done </tmp/save-the-list
roaima
la source
voulez-vous dire que ACL échouera également sur les noms de fichiers pathologiques?
kittygirl
@kittygirl Je n'ai inclus aucun traitement des ACL dans le scriptlet car l'OP les avait explicitement exclus des exigences. Vous pouvez ajouter ce que vous aimez, en gardant à l'esprit que le code n'est pas particulièrement robuste (voir le commentaire décrivant les noms de fichiers pathologiques).
roaima
J'ai trouvé un problème: impossible de trouver .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

Ce script bash obtient les répertoires acl uniquement (dans mon cas, les fichiers acls = dir (parent) acl) Après l'exécution du script, crée un autre "recovery_acl.sh".

Lors de la récupération d'erreurs comme «Aucun fichier ou répertoire de ce type» signifie que dir est vide ou dirname contient deux espaces ou plus ensemble.

Terentev Maksim
la source