#!/usr/bin/perl -w use strict; use File::Find; my ($test, $dir, $db, $pwd, $tmp); $db="/home/user/cgi/xxx.dat"; ################### #program section # ################### &exc(); #read exceptions unlink $db if !-z $db and $ARGV[0] eq 'r'; #стираем файл старой базы при команде r в случае если он ненулевого размера find \&read => "$dir" if $ARGV[0] eq 'r'; #начать сканировать поддиректории если с командной строки пришло r rewrite() if $ARGV[0] eq 'w'; #начать восстанавливать права на файлы, если с командной строки пришло w ################## #subroutines # ################## sub read {#чтение прав $test=sprintf "%04o" => (stat($File::Find::name))[2] & 07777; #получить права на файл ли директорию &readchmod("$File::Find::name\t$test\n"); #вызов подпрограммы для записи базы } sub readchmod{#запись прав open F, ">>$db" or die "Can't open $db: $!"; print F $_[0]; print "$_[0]"; #смотрим, что записывается close F; } sub rewrite{#перезапись прав open F, "<$db" or die "Can't open $db: $!"; while(Если нашли a lot of bugs - пишите.){ chop; #читаем построчно в $_ и отъедаем от него перевод каретки my ($file, $chmod) = split /\t/; qx [chmod $chmod $file]; #даем системную команду chmod print "$chmod\t=>\t$file\n"; #смотрим, что делает программа } close F; } sub exc{ do{print "Type './chmod.pl ?' or './chmod.pl h'\n"; exit 0} if $#ARGV==-1;#обрабатываем пустой ввод вида ./chmod.pl do {print "Your command must be 'w', 'r', 'h' or '?'!\n"; exit 0} if $ARGV[0]!~m%^[wr?h]$% and $#ARGV!=-1; #обрабатываем все остальные буквы, кроме необходимых do{ print qq~ Программа создает базку пермишнов на файлы и директории на случай экстренных ситуаций вроде неправильного или случайного использования команды chmod -R 777 из корневой директории. chmod.pl [w|r|h|?] [/полный/путь/до/директории] Для указания директории, от которой будет создаваться база пермишнов, нужно ввести команду "r /path/you/dir" Для создания базы на права для файлов и дирректорий Вы должны ввести "r". Для восстановления прав на файлы и директории вы должны ввести команду "w". Справка по командам "?" или "h". Второй аргумент должен быть полным путем к директории, от которой нужно начинать рекурсивно сохранять права. По умолчанию стоит текущая директория. Например если Вы запустили программу из корневой директории, то текущей директорией начала просмотра подкаталогов будет считаться корневая директория, если в файле /home/user/.shrc внесена переменная окружения $ENV{PWD}. ~; exit 0} if $ARGV[0]=~m!^[?h]$!; #выводим хелп if($ARGV[1] eq ''){#есл не ввели второго аргумента в командной строке #то определяем переменную $dir #while(my ($k, $v)=each %ENV){print "$k\t=>\t$v\n"} #смотрим, что содержит переменная окружения, #содержащаяся в /home/user/.shrc $dir=$ENV{PWD}; #определяем директорию запуска скрипта, чтобы с этой точки начать #поход по поддиректориям } else { -d $ARGV[1] or die "$!";#если то, что пришло вторым аргументом #директория, то идем дальше, иначе читаем #ошибку $dir=$ARGV[1]; } return 1; }