C'è un modo per eseguire il backup e ripristinare la proprietà e le autorizzazioni dei file (le cose che possono essere cambiate con chown
e chmod
)?
Puoi farlo in Windows usando icacls .
Che dire delle liste di controllo degli accessi?
C'è un modo per eseguire il backup e ripristinare la proprietà e le autorizzazioni dei file (le cose che possono essere cambiate con chown
e chmod
)?
Puoi farlo in Windows usando icacls .
Che dire delle liste di controllo degli accessi?
Risposte:
Puoi farlo con i comandi dal pacchetto acl (che dovrebbe essere disponibile su tutte le distribuzioni tradizionali, ma potrebbe non far parte dell'installazione di base). Eseguono il backup e ripristinano ACL quando sono presenti ACL, ma funzionano anche con autorizzazioni di base anche su sistemi che non supportano ACL.
Per eseguire il backup delle autorizzazioni nella directory corrente e nelle sue sottodirectory in modo ricorsivo:
getfacl -R . >permissions.facl
Per ripristinare le autorizzazioni:
setfacl --restore=permissions.facl
setfacl
, quindi non è chmod
più possibile, forse causerà conflitto?
Non sono a conoscenza di nulla di "pronto all'uso" che possa fare questo. Ecco uno script iniziale per te che gestirà le autorizzazioni di base. Non gestisce ACL di nessuna descrizione, ma la tua Domanda li esclude esplicitamente. (Fallirà anche su nomi di file patologici - quelli che iniziano con spazi bianchi o che contengono caratteri non stampabili.)
Salva le autorizzazioni
find * -depth -exec stat --format '%a %u %g %n' {} + >/tmp/save-the-list
Ripristina le autorizzazioni
while read PERMS OWNER GROUP FILE
do
chmod "$PERMS" "$FILE"
chown "${OWNER}:${GROUP}" "$FILE"
done </tmp/save-the-list
.htaccess
, gitignore
...
#!/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
Questo script bash ottiene acl solo dirs (nel mio caso file acls = dir (parent) acl) Dopo l'esecuzione dello script, verrà creato un altro "recovery_acl.sh".
Durante il ripristino di errori come "Nessun file o directory" significa che dir è vuoto o dirname ha due / più spazi insieme.