설정하지 않을 때 쓰기를 허용하는 chmod

설정하지 않을 때 쓰기를 허용하는 chmod

권한을 체계적으로 변경하는 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기능을 사용하여 올바른 순회 순서를 얻으세요.

두 번의 순회를 수행하는 것은 의미가 없는 것 같습니다. 대신, 단일 순회를 수행하고 파일 권한을 원하는 대로 직접 설정하십시오 chmod 0750. 를 사용하면 File::Find디렉토리와 일반 파일을 다르게 처리할 수 있는 유연성이 향상됩니다.

관련 정보