권한을 체계적으로 변경하는 Perl 스크립트가 있습니다. 이 스크립트가 수행하는 첫 번째 작업은 모든 권한을 제거하는 것입니다. 이는 chmod
(perl에서) 호출을 통해 수행됩니다. 나는 설정된 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
올바른 순회 순서를 얻으려면 이 기능을 사용하십시오 .
2번의 패스를 하는 것은 의미가 없는 것 같습니다. 대신, 통과를 수행하고 파일 권한을 원하는 대로 직접 설정하십시오(예: chmod 0750
권한이 무엇이든). 를 사용하면 File::Find
디렉터리와 일반 파일을 다르게 처리하는 등 더 많은 유연성을 얻을 수 있습니다.