chown, chgrp - 소유권을 변경하는 명령어
리눅스에는 디렉터리, 파일마다 소유권이랑 권한이 부여된다. 디렉터리와 파일의 권한은 조금 다르게 동작하는데, 일단 파일은 기본이 666이고 디렉터리는 777이다. 이게 뭐냐면 읽기, 쓰기, 실행 권한을 8진수로 하여 현재 사용자, 그룹, 다른 사용자의 권한으로 나눈 건데, rwx로 표기가 된다. 일반적으로 현재 사용자가 생성한 파일이나 디렉터리는 그 사용자와 그룹의 소유권이 부여된다.
대부분의 시스템 기본 파일들은 root의 소유권이고, 홈디렉터리는 사용자의 것이다. 또, 권한의 기본값도 디렉터리는 755, 파일은 644이다. ls -l 명령어를 통해 소유권과 권한을 한 눈에 볼 수 있다.
chown는 소유자와 소유그룹 모두 변경이 가능하고 chgrp은 그룹만 변경이 가능한 차이점이 있음 디렉터리 변경할 때 둘 다 -R 옵션을 주면 안에 있는 모든 파일도 같이 변경됨
[testuser@Alma ~]$ ls -l /home/
total 0
drwx------. 2 five five 62 Oct 30 01:26 five
drwx------. 2 four four 62 Oct 30 01:26 four
drwx------. 2 newuser newuser 83 Oct 30 00:49 newuser
drwx------. 2 one one 62 Oct 30 01:25 one
drwx------. 2 testuser 1111 83 Oct 30 00:32 testuser
drwx------. 2 three three 62 Oct 30 01:26 three
drwx------. 2 two two 83 Oct 30 01:44 two
권한의 맨 앞 글자 d는 디렉터리를 뜻하고 -면 일반 파일, 홈디렉터리는 다른 그룹과 사용자의 접근이 안 된다. rwx --- --- 가 각각 user group other의 권한인 것. 즉, 소유자만 디렉터리 안(r)을 볼 수 있고, 파일을 생성/수정/삭제(w)하고, 안으로 이동(x)이 가능함 나머지는 다 막힘 root는 예외 ( 시스템 전체의 관리자니 당연 ) testuser의 그룹이 혼자 1111인 이유는 그룹을 삭제했기 때문에 GID로 뜸 (현재 testuser 그룹이 삭제된 상태)
디렉터리와 파일의 권한은 다르게 동작하는데, 일단 시스템 전체의 루트 경로인 /에는 소유권이 전부 root다. 그리고 o 부분의 값에 따라 디렉터리 조회? 아무튼 ls라 생각하면 편함, mkdir나 touch로 뭔 만들다던가 vim, emacs 등 편집기로 수정 rm으로 삭제, 그리고 디렉터리 안으로 이동하는 게 가능한지 알 수 있음 이건 cd 명령어로 테스트 가능
[testuser@Alma /]$ cd /home/
[testuser@Alma home]$ pwd
/home
[testuser@Alma home]$ cd five/
-bash: cd: five/: Permission denied
[testuser@Alma home]$ ls newuser/
ls: cannot open directory 'newuser/': Permission denied
그래서 다른 사용자의 홈디렉터리에 접근해보니 당연하게도 거부 메시지가 뜨는데 그럼 그룹 권한을 얻고 접근해보면 어떨까?
[testuser@Alma home]$ newgrp newuser
Password:
[testuser@Alma home]$ ls newuser/
ls: cannot open directory 'newuser/': Permission denied
역시 거부가 뜬다... 왜 그룹이여도 거부가 뜰까?
아까 말한 것처럼 총 3가지 역할을 가지고 권한을 관리하는데, drwx------라 소유자에만 모든 권한이 있고 그룹이여도 기타 사용자와 동일하게 아무 권한이 없어서 그런 것이다. 그럼 이제 소유자의 권한을 얻어서 해본다면? 그럼 되어야 한다 su로 계정을 바꾸면?
[testuser@Alma home]$ su - newuser
Password:
Last login: Thu Oct 30 00:48:51 KST 2025 on pts/1
Last failed login: Thu Oct 30 12:26:19 KST 2025 on pts/0
There were 2 failed login attempts since the last successful login.
-sh-5.2$ cd /home/
-sh-5.2$ cd newuser/
-sh-5.2$ pwd
/home/newuser
역시 안 될 리가 없다
[testuser@Alma ~]$ ls -l / | awk -F" " '{ if ($NF == "root") {print $0} }'
dr-xr-x---. 3 root root 163 Oct 30 00:47 root
[testuser@Alma ~]$ ls -l /root/
ls: cannot open directory '/root/': Permission denied
여기서는 당연히 다른 사용자에게 아무 권한이 허용이 안 됐으니 거부가 된다. 여기서 접근할 수 있는 방법은 root 사용자나 그룹의 권한을 빌리거나 root가 권한을 풀어줘야 한다. 다음으로 sudo를 사용해 권한을 풀어주고 접근해봤다
[testuser@Alma ~]$ cd /root/
-bash: cd: /root: Permission denied
[testuser@Alma ~]$ sudo chmod o+x /root/
[testuser@Alma ~]$ ls -l /root/
ls: cannot open directory '/root/': Permission denied
[testuser@Alma ~]$ cd /root/
[testuser@Alma root]$
x 권한만 풀고 테스트한 결관데, 당연히 주기 전에는 cd가 막힌다. 그리고 실행권한을 준 담 ls를 시도했지만 이건 r 권한이라 당연히 막히지만 x 권한을 풀어서 cd로 들어가는 건 성공한 셈
chmod - 권한을 변경하는 명령어
위에서 짧게 소유권에 대한 실습을 해봤다면 이제 권한이랑 연계해서 확인해볼 필요가 생겼다. 앞서 chmod 명령어를 한 번 사용했지만 여기서 살짝 더 깊게 들어가보려 한다.
이제 다른 사용자로만 접근하지 말고 그룹에 접근 권한을 주고 테스트해보자 지금 접속해있는 계정 홈디렉터리에 권한을 다 주고 세션을 나가고 다른 계정으로 다시 해보면 된다.
-sh-5.2$ chmod g+rwx newuser
-sh-5.2$ ll
total 0
drwx------. 2 five five 62 Oct 30 01:26 five
drwx------. 2 four four 62 Oct 30 01:26 four
drwxrwx---. 2 newuser newuser 83 Oct 30 00:49 newuser
drwx------. 2 one one 62 Oct 30 01:25 one
drwx------. 2 testuser 1111 94 Oct 30 11:58 testuser
drwx------. 2 three three 62 Oct 30 01:26 three
drwx------. 2 two two 83 Oct 30 01:44 two
일단 지금 사용자의 홈디렉터리의 권한ㅇ르 바꿔준다.
chmod는 크게 8진수 방식과 심볼릭 방식으로 권한을 변경할 수가 있다. 8진수 방식일 경우는 r =4 w = 2 x =1 총 3개 비트 조합 값으로 권한이 표시된다. 예를 들어 6 = rw-, 3 = -wx, 5 = r-x 이다. 8진수 범위인 000 ~ 111 에서 각 자리수만 rwx로 대입됐다고 생각하면 편하다. 그리고 소유자, 그룹, 다른 사용자 순으로 적어 총 3자리로 표시한다 예시) chmod 744 <파일명> -> -rwxr--r-- 여기서는 파일이라 가정했기 때문에 맨 앞 글자가 d가 아닌 -로 나타냄
다음으로는 심볼릭 방식이다. 상징적이라는 단어의 뜻 답게 u,g,o라는 소유권과 +,-,= 기호, r,w,x 권한을 조합해 알기 쉽게 표시한다. chmod u+wx,g=rx,o-w <파일명> -> 파일의 권한을 사용자는 기존 권한 포함하여 wx를 추가하고 그룹은 rx로 고정, 나머지는 w 권한을 빼는 명령어다. 이처럼 심볼릭 방식은 조금 더 복잡하게 설정할 수 있는 자유도?를 지녔다. 그리고 숫자보단 아무래도 한 눈에 이게 어떤 동작인지 파악하기 쉬워서 8진수 대비 실수할 확률이 줄어드는 장점이 있다.
[testuser@Alma home]$ newgrp newuser
[testuser@Alma home]$ touch newuser/testFile
[testuser@Alma home]$ ls newuser/
testFile
뉴유저의 그룹에 권한을 다 넣고 그룹을 빌린 다음 테스트해보니 모든 작업이 다 가능한 게 보인다 여기에서는 r (ls) w(touch) 허용된 걸 확인이 가능
umask - 파일, 디렉터리의 기본 권한 설정
umask는 파일, 디렉터리의 기본 권한인 666, 777을 umask의 값으로 마스킹하는 것이다. 쉽게 말하자면 기본 권한을 가린다고 생각하면 된다 그러니까 umask의 값이 0022면 파일 생성 시 666이 아닌 644, 디렉터리는 755로 가려버리는 것이다
[testuser@Alma home]$ umask
0022
기본값을 확인하려면 umask를 치면 된다. 또 기본적으로 /etc/bashrc 파일에 살펴보면 umask 값이 적용되어 있다.
[testuser@Alma ~]$ touch a
[testuser@Alma ~]$ ll
total 0
-rw-r--r--. 1 testuser newuser 0 Oct 30 13:07 a
[testuser@Alma ~]$ umask 231
[testuser@Alma ~]$ umask
0231
[testuser@Alma ~]$ touch b
[testuser@Alma ~]$ ll
total 0
-rw-r--r--. 1 testuser newuser 0 Oct 30 13:07 a
-r--r--rw-. 1 testuser newuser 0 Oct 30 13:07 b
umask를 변경하고 기존 생성했던 파일과 권한을 비교하는 실습을 해보았다.
그런데 어딘가 이상한 점이 있다. 파일의 기본권한은 666이고 umask 값이 231이면 435로 설정돼서 - r-- -wx r-x이 되어야 하지 않나? 그런데 그게 아니라 - r-- r-- rw-(446)으로 나온다. 그 이유는 단순한 숫자 뺄셈으로 동작하는 게 아니라서 이런 것이다.
IP 서브넷 계산을 해본 분들이라면 알겠지만, and 연산이란 걸 해서 그렇다. 같은 비트에서 일치하는 값만 골라서 그 값을 빼버리는 umask 특성 상 아래 표와 같이 나오는 것이다.
| - rw- rw- rw- : 기본값 | 666 |
| - -w- -wx --x : umask 값 | 231 |
| - r-- r-- rw- : 최종 계산 값 | 446 |
umask 기본 값이었던 0022는 w가 파일의 기본 값에도 있었기 떄문에 단순 숫자 계산으로 666 - 022 = 664처럼 보였지만 위는 그렇지 않기 때문에 이 점을 유의해야 한다. 물론 디렉터리는 애초에 기본이 777로 다 있기 때문에 크게 신경쓰지 않아도 된다.
그리고 여길 보면 u,g,o외에 앞에 한 자리가 더 붙어있는 게 보인다. 이건 특수권한이라는 것으로, chmod로 변경할 수 있고, rwx처럼 8진수로 작동하지만 그 내용은 다르다. 4는 setuid, 2는 setgid, 1은 sticky bit라고 부른다.
일반적으로 특수권한은 기본값이 0이라 umask에서 맨 앞 자리를 4를 하든 2, 1을 하든 5를 하든 별 영향이 없지만 예외적으로 기본값이 부여된 경우라면 이걸 통해 마스킹할 수도 있다.
setuid는 파일을 실행하는 사용자가 이걸 걸어놓은 사용자의 권한을 일시적으로 얻어 할 수 있게 하고, setgid는 그룹, 마지막으로 sticky bit라는 것이 조금 특이한데, 디렉터리에만 설정되고, 이게 설정된 디렉터리에는 다른 사용자들이 파일을 막 만들기는 가능하지만 수정 변경은 설정한 사람만 가능한 구조다. chmod 명령어에 특수권한을 포함하여 권한을 변경할 수도 있다.
이것도 말로만 하면 이해가 잘 안 되니 실습을 해보면서 이해를 해보자
[testuser@Alma ~]$ chmod u+s a
[testuser@Alma ~]$ ll
total 0
-rwSr--r--. 1 testuser newuser 0 Oct 30 13:07 a
-r--r--rw-. 1 testuser newuser 0 Oct 30 13:07 b
[testuser@Alma ~]$ chmod 6446 b
[testuser@Alma ~]$ ll
total 0
-rwSr--r--. 1 testuser newuser 0 Oct 30 13:07 a
-r-Sr-Srw-. 1 testuser newuser 0 Oct 30 13:07 b
똑같이 심볼릭, 8진수를 사용해 특수권한을 부여할 수 있다. 기존 실행 권한이 없으면 대문자 S로 뜨고 x 권한이 있었다면 소문자 s로 변경된다.
[testuser@Alma ~]$ mkdir folder
[testuser@Alma ~]$ chmod 1755 folder/
[testuser@Alma ~]$ ll
total 0
-rwSr--r--. 1 testuser newuser 0 Oct 30 13:07 a
-r-Sr-Srw-. 1 testuser newuser 0 Oct 30 13:07 b
drwxr-xr-t. 2 testuser newuser 6 Oct 30 13:31 folder
sticky bit도 마찬가지로 기존 실행 권한이 없으면 대문자 T, 있으면 소문자 t로 표시된다. 디렉터리는 생성 시 기본이 777 - 022 = 755로 실행권한이 있기 때문에 소문자로 나온다. 참고로 setuid랑 setgid는 u, g 부분에, sticky bit는 o 부분에만 설정할 수 있다.
sudo - 관리자(root) 권한으로 명령어 실행할 때 사용
superuser do의 약어라고 하며 보통 많은 작업들에서 관리자 권한 없이는 실행할 수 없는 경우가 많다. 그래서 일반 사용자는 이 명령어를 사용해 작업을 수행하게 된다. 기본적으로 새로운 사용자를 추가하면 그 사용자는 sudo 명령어를 통해 관리자 권한으로 명령어를 실행할 수 없다. 그 이유는 /etc/sudoers 파일에 sudo 명령어를 사용할 수 있는 사용자나 그룹이 정의되어 있어야 하기 때문이다. 따라서 wheel 그룹에 사용자를 추가하거나 관리자 권한을 통한 visudo 명령어로 /etc/sudoers 파일을 수정해 사용자를 추가해야 한다. visudo는 root라도 기본적으로 sed, vi 등으로 /etc/sudoers 파일을 변경할 수 없기 때문에 이 파일 수정 시 사용되는 명령어이다. 물론 root에서 chmod로 +w 권한을 부여하면 vi로 편집이 가능하지만 별 이유가 없다면 하지 말도록 하자.
대게 %wheel ALL=(ALL) ALL 이 줄이 sudoers 파일에 있을 것이고, 이건 wheel 그룹이라면 어디에서든(첫 ALL) 모든 사용자(=ALL)가 모든 권한(마지막 ALL)을 쓸 수 있다는 뜻 사용자만 추가하려면 <사용자명> ALL=(ALL) NOPASSWD: ALL 이렇게 할 수 있다. 매번 비번을 치기 귀찮다면 저렇게 할 수도 있고, ALL이 아니라 명시적으로 접근하는 호스트와 권한 흭득이 되는 사용자와 그룹, 허용할 명령 등을 지정할 수도 있다.
sudo -i 는 root로 로그인, sudo -u 사용자명 -i는 해당 사용자로 로그인할 때 쓰인다. 추가로 su, su -로도 root 밑 사용자 변경이 가능하지만 쉘 세션 변경이냐 새 세션 시작이냐의 차이 정도가 있다.
| 세션 변경 | 세션 시작 |
| 셸 프로세스 시작 (Session Change) | 로그인 프로세스 시작 (New Session) |
| 이전 셸의 환경 변수(예: PATH, HOME)를 상당 부분 물려받음 | 대상 사용자의 .profile, .bashrc 등 모든 로그인 설정 파일을 로드하고 환경을 재구성 |
| tmux, su, newgrp 등 | ssh, su -, sudo -i 등 |
| pwd치면 위치 동일 | pwd치면 사용자 홈디렉터리로 가있음 |
'리눅스 > 실습' 카테고리의 다른 글
| 리눅스 실습(3) - 파일시스템 실습(RAID 및 파일시스템 복구) (0) | 2025.10.31 |
|---|---|
| 리눅스 실습(3) - 파일시스템 실습(디스크 장치와 파티션) (0) | 2025.10.31 |
| 리눅스 실습(2) - 계정 관련(소유권, 권한 등) 실습-2 (0) | 2025.10.30 |
| 리눅스 실습(2) - 계정 관련(소유권, 권한 등) 실습-1 (0) | 2025.10.29 |
| 리눅스 실습(1) - Hyper-V와 Alma 리눅스 (0) | 2025.10.29 |