Linux 강좌 / 사용자·그룹과 파일 소유권 이해하기

리눅스는 사용자에게 UID(사용자 ID), 그룹에 GID(그룹 ID)를 부여하고, 파일에는 소유 사용자와 소유 그룹을 기록합니다. 계정에는 기본 그룹과 추가 그룹이 있을 수 있습니다. 현재 계정과 파일 소유권을 확인할 때는 id, groups, getent, ls -l을 사용합니다. 이 강좌는 소유권을 바꾸지 않고, 표시된 정보를 정확히 읽는 데 집중합니다.

사용자 ID와 그룹 ID의 의미

사람이 보는 learner 같은 계정 이름과 시스템이 사용하는 숫자 UID는 대응 관계에 있습니다. 그룹도 이름과 숫자 GID를 가집니다. 사용자의 기본 그룹은 계정 정보에 지정된 대표 그룹이고, 추가 그룹은 별도로 가입한 그룹입니다. 실제 권한 판단에는 소유 사용자·그룹과 파일의 권한 비트 등이 함께 사용됩니다. 그룹에 속한다는 사실만으로 모든 그룹 파일을 읽거나 수정할 수 있는 것은 아닙니다.

root는 일반적으로 UID 0인 관리자 계정입니다. 일반 계정의 UID와 GID가 반드시 1000부터 시작한다고 가정하지 마세요. 시스템과 계정 생성 정책에 따라 값이 다릅니다.

현재 세션의 사용자와 그룹 확인하기

다음 명령은 일반 사용자로 실행할 수 있으며 계정을 변경하지 않습니다. id는 현재 사용자·기본 그룹·참여 그룹의 이름과 숫자 ID를 보여 줍니다. id -un은 사용자 이름, id -gn은 기본 그룹 이름, id -nG는 참여 그룹 이름을 출력합니다.

id
id -un
id -gn
id -nG
groups

예를 들어 id 결과에 uid=1000(learner) gid=1000(learner) groups=1000(learner),10(wheel)처럼 표시될 수 있습니다. 이는 설명용 예시이며 실제 이름·숫자·그룹은 시스템마다 다릅니다. gid=...는 기본 그룹, groups=...는 현재 세션에 적용된 그룹 목록입니다.

groups도 현재 세션의 그룹 이름을 간단히 확인합니다. 관리자가 방금 그룹 소속을 바꿨다면 이미 열린 로그인 세션의 그룹 목록은 곧바로 달라지지 않을 수 있습니다. 사용자 데이터베이스의 설정과 현재 프로세스에 적용된 그룹을 구별하세요.

getent로 계정 데이터 조회하기

getent는 시스템의 Name Service Switch(NSS)가 사용하는 계정·그룹 데이터베이스를 조회합니다. 환경에 따라 로컬 파일뿐 아니라 외부 디렉터리 서비스가 결과에 포함될 수 있으므로, /etc/passwd만 직접 읽는 것보다 실제 이름 조회 방식을 잘 반영할 수 있습니다. 다음 예제는 현재 사용자와 기본 그룹을 조회합니다.

getent passwd "$(id -un)"
getent group "$(id -gn)"

getent passwd의 한 줄은 보통 이름, 암호 자리표시자, UID, 기본 GID, 설명, 홈 디렉터리, 로그인 셸을 콜론으로 구분합니다. 암호 자체가 그 줄에 평문으로 표시된다는 뜻은 아닙니다. getent group은 그룹 이름과 GID 등을 보여 줍니다. 그룹 항목의 구성원 목록만 보고 기본 그룹을 사용하는 사용자를 모두 알 수는 없으므로, 사용자의 실제 그룹은 id로 확인하는 편이 좋습니다.

최소 설치 환경에는 getent가 없을 수도 있습니다. 그때는 설치된 libc·배포판의 조회 도구를 확인하세요. 계정 정보를 바꾸려고 /etc/passwd나 /etc/group을 임의로 직접 편집하지 마세요.

파일의 소유 사용자와 그룹 읽기

실습 파일을 만들어 소유권을 확인해 봅니다. ~/linux-course-16-practice가 이미 있다면 다른 이름을 정하고, mkdir가 실패하면 뒤의 명령을 실행하지 마세요. touch는 기존 파일에 실행하면 시각을 바꿀 수 있습니다.

mkdir ~/linux-course-16-practice
cd ~/linux-course-16-practice
pwd
touch own.txt
ls -l own.txt

ls -l의 출력에서 권한과 링크 수 다음에 나오는 두 이름이 일반적으로 소유 사용자와 소유 그룹입니다. 새 파일은 보통 현재 사용자가 소유하지만 그룹 선택은 부모 디렉터리의 설정과 파일 시스템 동작에 영향을 받을 수 있으므로, 기본 그룹과 같다고 무조건 단정하지 마세요. 크기와 시각도 환경에 따라 다릅니다.

GNU stat으로 이름과 숫자 ID를 한 줄에 뽑아 비교할 수도 있습니다. %U/%G는 소유 사용자·그룹 이름, %u/%g는 해당 숫자 ID입니다.

stat -c '%U | %G | %u | %g | %n' own.txt

예를 들어 learner | learner | 1000 | 1000 | own.txt처럼 나올 수 있지만, 실제 값을 확인해야 합니다. 소유권은 ‘누가 소유하는가’를 기록하고 권한은 ‘무엇을 할 수 있는가’를 결정하는 별도 정보입니다. 파일 소유자를 바꾸는 chown은 시스템과 데이터에 영향을 주므로 이 읽기 전용 실습에서는 실행하지 않습니다.

헷갈리기 쉬운 세 가지 구분

  • 사용자 이름과 UID: 이름은 표시·조회용이고 파일 시스템은 숫자 ID도 사용합니다.
  • 기본 그룹과 추가 그룹: 계정의 기본 그룹 하나와 현재 세션의 여러 그룹을 구분합니다.
  • 계정 데이터와 현재 세션: 데이터베이스를 바꿔도 이미 열린 세션의 그룹 목록은 달라지지 않을 수 있습니다.

권한 문제를 만났을 때는 먼저 id로 현재 세션의 사용자·그룹을 확인하고, ls -l이나 stat으로 대상 파일의 소유권을 확인하세요. 두 결과가 서로 어떻게 맞물리는지 본 뒤 권한 설정을 조사해야 원인을 좁힐 수 있습니다.

공식 문서

GNU Coreutils 매뉴얼은 id·groups·ls·stat을, getent(1) 매뉴얼과 nsswitch.conf(5) 매뉴얼은 계정 정보의 조회 경로를 설명합니다.

같은 카테고리의 다른 글
Linux / 명령어 / command - 명령어 검색과 별칭 우회 실행

Linux / 명령어 / command - 명령어 검색과 별칭 우회 실행

셸 command 명령어로 함수 검색을 건너뛰어 원래 명령을 실행하고, command -v로 명령 존재 여부를 확인하는 방법을 설명합니다. -p·-V 옵션과 builtin·exec·env의 차이도 정리합니다.

Linux 강좌 / 사용자·그룹과 파일 소유권 이해하기

Linux 강좌 / 사용자·그룹과 파일 소유권 이해하기

UID, GID, 기본·추가 그룹과 파일 소유권의 의미를 설명합니다. id, groups, getent, ls, stat으로 현재 계정과 파일의 소유 정보를 안전하게 확인합니다.

Linux / 명령어 / chmod - 파일·디렉터리 접근 권한 변경

Linux / 명령어 / chmod - 파일·디렉터리 접근 권한 변경

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

Linux / 명령어 / w - 로그인 사용자와 실행 중인 작업 확인

Linux / 명령어 / w - 로그인 사용자와 실행 중인 작업 확인

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

Linux / 명령어 / time - 명령 실행 시간 측정

Linux / 명령어 / time - 명령 실행 시간 측정

Linux time 명령어로 명령과 파이프라인의 실행 시간 및 자원 사용량을 측정하는 방법을 설명합니다. Bash 예약어와 GNU /usr/bin/time의 차이, 출력 저장과 정확한 비교 방법을 정리합니다.

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

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

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

Linux / 명령어 / locate - 파일 이름 색인에서 빠르게 경로 검색

Linux / 명령어 / locate - 파일 이름 색인에서 빠르게 경로 검색

Linux locate 명령어로 파일 이름 색인을 빠르게 검색하는 방법을 설명합니다. updatedb, 최신성 한계, 패턴과 정규 표현식, find와의 차이를 정리합니다.

Linux / 명령어 / su - 사용자 계정 전환

Linux / 명령어 / su - 사용자 계정 전환

Linux su 명령어로 다른 사용자 권한의 셸과 단일 명령을 실행하는 방법을 설명합니다. su와 su --login 차이, 환경 변수, PAM 인증, sudo·runuser 선택 기준과 보안 주의사항을 정리합니다.

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

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

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

Linux / 명령어 / whatis - 명령어의 한 줄 설명 확인

Linux / 명령어 / whatis - 명령어의 한 줄 설명 확인

whatis 명령어로 매뉴얼 페이지의 한 줄 설명과 섹션을 확인하는 방법을 설명합니다. 정규 표현식·와일드카드 검색, apropos·type과의 차이 및 색인 문제 해결법을 정리합니다.