리눅스 chown 명령어 사용법 - 파일 소유자와 그룹 변경 정리
이 명령어를 언제 쓰는가
root로 압축을 풀었더니 애플리케이션 계정이 그 파일을 못 쓰거나, nginx가 로그 파일에 Permission denied를 남기거나, 백업본을 복원했더니 소유자가 숫자(예: 1001)로 보이는 상황에서 쓴다.
chown은 파일의 소유자와 그룹을 바꾼다. 권한 문제가 생겼을 때 chmod로 권한을 열기 전에 먼저 확인해야 하는 것이 소유자다.
기본 형식
chown [옵션] 사용자[:그룹] 파일...
- 사용자 — 이름(
deploy) 또는 UID 숫자(1001). - :그룹 — 생략하면 그룹은 그대로 둔다.
:그룹만 쓰면 그룹만 바꾼다. 사용자:처럼 콜론 뒤를 비우면 그 사용자의 기본 그룹으로 맞춘다.
일반 사용자는 자기 파일이라도 남에게 넘길 수 없다. 사실상 항상 sudo가 붙는다.
자주 쓰는 옵션
| 옵션 | 의미 | 예시 |
|---|---|---|
-R | 디렉터리 하위 전체에 재귀 적용 | chown -R deploy:deploy /srv/app |
-c | 실제로 바뀐 항목만 출력 | chown -Rc www-data /var/www |
-h | 심볼릭 링크가 가리키는 대상 대신 링크 자체를 변경 | chown -h deploy current |
--from=현재소유자 | 지금 소유자가 일치할 때만 변경 | chown -R --from=root deploy /srv/app |
--reference=파일 | 기준 파일과 같은 소유자·그룹으로 맞춤 | chown --reference=app.conf app.conf.new |
--from, --reference, -c는 GNU coreutils 전용이며 macOS/BSD에는 없다. BSD chown은 심볼릭 링크 처리 기본값도 반대라(-h 없이는 링크를 건드리지 않는다) 스크립트를 옮길 때 확인이 필요하다.
실전 예제
1. root로 배포한 디렉터리를 서비스 계정에 넘긴다. 가장 흔한 사용이다.
sudo chown -R deploy:deploy /srv/app
2. 웹서버가 쓸 업로드 디렉터리만 웹서버 계정으로 바꾼다. 계정 이름은 배포판마다 다르다. Ubuntu/Debian은 www-data, RHEL/CentOS/Rocky는 apache 또는 nginx다.
sudo chown -R www-data:www-data /var/www/html/uploads
sudo chmod -R 755 /var/www/html/uploads
3. 그룹만 바꿔 팀원들이 함께 읽고 쓰게 한다.
sudo chown :devteam /srv/share/report.csv
sudo chmod 664 /srv/share/report.csv
4. 백업 복원 후 root 소유로 남은 것만 골라 되돌린다. 이미 올바른 소유자인 파일은 아예 건드리지 않으므로 ctime이 보존된다(chown은 mtime이 아니라 ctime을 갱신한다).
sudo chown -R --from=root deploy:deploy /srv/app
5. 지금 소유자가 누구인지부터 확인한다. 사용자 이름 대신 숫자가 보이면 그 UID가 이 시스템에 없다는 뜻이다. 컨테이너나 다른 서버에서 옮겨온 파일에서 자주 나온다.
$ ls -l /srv/app
drwxr-xr-x 3 1001 1001 4096 Aug 25 09:40 releases
-rw-r--r-- 1 root root 612 Aug 25 09:40 app.conf
함정과 주의점
- 재귀 chown을
/나 홈 전체에 걸면 시스템이 망가진다.sudo chown -R user:user /한 줄이면 sudo, ssh, passwd 같은 setuid 바이너리 권한 체계가 무너져 부팅 후 로그인조차 안 될 수 있다. 재귀 옵션을 쓸 때는 대상 경로 끝에 슬래시나 오타가 없는지 반드시 확인한다. - chown은 setuid/setgid 비트를 지운다. 소유자가 바뀐 실행 파일이 특권을 유지하면 위험하므로 커널이 해당 비트를 떨어뜨린다. 실행 파일에 chown을 걸었다면
chmod u+s등을 다시 적용해야 한다. - 심볼릭 링크에
-R을 쓸 때 방향을 확인한다. 기본값은 링크가 가리키는 실제 파일을 바꾸므로, 링크가/etc나 공유 경로를 가리키면 의도치 않은 곳의 소유자가 바뀐다. 링크 자체만 바꾸려면-h를 쓴다. - UID 숫자와 이름은 별개다. 서버 A의
deploy가 UID 1001, 서버 B의jenkins가 UID 1001이면 rsync·tar로 옮긴 파일의 실제 소유자는 UID 기준으로 결정된다. 이름이 아니라id deploy로 UID를 맞춰 두는 것이 근본 해결이다.
함께 보면 좋은 명령어
chmod— 소유자를 맞춘 다음 필요한 만큼만 권한을 연다.id— 계정의 UID·GID와 소속 그룹을 확인한다.chgrp— 그룹만 바꿀 때 쓰는 전용 명령.stat— 소유자·권한·타임스탬프를 한 번에 본다.