Dans un souci de sécurisation, j'ai voulu faire différents essais sur les permissions de mon systeme.
Il me fallait un moyen simple pour pouvoir revenir en arrière et je n'ai pas assez de Go libres pour pouvoir tout sauver…
J'ai donc eu l'idée de ce script, il necessite uniquement une version convenable de perl.

Son utilisation :

# ./getrights > perms

(tapez ENTER une fois le programme executé) Cela enregistre les droits et les utilisateurs pour le répertoire '/' récursivement dans “perms”,
regardez le début du script pour changer qques variables (pour ne pas TOUT sauvegarder par exemple).
Sur mon systeme, 600ko son suffisant pour tout enregistrer.

# ./getrights < perms

Restaure les droits/utilisateurs/groupes pour tous les fichiers ki ont été placés dans “perms”

Voici le script :

#!/usr/bin/perl -W
#
# small tool to backup files & directories permissions
# by fab <fab@gcu.info>
#
# HOWTO:
# - backup
#   ./getrights.pl > owns
#   (after the program is run, press ENTER)
#   This store informations in the file "owns"
# - restore
#   ./getrights.pl < owns
#   This will restore informations contained in the file "owns"  
#
use strict;
use File::Find;
my $DIR='/';
my $SEP=' = ';
my $KEY='BACK';
my $DEBUG=1;
 
my($dev,$ino,$mode,$nlink,$uid,$gid);
$_=<>;
chomp;
/$KEY/?&undo():&list();
 
sub nouveau {
    if(not scalar(stat)) {
        print STDERR "Error with $File::Find::name. (maybe not a real file)\n";
        return;
    }
    ($dev,$ino,$mode,$nlink,$uid,$gid)=stat;
    printf "%o", ($mode&07000)>>9; # spe
    printf "%o", ($mode&00700)>>6; # usr
    printf "%o", ($mode&00070)>>3; # grp
    printf "%o", ($mode&00007); # others
    my $rmode=sprintf("%o",$mode&00777);
    print ($SEP,$uid,$SEP,$gid,$SEP,$File::Find::name,"\n");
}
 
sub list {
    print "$KEY\n";
    my $File=find({wanted=>\&nouveau},$DIR);
}
 
sub undo {
    my $cnt=0;
    while(<>) {
        chomp;
        /^([0-9]{4})$SEP([0-9]+)$SEP([0-9]+)$SEP(.*)$/;
        ($mode,$uid,$gid,$dev)=($1,$2,$3,$4);
        print "$1\n" if($dev=~/^\/(\w+)\/$/);
        print ".";
        $cnt++;
        if($cnt>70) {
            $cnt=0;
            print "\n";
        }
        if(not $DEBUG) {
            chown $uid,$dev;
            chown $uid,$gid,$dev;
            chmod oct($mode),$dev;
        }
    }
    print "\n";
}
unix/bkp_permissions.txt · Last modified: 2010/01/12 13:29 (external edit)