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 / 명령어 / sudo - 다른 사용자 권한으로 명령 실행

Linux / 명령어 / sudo - 다른 사용자 권한으로 명령 실행

Linux sudo 명령어로 허용된 명령을 root 또는 다른 사용자 권한으로 실행하는 방법을 설명합니다. 주요 옵션, 인증 캐시, 리디렉션 문제, visudo와 최소 권한 sudoers 설정 원칙을 정리합니다.

Linux / 명령어 / diff - 텍스트 파일과 디렉터리 차이 비교

Linux / 명령어 / diff - 텍스트 파일과 디렉터리 차이 비교

Linux diff 명령어로 텍스트 파일과 디렉터리의 차이를 비교하는 방법을 설명합니다. unified 형식, 재귀 비교, 공백 무시와 종료 상태를 정리합니다.

Linux 강좌 / 파일과 명령 찾기 - find, locate, which, whereis

Linux 강좌 / 파일과 명령 찾기 - find, locate, which, whereis

find와 locate로 파일을 찾고 which, whereis, type으로 명령의 위치와 해석 방식을 확인합니다. 실시간 검색과 색인 검색의 차이도 짚습니다.

Linux / 명령어 / clear - 터미널 화면 정리

Linux / 명령어 / clear - 터미널 화면 정리

Linux clear 명령어로 터미널 화면을 정리하는 방법을 설명합니다. 스크롤백을 보존하는 -x 옵션과 Ctrl+L·reset·tput의 차이, TERM 오류 해결법을 다룹니다.

Linux / 명령어 / host - 도메인과 IP 주소의 DNS 정보 간단히 조회

Linux / 명령어 / host - 도메인과 IP 주소의 DNS 정보 간단히 조회

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

Linux / 명령어 / dmesg - 커널 메시지와 부팅 로그 확인

Linux / 명령어 / dmesg - 커널 메시지와 부팅 로그 확인

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

Linux / 명령어 / ss - 열린 포트와 소켓 연결 상태 확인

Linux / 명령어 / ss - 열린 포트와 소켓 연결 상태 확인

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

Linux / 명령어 / awk - 필드별 텍스트 분석과 계산

Linux / 명령어 / awk - 필드별 텍스트 분석과 계산

Linux awk 명령어의 기본 문법과 실제 사용 예제를 설명합니다. 주요 옵션과 결과를 해석할 때 주의할 점을 확인할 수 있습니다.

Linux 강좌 / 프로세스 확인·일시정지·종료하기

Linux 강좌 / 프로세스 확인·일시정지·종료하기

ps, top, pgrep으로 프로세스의 상태와 자원 사용량을 확인합니다. 실습 프로세스에 STOP, CONT, TERM을 보내고 셸 작업과 서비스의 차이를 익힙니다.

Linux / 리눅스 Bash 명령어 연결 연산자: ;, &&, ||, &, | 사용법

Linux / 리눅스 Bash 명령어 연결 연산자: ;, &&, ||, &, | 사용법

리눅스 Bash의 ;, &&, ||, &, |, |&, ! 차이를 종료 상태와 실제 예제로 설명합니다. 조건부 실행, 백그라운드 작업, 파이프라인과 pipefail 사용법까지 정리합니다.