Linux 강좌 / 파일 권한 읽고 바꾸기와 sudo 사용법

리눅스 파일 권한은 소유 사용자·소유 그룹·그 밖의 사용자에게 읽기(r)·쓰기(w)·실행(x)을 각각 허용할지 결정합니다. sudo는 허가된 사용자가 특정 명령을 다른 사용자(보통 관리자)의 권한으로 실행하는 도구입니다. 파일 접근 문제에서는 먼저 소유권과 권한을 확인하고, 관리자 권한은 필요한 명령에만 사용하세요.

권한을 읽기 전에 사용자와 소유권 확인하기

권한은 파일에만 붙어 있는 독립적인 숫자가 아닙니다. 현재 프로세스의 사용자 ID와 그룹, 대상 파일의 소유 사용자·그룹, 대상까지 이어지는 디렉터리의 권한이 함께 작용합니다. id로 현재 계정을 확인한 다음 ls -l과 stat으로 대상 정보를 확인하세요. 이전 강좌에서 다룬 사용자·그룹·소유권을 먼저 이해하면 권한의 의미를 해석하기 쉽습니다.

id
ls -l notes.txt
stat -c '%A %a %U %G %n' notes.txt

예를 들어 -rw-r----- 1 learner editors ... notes.txt라면 맨 앞의 -는 일반 파일을, 뒤의 세 묶음 rw-·r--·---는 차례로 소유 사용자·소유 그룹·그 밖의 사용자의 권한을 나타냅니다. learner와 editors는 예시 이름이며 실제 결과는 시스템마다 다릅니다. stat의 %a는 640 같은 8진수 권한을 보여 줍니다.

파일과 디렉터리에서 r, w, x는 어떻게 다른가

같은 문자라도 파일과 디렉터리에서 허용하는 동작이 다릅니다. 디렉터리의 권한을 파일 권한과 동일하게 해석하면, 파일에는 읽기 권한이 있는데도 열 수 없는 상황을 이해하기 어렵습니다.

권한 일반 파일 디렉터리
r 내용 읽기 디렉터리 안의 이름 목록 읽기
w 내용 수정 항목 생성·삭제·이름 변경에 필요한 권한
x 실행 가능한 파일을 실행할 수 있게 하는 권한 알고 있는 이름을 따라 디렉터리 안으로 이동·탐색

디렉터리 안의 파일을 열려면 경로에 있는 디렉터리를 통과할 x 권한이 필요합니다. 파일 삭제는 보통 그 파일 자체의 w가 아니라 부모 디렉터리의 w와 x에 좌우됩니다. 다만 스티키 비트, 접근 제어 목록(ACL), 파일 시스템 특성, SELinux 같은 추가 정책이 결과를 제한할 수 있습니다.

chmod로 실습 파일의 권한 바꾸기

다음은 현재 사용자의 홈 디렉터리에 새 실습 폴더와 파일을 만드는 예입니다. 같은 이름의 폴더가 이미 있다면 다른 이름을 고르세요. mkdir 또는 cd가 실패하면 뒤 명령을 계속 실행하지 마세요. printf는 현재 폴더의 notes.txt를 새로 쓰므로 기존 파일이 없는지 먼저 확인해야 합니다.

mkdir ~/linux-course-17-practice
cd ~/linux-course-17-practice
printf 'private notes\n' > notes.txt
ls -l notes.txt
chmod u=rw,g=r,o= notes.txt
stat -c '%A %a %n' notes.txt

u는 소유 사용자, g는 소유 그룹, o는 그 밖의 사용자를 뜻합니다. =는 해당 범주의 권한을 지정한 값으로 설정합니다. 마지막 출력은 일반적인 GNU stat 환경에서 -rw-r----- 640 notes.txt처럼 나옵니다. 파일을 읽을 수 있는 실제 사용자는 계정·그룹 소속과 경로의 권한에 따라 달라집니다.

숫자 표기에서는 r=4, w=2, x=1을 범주마다 더합니다. 따라서 640은 rw-·r--·---에 해당합니다. 아래 명령은 소유 사용자만 읽고 쓸 수 있는 600으로 바꿉니다. 명령에 성공하면 stat 결과의 숫자가 600인지 확인하세요.

chmod 600 notes.txt
stat -c '%A %a %n' notes.txt

기호식 chmod g+r notes.txt는 현재 권한에서 그룹 읽기만 추가합니다. 반대로 chmod o-rwx notes.txt는 다른 사용자의 세 권한을 제거합니다. 기존 권한을 모두 다시 지정할지(=), 일부만 더하거나 뺄지(+, -)를 의식해서 선택하세요.

디렉터리 권한을 따로 확인하기

개인용 디렉터리를 만들었다면 소유 사용자만 목록을 보고 통과·수정할 수 있도록 700을 설정할 수 있습니다. 다음은 방금 만든 실습 폴더 안에서만 실행하세요.

mkdir private
chmod 700 private
ls -ld private
stat -c '%A %a %n' private

출력은 보통 drwx------ 700 private처럼 표시됩니다. ls -ld의 -d는 디렉터리 내부 목록이 아니라 디렉터리 자체의 권한을 보여 줍니다. 디렉터리의 x를 실수로 제거하면 소유자라도 그 안의 파일에 접근하기 어려울 수 있습니다. 무턱대고 chmod -R로 전체 트리에 동일한 숫자를 적용하면 일반 파일과 디렉터리의 필요한 x가 다르다는 점을 놓치기 쉽습니다.

sudo는 언제, 어떻게 사용하나

sudo는 현재 계정에 허용된 정책에 따라 한 명령을 다른 사용자 권한으로 실행합니다. 모든 계정에 관리자 권한이 있는 것은 아니며, 허용 범위는 시스템의 sudo 정책에 달려 있습니다. 아래의 sudo -l은 현재 계정에 허용된 명령을 조회하며 인증을 요구할 수 있습니다. 관리자 권한이 없는 환경에서는 거부 메시지가 정상적인 결과일 수 있습니다.

sudo -l

필요할 때 sudo 명령어 형태로 정확한 명령에만 권한을 부여하세요. 예컨대 다른 사용자가 소유한 파일의 내용을 읽으려고 무조건 권한을 열어 두기보다, 먼저 파일·디렉터리 권한과 업무상 필요한 접근 범위를 확인해야 합니다. sudo는 파일의 소유권을 영구히 바꾸는 명령이 아닙니다. 반대로 sudo로 만든 파일은 관리자 소유가 될 수 있으므로 현재 디렉터리에 어떤 파일이 생기는지도 확인하세요.

셸의 출력 리디렉션은 sudo보다 먼저 현재 셸에서 처리할 수 있습니다. 그래서 sudo echo ... > 보호된파일이 기대대로 동작하지 않는 경우가 있습니다. 설정 파일을 고쳐야 한다면 해당 명령을 무리하게 조합하기보다 sudoedit 같은 적절한 편집 방식을 검토하세요. sudo 정책 파일은 일반 편집기로 직접 손대지 말고 문법 검사를 제공하는 visudo를 사용해야 접근을 잃을 위험을 줄일 수 있습니다.

권한 오류를 진단하는 순서

  1. id로 현재 세션의 사용자와 그룹을 확인합니다. 계정의 그룹을 변경했다면 현재 로그인 세션에 반영됐는지도 확인합니다.
  2. ls -l 또는 stat으로 대상의 소유권과 권한을 확인합니다. 디렉터리 자체는 ls -ld로 봅니다.
  3. 대상 파일뿐 아니라 경로에 있는 각 부모 디렉터리에 통과 권한이 있는지 확인합니다. GNU 환경에서는 namei -l 경로가 경로 구성 요소를 보는 데 유용합니다.
  4. 기본 권한으로 설명되지 않으면 ACL, SELinux, 읽기 전용 마운트, 스티키 비트 같은 추가 제한을 확인합니다. 오류를 없애려고 chmod 777을 먼저 실행하지 않습니다.
  5. 허용 범위가 명확해진 다음 가장 작은 변경을 적용하고, 원래 의도한 사용자로 다시 접근을 확인합니다.

실습이 끝났다면 먼저 현재 위치가 실습 폴더인지 pwd로 확인하세요. 실습 파일을 계속 사용할 필요가 없다면 나중에 폴더를 정리해도 됩니다. 운영 데이터나 다른 사용자의 파일을 이 실습의 chmod 대상으로 삼지 마세요.

공식 문서

GNU Coreutils의 권한 구조 설명과 권한 설정 설명에서 표기법과 동작을 확인할 수 있습니다. 관리자 권한 정책과 안전한 편집 방법은 sudoers(5) 매뉴얼을 참고하세요.

같은 카테고리의 다른 글
Linux / 명령어 / lsblk - 디스크·파티션 구조와 마운트 지점 확인

Linux / 명령어 / lsblk - 디스크·파티션 구조와 마운트 지점 확인

Linux lsblk 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / df - 파일 시스템의 남은 용량 확인

Linux / 명령어 / df - 파일 시스템의 남은 용량 확인

Linux df 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / blkid - 블록 장치 UUID와 파일 시스템 형식 조회

Linux / 명령어 / blkid - 블록 장치 UUID와 파일 시스템 형식 조회

Linux blkid 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / shred - 파일 데이터 덮어쓰기

Linux / 명령어 / shred - 파일 데이터 덮어쓰기

Linux shred 명령어로 파일이나 장치의 데이터를 덮어쓰는 방법과 한계를 설명합니다. SSD, 저널링·복사 방식 파일 시스템, 스냅샷 환경에서 완전 삭제를 보장할 수 없는 이유도 알아봅니다.

Linux / 명령어 / ls - 파일과 디렉터리 목록 확인

Linux / 명령어 / ls - 파일과 디렉터리 목록 확인

Linux ls 명령어로 파일과 디렉터리 목록, 숨김 파일, 권한과 소유자, 크기 및 수정 시간을 확인하는 방법을 설명합니다. 자주 쓰는 옵션 조합과 정렬 방법, 스크립트에서 ls 출력을 안전하게 다루는 기준도 정리합니다.

Linux / 명령어 / mount - 파일 시스템 연결 상태 확인과 마운트

Linux / 명령어 / mount - 파일 시스템 연결 상태 확인과 마운트

Linux mount 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / nc - TCP·UDP 연결과 포트 점검

Linux / 명령어 / nc - TCP·UDP 연결과 포트 점검

Linux nc 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / ping - 호스트 응답과 왕복 시간 확인

Linux / 명령어 / ping - 호스트 응답과 왕복 시간 확인

Linux ping 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / umount - 파일 시스템을 안전하게 분리

Linux / 명령어 / umount - 파일 시스템을 안전하게 분리

Linux umount 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / head - 파일 앞부분의 줄과 바이트 출력

Linux / 명령어 / head - 파일 앞부분의 줄과 바이트 출력

Linux head 명령어로 파일의 처음 몇 줄이나 바이트를 출력하는 방법을 설명합니다. 여러 파일, 음수 개수, 파이프 활용과 바이너리 데이터 주의점도 정리합니다.