리눅스는 다중 사용자 운영체제이기 때문에, 승인된 프로세스와 사용자만 각종 디렉터리와 파일에 접근할 수 있도록 파일 권한을 설정하고 관리하는 메커니즘을 갖추고 있습니다. 리눅스를 사용하다 보면 “Permission denied(권한 거부됨)” 오류 때문에 파일이나 디렉터리를 편집하지 못하는 상황을 자주 만나게 되는데, 이는 필요한 권한이 없다는 뜻입니다. 이 튜토리얼에서는 리눅스에서 파일 권한을 재귀적으로 변경해 하위 폴더와 파일까지 권한 설정이 적용되도록 하는 방법을 소개합니다.
리눅스에서 파일 권한 확인하기
파일이나 디렉터리 작업 중 “permission denied” 오류가 발생했다면, 먼저 사용자(user), 그룹(group), 기타(other)에 할당된 권한부터 확인해야 합니다.
이때 ls -l 명령어를 사용하면 됩니다. 예를 들어 “/var” 디렉터리에 있는 여러 파일과 디렉터리의 권한은 다음과 같이 표시됩니다.
위 출력 결과에는 다음과 같은 정보가 담겨 있습니다.
- 첫 번째 열은 파일과 디렉터리의 권한을 나타냅니다. 이 열의 첫 글자는 항목의 유형을 의미하는데,
d는 디렉터리,l은 심볼릭 링크,-는 일반 파일을 뜻합니다. - 나머지 아홉 글자는 세 글자씩 묶인 세 그룹으로 구성되며, 각각 소유자(
u), 그룹(g), 기타 사용자(o)에 대한 권한을 나타냅니다.r은 읽기(read),w는 쓰기(write),x는 실행(execute) 권한을 의미합니다.
작업 중인 디렉터리나 파일의 권한을 파악했다면 이제 손쉽게 변경할 수 있습니다.
chmod 명령어로 파일 권한 변경하기
chmod 명령어는 리눅스에서 파일 권한을 변경하는 가장 간단한 방법입니다. 명령어의 기본 문법은 다음과 같습니다.
chmod {대상}{연산자}{모드}
- 대상: 권한을 부여받을 사용자, 그룹, 소유자 또는 전체(all)를 나타냅니다.
- 연산자: 권한을 어떻게 적용할지 지정합니다.
+는 권한 추가,-는 권한 제거,=는 설정할 권한을 명시합니다. - 모드: 설정할 권한의 종류를 뜻합니다.
r(읽기),w(쓰기),x(실행).
예를 들어 “/var” 디렉터리의 backups 디렉터리에 대해 모든 사용자의 쓰기 권한을 제거하려면 다음 명령어를 사용합니다.
sudo chmod -w /var/backups
chmod 명령어로 권한을 변경하는 방식은 효과적이지만, 지정한 디렉터리나 파일 하나에만 적용된다는 한계가 있습니다.
다행히 chmod 명령어에 재귀(recursive) 옵션 -R을 사용하면 해당 디렉터리는 물론 그 안의 하위 디렉터리와 파일까지 한 번에 처리할 수 있습니다.
예를 들어 “/var/backups” 디렉터리와 그 안의 모든 파일, 하위 디렉터리에서 읽기 권한을 재귀적으로 제거해 보겠습니다. 현재 권한은 다음과 같습니다.
drwxrwxrwx 2 root root 4096 Jul 15 06:25 backups
이제 chmod를 재귀적으로 실행해 권한을 변경합니다.
sudo chmod -R a-r /var/backups
파일 권한이 변경된 것을 확인할 수 있습니다.
find 명령어로 재귀적으로 권한 변경하기
일반적으로 파일과 디렉터리에 똑같은 권한을 일괄 설정하는 것은 바람직하지 않습니다. 디렉터리에 진입(cd)하려면 실행 권한이 필요하지만, 대부분의 파일에는 실행 권한이 필요 없기 때문입니다.
이런 경우 리눅스의 find 유틸리티를 활용하면 좋습니다. find를 사용하면 특정 파일이나 디렉터리만 골라내어 해당 항목에만 권한을 설정할 수 있습니다.
여기서는 “/var/log” 디렉터리를 예로 들어 보겠습니다. 이 디렉터리에는 파일과 디렉터리가 섞여 있습니다.
파일에만 특정 권한을 설정하려면 find 명령어에 -type f 옵션을 붙이면 됩니다.
명령 예시는 다음과 같습니다.
sudo find /var/log/ -type f -exec chmod 777 {} ;
위 예제에서는 find 명령어로 “/var/log” 디렉터리에서 파일만 검색한 뒤, 사용자·그룹·전체에 읽기, 쓰기, 실행 권한을 부여했습니다.
디렉터리에도 같은 방식을 적용할 수 있습니다. 이때는 -type d 옵션을 지정해 디렉터리만 찾으면 됩니다.
예를 들면 다음과 같습니다.
sudo find /var/log/ -type d -exec chmod 755 {} ;
위 예제에서는 파일과 디렉터리 모두가 아니라 디렉터리에만 755 권한을 설정했습니다.
ls -la 명령어로 결과를 확인해 볼 수 있습니다.
모든 파일에는 777 권한이, 디렉터리에는 755 권한이 적용된 것을 볼 수 있습니다.
마무리
리눅스에서 파일 권한을 변경하는 방법을 아는 것은 필수적인 기술입니다. 무단 접근이나 파일·디렉터리 변조를 막는 데 큰 도움이 되기 때문입니다. 나아가 파일 소유권을 변경해 접근을 제한하거나, ACL(접근 제어 목록)을 활용하면 더욱 세밀하게 파일 권한을 관리할 수도 있습니다.