생물정보학/Linux

리눅스 chmod 명령어

케이든 2013. 1. 23. 03:50

 

chmod명령어는 특정파일 또는 디렉토리의 퍼미션(permission)을 설정하는 명령어이다.

퍼미션이란, 특정파일이나 디렉토리에 대하여 읽기, 기록하기, 삭제하기 등의 권한을 설정해놓은 것으로 다중사용자 운영체제에서 파일의 접근권한과 보호등을 위하여 반드시 필요한것이다.

 

>> 파일과 디렉토리의 권한 확인하기 <<

ls -l 명령어를 이용하여 파일을 보면 가장 앞쪽에 7칸의 문자가 있다.

7개칸의 문자에 파일유형과 현재 설정된 권한을 알수 있다.

[root@os1 ~]# ls -l test.sh

-rwxr-x--x 1 root root 189 2013-01-08 21:56 test.sh

test.sh파일을 ls -l명령어로 보니 가장 앞쪽 7칸에 특정 문자들이 있다.

가장 첫번째 칸에 나오는 문자는 파일유형을 뜻하며 문자별로 유형은 아래와같다.

문자

파일형식

-

일반파일

b

블록구조의 특수파일(ex: /dev/sda)

c

입출력에 사용되는 특수파일(ex: /dev/console)

d

디렉토리(디렉토리도 하나의 특수파일로 취급됨)

l

심볼릭링크파일

p

파이프파일

s

소켓파일

, 가장 앞이 drwx-rx-rx일 경우 디렉토리라는 의미이다.

그다음에 오는 9개의 문자는 파일의 권한에 대한 표시이며, 각 자리별 의미는 아래와 같다.

파일소유자의 권한

-rwxr-xr-x

위 붉은색으로 표시된 부분은 파일소유자의 권한에 대한 부분이다.

파일소유그룹의 권한

-rwxr-xr-x

위 붉은색으로 표시된 부분은 파일소유그룹의 권한에 대한 부분이다.

일반사용자(파일소유자와, 소유그룹을 제외한 모두)의 권한

-rwxr-xr-x

위 붉은색으로 표시된 부분은 일반사용자의 권한에 대한 부분이다.

위와 같이 3칸의 문자씩 나누어 각각 구분하며, 각각의 문작 가지는 의미는 아래와 같다.

권한

일반적의미

파일

디렉토리

r

읽기권한(read)

파일읽기권한(cat명령어)

디렉토리내용보기(ls명령어)

w

쓰기권한(write)

파일저장,삭제(vi,rm명령어)

디렉토리에 파일저장, 디렉토리이름변경, 삭제등

x

실행권한(execution)

파일실행

디렉토리접근(cd명령어)

s

SetUID,SetGID권한

파일소유자(SetUID),그룹소유자(SetGID)의 권한으로 실행

t

Sticky Bit권한

공유디렉토리로 사용됨

위와 같이 같은 권한임에도 파일과 디렉토리에 대해서는 차이가 있으므로 확실히 파악하고 있어야 한다.

-. SetUID,SetGID,Stikybit

SetUID SetGID?

일반적으로 특정 실행파일을 실행하였을 경우에는 그 파일을 실행시킨 실행자의 권한으로 실행된다

root가 실행하면 root권한으로 실행되고 user1이 실행하면 user1의 권한으로 실행된다.

하지만 이 실행파일에 SetUID SetGID가 설정이 되면 약간 달라진다.

SetUID가 설정되어있는파일의 소유자가 root일 경우 user1이 실행하여도 root권한으로 실행이 된다.

SetGID역시 마찬가지로 파일의 소유그룹이 root일경우 user1이 실행하여도 root그룹권한으로 실행이 된다.

Stikybit?

주로 공용디렉토리 사용되며 일반사용자의 실행권한부분에 "t"문자로 표시된다.

>stikybit를 설정했을때와 설정하지 않았을때의 차이점

/test 디렉토리에 아래와같은 권한설정이 되어있는경우 차이점

-rwxrwxrwx

/test디렉토리안에서 user1소유의 파일을 user2사용자가 수정할수 있음

-rwxrwxrwt

/test/디렉토리안에서 user1소유의 파일을 user2사용자가 수정할수 없음

위의 비교에서 보듯이, stikybit를 주지 않고 디렉토리에 777권한을 줄경우 user1이 생성한 문서를 user2가 얼마든지 수정할수있다. 또한 user2가 수정하면 파일소유자가 user2로 바뀌게 된다.

하지만 해당 파일이 들어있는 디렉토리에 777권한을 주고 stikybit를함께 주면 user1이 생성한 문서를 user2는 실행도 가능하고 읽을수도 있으나 수정을 불가하게 된다.

※ 권한의 대문자 표시

파일이 속성설정을 하다보면 SetUID,SetGID,Sticky Bit권한 자리의 알파벳이 소문자가 아닌 대문자로 설정되는것을 볼수 있는데, 아래의 예를 보면서 설명하겠다.

>SetUID문자의 대소문자 차이

SetUID문자가 대문자인경우 = -rwSr--r--

SetUID는 설정되었지만 파일소유자에게 실행권한(x)이 없는경우(SetUID유효하지 않음)

SetUID문자가 소문자인경우 = -rwsr--r--

SetUID가 설정되어있고 파일소유자에게 실행권한(x)도 있는경우 (정상적인 SetUID설정)

>SetGID문자의 대소문자 차이

SetGID문자가 대문자인경우 = -rw-r-Sr--

SetGID는 설정되어있지만 파일소유그룹의 실행권한(x)이 없는경우(SetGID유효하지 않음)

SetGID문자가 소문자인경우 = -rw-r-sr--

SetGID가 설정되어있고 파일소유그룹에게 실행권한(x)도 있는경우(정상적인 SetGID설정)

>Stiky bit문자의 대소문자 차이

Stiky bit문자가 대문자인경우 = -rw-r--r-T

Stikybit는 설정되어있지만 일반사용자에게 실행권한(x)이 없는경우(Stikybit유효하지 않음)

Stiky bit문자가 소문자인경우 = -rw-r--r-t

Stikybit가 설정되어있고 일반사용자에게 실행권한(x)도 있는경우(정상적인 Stikybit 설정)

SetUID,SetGID,Stikybit의 설정을 할때에는 대소문자를 잘 확인해야 할것이다.

>> 파일의 퍼미션을 설정하는 2가지 방법 <<

형식 chmod [권한] [파일명]

-. 첫번째, 8진수를 이용한 권한설정하기(절대모드)

형식 : chmod [n] [파일명]

8진수로 숫자를 지정하여 해당파일의 권한을 설정하는 방법이다.

8진수 7 2진수로 111이며, 111은 각 해당하는 자리의 권한을 의미한다.

아래표를 참조하자

8진수

2진수

권한

의미

0

000

---

아무 권한 없음

1

001

--x

실행 권한만 있음

2

010

-w-

쓰기 권한만 있음

3

011

-wx

쓰기,실행 권한 있음

4

100

r--

읽기 권한만 있음

5

101

r-x

쓰기,실행 권한 있음

6

110

rw-

읽기,쓰기 권한 있음

7

111

rwx

모든 권한 있음

각 숫자는 2진수로 대입하여 각 자리의 권한을 의미한다.

, 777은 이진수로 111111111로서 rwxrwxrwx라는 의미로서 파일소유자,소유그룹,일반사용자에게

읽기,쓰기,실행의 모든 권한을 주는 설정이다.

>chmod 777 testfile [-rwxrwxrwx]

위와 같이 설정하면 testfile에 대해선 모든사용자가 파일을 맘대로 수정할수 있다.

>chmod 755 testfile [-rwxr-xr-x]

위와 같이 설정하면 testfile에 대해서 파일소유자는 읽기,쓰기,실행권한을 모두 가지지만 파일소유그룹과 일반사용자는 읽기와 실행만 가능하다.

>chmod 744 testfile [-rwxr--r--]

위와 같이 설정하면 testfile에 대해서 파일소유자는 읽기,쓰기,실행권한을 모두 가지지만 파일소유그룹과 일반사용자는 읽기만 가능하다.

>chmod 700 testfile [-rwx------]

위와 같이 설정하면 testfile에 대해서 파일소유자는 읽기,쓰기,실행권한을 모두 가지지만 파일소유자외에 모든 사용자에겐 아무런 권한도 주지 않는다.

주로 보안이 목적인 파일에 설정한다.

>chmod 644 testfile [-rw-r--r--]

위와 같이 설정하면 testfile에 대해서 파일소유자는 읽기,쓰기만 가능하며, 파일소유그룹과 일반사용자는 읽기만 가능하다.

주로 웹문서 파일에 설정된다.

>chmod 007 testfile 또는 chmod 7 testfile [-------rwx]

위와 같이 설정하면 testfile 에 대해서 소유자와 소유그룹에게는 아무런 권한을 주지 않고 일반사용자에 대해서만 읽기,쓰기,실행 권한을 주게된다.

위는 사용할일이 없는 퍼미션이지만 8진수를 표현하기 위하여 설명하였다.

, 007은 결국 7이므로 위와 같이 설정이 가능하다는 것이다.

>>SetUID,SetGID,Stikybit설정하기

기존에 설정하는 퍼미션앞에 숫자를 하나 더 붙여주면 된다.

1 = stikybit

2 = SetGID

4 = SetUID

를 뜻하며,

설정방법은 아래와 같다.

#chmod 4711 testfile [-rws--x--x] (SetUID설정)

위와 같이 설정하면 파일소유자에게는 읽기,쓰기,실행권한이 주어지며 파일소유그룹과 일반사용자에게는 실행권한만 주어진다. 또한, 파일의 SetUID가 설정되어 파일을 실행하는 사용자의 권한 아닌, 파일소유자의 권한으로 실행파일이 실행된다.

파일소유자에게 실행권한이 없으면 SetUID는 무효화된다. , 4611로 권한이 설정되는경우 SetUID설정은 하지 않은것이나 다름없다.

#chmod 2711 testfile [-rwx--s--x] (SetGID설정)

위와 같이 설정하면 파일소유자에게는 읽기,쓰기,실행권한이 주어지며 파일소유그룹과 일반사용자에게는 실행권한만 주어진다. 또한 파일의 SetGID가 설정되어 파일을 실행하는 사용자의 권한이 아닌, 파일소유그룹의 권한으로 실행된다.

파일그룹에게 실행권한이 없으면 SetGID는 무효화된다. , 2701로 권한이 설정되는경우 SetGID설정을 하지 않는것이나 다름없다.

#chmod 1777 /testdir [drwxrwxrwt] (Stikybit설정)

위와 같이 설정하면 해당디렉토리 내에 있는 파일에 대해서 stikybit가 적용되어, 파일의 소유자만이 해당파일을 수정하고 지울수 있다.

따라서 여러 사용자가 함께 사용하는 공용디렉토리에 주로 사용된다.

-. 두번째, 특정문자를 이용하여 권한설정하기(상대모드)

형식 : chmod [사용자][연산자][권한] [파일명]

8진수를 이용하여 퍼미션을 설정할수도 있으나 특정문자를 이용하여 퍼미션을 설정할수도 있다.

>사용자부분에 들어갈수 있는 문자

u : 파일소유자를 뜻함

g : 파일소유그룹을 뜻함

o : 일반사용자를 뜻함

a : 모든사용자를 뜻함

>연산자부분에 들어갈수 있는 문자

+ : 해당권한을 허용

- : 해당권한을 비허용

= : 해당권한으로 권한설정

>권한부분에 들어갈수 있는 문자

r : 읽기 권한

w : 쓰기 권한

x : 실행 권한

s : SetUID,SetGID 설정

파일소유자,파일소유그룹에만 사용됨

chmod u+s testfile : SetUID설정

chmod g+s testfile : SetGID설정

chmod o+s testfile : 아무런 변환없음

t : Stikybit 설정

일반사용자에게만 사용됨

chmod u+t testdir : 아무런 변화없음

chmod g+t testdir : 아무런 변화없음

chmod o+t testdir : Stikybit설정

X : 파일소유자에게 실행권한이 있는경우에만 소유그룹과 일반사용자에게 실행권한부여

파일소유자에게 실행권한이 있어야만 파일소유그룹또는 일반사용자에게 실행권한을 부여한다.

>파일소유자에게 실행권한이 있는경우

chmod u+X : 아무런 변화없음

chmod g+X : 파일소유그룹에게 실행권한부여

chmod o+X : 일반사용자에게 실행권한부여

이해를 돕도록 아래 몇가지 예를 보자

>모든사용자에게 읽기,쓰기권한 추가(a+rw)

[root@os1 /]# ls -l testfile

---------- 1 root root 0 2013-01-18 03:54 testfile

[root@os1 /]# chmod a+rw testfile

[root@os1 /]# ls -l testfile

-rw-rw-rw- 1 root root 0 2013-01-18 03:54 testfile

>파일소유자에게 실행권한 추가(u+x)

[root@os1 /]# ls -l testfile

-rw-rw-rw- 1 root root 0 2013-01-18 03:54 testfile

[root@os1 /]# chmod u+x testfile

[root@os1 /]# ls -l testfile

-rwxrw-rw- 1 root root 0 2013-01-18 03:54 testfile

>SetUID설정(u+s)

[root@os1 /]# ls -l testfile

-rwxrw-rw- 1 root root 0 2013-01-18 03:54 testfile

[root@os1 /]# chmod u+s testfile

[root@os1 /]# ls -l testfile

-rwsrw-rw- 1 root root 0 2013-01-18 03:54 testfil

>파일소유그룹과 일반사용자의 쓰기권한 비허용(go-w)

[root@os1 /]# ls -l testfile

-rwsrw-rw- 1 root root 0 2013-01-18 03:54 testfile

[root@os1 /]# chmod go-w testfile

[root@os1 /]# ls -l testfile

-rwsr--r-- 1 root root 0 2013-01-18 03:54 testfile

>파일소유그룹과 일반사용자에게 실행권한만 허용(go=x)

[root@os1 /]# ls -l testfile

-rwsr--r-- 1 root root 0 2013-01-18 03:54 testfile

[root@os1 /]# chmod go=x testfile

[root@os1 /]# ls -l testfile

-rws--x--x 1 root root 0 2013-01-18 03:54 testfile

위에서도 볼수 있듯이 내가 지정한 값에 대해서만 변경이 가능하기 때문에 권한이 일정하지 않은 많은 파일에 일괄적으로 특정 권한을 추가하거나 제거하고자 할때 사용하면 용이하다.

다만, 그런경우는 흔치 않기 때문에 대부분 문자를 이용한 권한변경보다는 8진수를 이용한 권한변경을 주로 사용한다.

-. chmod명령어의 주요 옵션

-c : 권한이 변경된 경우에만 권한변경 정보 출력하기

아래의 예를 보면 모든파일을 대상으로 파일소유자에게 실행권한을 추가하는 명령어를 사용했지만 file2 파일에는 이미 파일소유자게에 실행권한이 있어 권한이 변경되지 않았기때문에 아무런 출력도 하지 않고, file1에 대해서만 파일소유자에게 실행권한을 추가하였으므로 권한변경에 대한 정보를 출력한다.

[root@os1 /test]# ls -l

total 0

-rw-r--r-- 1 root root 0 2013-01-18 04:17 file1

-rwxr--r-- 1 root root 0 2013-01-18 04:17 file2

[root@os1 /test]# chmod -c u+x *

mode of 'file1' changed to 0744 (rwxr--r--)

[root@os1 /test]#

-v : 권한변경정보 출력하기

위의 예와 마찬가지로 모든파일에 실행권한을 추가하였다. 하지만 이번엔 권한이 변경되든 변경되지 않든 모두 메시지를 출력한다. 하지만 메시지의 문구는 약간다르다.

변경된 경우 changed를 변경되지 않는 경우 retained를 출력한다.

[root@os1 /test]# ls -l

total 0

-rw-r--r-- 1 root root 0 2013-01-18 04:17 file1

-rwxr--r-- 1 root root 0 2013-01-18 04:17 file2

[root@os1 /test]# chmod -v u+x *

mode of 'file1' changed to 0744 (rwxr--r--)

mode of 'file2' retained as 0744 (rwxr--r--)

-f : 에러메시지를 생략한다.

파일의 권한변경시 발생하는 에러메시지를 출력하지 않는다.

아래처럼 user1소유의 파일을 user2사용자가 권한을 변경하려 하는경우 에러메시지를 출력한다.

하지만 -f옵션을 주면 에러메시지는 출력되지 않는다.

[user2@os1 /test]$ ls -l

-rw-rw-r-- 1 user1 user1 0 Jan 18 04:25 user1

[user2@os1 /test]$ chmod 777 user1

chmod: changing permissions of 'user1': Operation not permitted

[user2@os1 /test]$ chmod 777 user1 -f

[user2@os1 /test]$ ls -l

-rw-rw-r-- 1 user1 user1 0 Jan 18 04:25 user1

-R : 서브디렉토리 및 폴더내 파일까지 일괄적으로 권한을 변경한다.

특정 디렉토리의 권한만이 아닌 디렉토리내에있는 모든 파일까지 권한을 일괄적으로 변경하고자 할때 사용된다.

[root@os1 /]# ls -lR /test

/test:

total 4

drwxr-xr-x 2 root root 4096 2013-01-18 04:30 dir1

-rw-r--r-- 1 root root 0 2013-01-18 04:29 file1

-rw-r--r-- 1 root root 0 2013-01-18 04:29 file2

/test/dir1:

total 0

-rw-r--r-- 1 root root 0 2013-01-18 04:30 file01

-rw-r--r-- 1 root root 0 2013-01-18 04:30 file02

[root@os1 /]# chmod -R 777 /test

[root@os1 /]# ls -lR /test

/test:

total 4

drwxrwxrwx 2 root root 4096 2013-01-18 04:30 dir1

-rwxrwxrwx 1 root root 0 2013-01-18 04:29 file1

-rwxrwxrwx 1 root root 0 2013-01-18 04:29 file2

/test/dir1:

total 0

-rwxrwxrwx 1 root root 0 2013-01-18 04:30 file01

-rwxrwxrwx 1 root root 0 2013-01-18 04:30 file02

참조 : 리눅스 서버관리 실무 바이블 3.0(박성수 저)