chmod разрешает запись, когда я не устанавливаю его

chmod разрешает запись, когда я не устанавливаю его

У меня есть скрипт perl, который систематически изменяет разрешения. Первое, что делает скрипт, это удаляет все разрешения. Он делает это, вызывая chmod(из perl). Я сделал это, поскольку обнаружил, что бит set guid не очищается, пока я явно не очистил его:

system('find',
        $topdir,
        '-exec', 'chmod', 'u-swrx,g-swrx,o-swrx', '{}', ';'
);

Я устанавливаю разные разрешения для групп и каталогов. Используя find, я вызываю его из perl следующим образом (в данном случае для каталогов):

system(
    'find',
    $topdir,
    '-type', 'd',
    '-exec', 'chmod', 'g=rx', '{}', ';'
  );

Теперь, хотя я установил только rx, когда я проверяю права доступа к файлам после завершения выполнения скрипта, скрипты, похоже, имеют rwx. Есть ли что-то, на что мне следует обратить внимание, так как я не совсем понимаю, почему это происходит; я нигде явно не устанавливаю это. Я также устанавливаю ACL, но все они ведут себя так, как и ожидалось. Единственное, что я замечаю, когда проверяю с помощью getfacl, это mask::rwxи default:mask::rwx. Может ли это быть причиной проблемы?

решение1

Посмотрите на вывод ошибок: вы должны увидеть find: `…' Permission deniedошибки. Первое, что вы делаете, это удаляете все разрешения на доступ из $topdir, что предотвращает дальнейшую рекурсию в него. Ни одна из chmodожидаемых вами команд не выполняется, за исключением самой первой.

Если вы хотите удалить разрешение на доступ ко всем каталогам в дереве, вам нужно сделать это изнутри наружу. В противном случае, как только вы отрежете себя от родительского каталога, вы больше не сможете рекурсивно зайти в него.

system('find',
        $topdir,
        '-depth',
        '-exec', 'chmod', 'u-swrx,g-swrx,o-swrx', '{}', ';'
);

Поскольку вы используете Perl, используйтеFile::Findвместо вызова внешней программы find. Используйте finddepthфункцию, чтобы получить правильный порядок обхода.

Кажется бессмысленным делать два обхода. Вместо этого сделайте один обход и напрямую установите разрешения файла на то, что вам нужно, например, chmod 0750или на то, что должно быть. Использование File::Findдаст вам большую гибкость, например, для обработки каталогов и обычных файлов по-разному.

Связанный контент