скрипт, чтобы найти "отрицать" ACE в ACL и удалить его - PullRequest
2 голосов
/ 29 марта 2012

В моем кластере объемом 100 ТБ мне нужно найти каталоги и файлы, которые имеют «запрещающий» ACE в своем ACL, а затем удалить этот ACE в каждом экземпляре.Я использую следующее:

# find .  -print0 | xargs -0 ls -led | grep deny -B4

и получаю этот вывод (частичный, только для примера)

-r--rw----  1 chris     GroupOne           4096 Mar  6 18:12 ./directoryA/fileX.txt
 OWNER: user:chris
 GROUP: group:GroupOne
 0: user:chris allow file_gen_read,std_write_dac,file_write_attr 
 1: user:chris deny file_write,append,file_write_ext_attr,execute 
--
-r--rwxrwx  1 chris     GroupOne       14728221 Mar  6 18:12 ./directoryA/subdirA/fileZ.txt
 OWNER: user:chris
 GROUP: group:GroupOne
 0: user:chris allow file_gen_read,std_write_dac,file_write_attr 
 1: user:chris deny file_write,append,file_write_ext_attr,execute 
--
 OWNER: user:bob
 GROUP: group:GroupTwo
 0: user:bob allow dir_gen_read,dir_gen_write,dir_gen_execute,std_write_dac,delete_child,object_inherit,container_inherit 
 1: group:GroupTwo allow std_read_dac,std_write_dac,std_synchronize,dir_read_attr,dir_write_attr,object_inherit,container_inherit 
 2: group:GroupTwo deny list,add_file,add_subdir,dir_read_ext_attr,dir_write_ext_attr,traverse,delete_child,object_inherit,container_inherit 
--

Как вы можете видеть, в зависимости от того, где находится "запрещающий" ACEЯ вижу / не вижу путь.Я мог бы увеличить значение -B (я видел до 8 ACE для файла), но тогда я получил бы больше вывода, чтобы извлечь из ...

Что мне нужно сделать, это извлечь $ACENUMBER и $PATHTOFILE, чтобы я мог выполнить эту команду:

chmod -a# $ACENUMBER $PATHTOFILE

Дополнительная проблема заключается в том, что команда поиска (см. выше) дает относительный путь, тогда как мне нужен полный путь.Я полагаю, что это нужно как-то отредактировать.

Любое руководство, как это сделать?

Ответы [ 2 ]

1 голос
/ 29 марта 2012
for x in $(find /mydirectory -mindepth 1); do
    if [ $(ls -led $x | grep deny | wc -l | sed -e 's/^[ \t]*//') -gt 0 ]; then
        chmod -a# "$(ls -led $x | grep deny | cut -d ":" -f 1)" $x;
    fi;
done
1 голос
/ 29 марта 2012

Для второй части вашего вопроса: чтобы вывести абсолютные пути к файлам, укажите в качестве аргумента полный путь, например

      find /my/full/path -print0
...