본문 바로가기

Academy I/Tech Academy

Unix 4 검색과 권한

화일의 위치 검색 명령 : find
---------------------------------------------------------------------

1. find 명령어

┌────────────────────────┐
│ find 대상_디렉토리 표현식                      │
│ ( 검색_조건 처리_형식 )                        │
└────────────────────────┘


find 명령어는 명령어상에 지정한 검색조건과 일치하는 화일들을
지정한 디렉토리내에서 검색한 후, 지정된 처리_형식을 수행한다.
만일 검색후 처리 형식을 지정하지 않을 경우에는 명령어 출력을
표시하지 않는다. find 명령어를 기술함에 있어서, 표현식에
복수개의 검색_조건과 복수개의 대상_디렉토리를 지정할 수 있다.

┌───────────────────────────┐
│ $find /home/user1 /home/user2 -name '*.rpt' -print   │
└───────────────────────────┘

find 명령어상에서 특수문자들을 사용할 경우에는 쉘로부터 번역되는
것을 막고, find 명령어로 하여금 특수 문자들을 처리하도록 하기위해
반드시 보호문자로(',",\) 묶어주어야만 한다.

┌──────────────────┐ 특수문자를 사용하기 위해,
│ $find . -name '*.sh' -print        │ 보호문자를 사용하여
└──────────────────┘ 묶어주는 것을 보여준다.


find 명령어는 검색_조건을 기준으로하여 대상_디렉토리내의 화일들을
검사하고, 지정한 처리_형식에 따라서 출력을 생성한다.
예를들면, find /home -user david -print라고 지정하면, /home 디렉토리
내에서 소유자가(즉, owner) david인 화일들을 검색하여
검색된 화일들에 대한 절대 경로명을 화면상에 표시한다.
처리 형식을 지정하지 않을 경우에는 아무 작업도 수행하지 않음으로
반드시, 명확하게 지정해야만 한다.

복수개의 검색_조건을 지정할 수 있다.
공백으로 구별되어 나열된 복수개의 검색_조건은 논리곱(AND) 연산이
수행되어 지므로, 나열된 모든 조건을 만족하는 화일들이 검색된다.
예를들면, find /home -user david -type d -print 명령어는
소유자가 david인 디렉토리들을 찾아서 프린트 한다. 또하나의 예를들면

┌───────────────────────┐
│ $find . -atime +30 -atime -60 -ok rm {} \;   │
└───────────────────────┘


30일 이전에서 60일 이전에 억세스된 화일을 찾아
rm(화일 삭제)시키라는 예이다. 이때 +30, -60의
형식을 주목하기 바란다.

복수개의 검색_조건이 -o를 사용하여 나열되면, 이는 논리합(OR) 연산을
수행하게 되어, 지정된 검색_조건중 어느 하나를 만족하는 화일들이
검색된다. 예를들면, find . \( -user david -o -user john \) -print라고
지정했을 경우에는, 소유자가 david이거나 john인 화일들을 찾아
화면상에 출력한다. 이 예에서 ( (그룹화 특수문자) 라는 특수문자가 \를
통해 보호되고 있는점을 주목하기 바란다.

지정한 검색_조건과 반대의(즉; 부정) 화일들을 검색하기 위해서는
!를 검색_조건에 지정하면 된다.

다음은 find 명령어에서 제공하는 검색_조건과 처리_형식들이다.

(( 검색_조건 ))

-atime n n 일 이전에 억세스되었던 화일들
-follow 심볼릭 링크된 화일들
-links n 링크(link) 수가 n개인 화일들
-mtime n n 일 이전에 변경된 화일들
-name pattern pattern이라는 화일명을 갖고있는 화일들
-perm nnn 접근 권한이 nnn인 화일들
-prune 지정한 대상_디렉토리내에서는 검색하지 않는다.
-size n n 블럭만큼의 크기를 갖는 화일을 검색한다.
-type char char로 지정한 화일 종류를 검색한다.
( f는 화일, d는 디렉토리 화일을 의미한다. )
-user logname 소유자가 logname인 화일들

(( 처리_형식 ))

-print 화일의 절대 경로명을 화면상에 표시한다.
-exec cmd {} \;
검색된 화일들에 대해 {} 이전에 지정된 cmd를 수행한다.
검색된 화일들에 대해 지정한 명령어들을 일괄처리 하는
형식으로 작업을 수행한다.
-ok cmd {} \;
검색된 화일들에 대해 {} 이전에 지정된 cmd를 수행한다.
검색된 화일들 각자에 대해 명령어 수행 여부를 묻는
프롬프트를 표시하는 형식의 대화식으로 작업을 진행한다.

---------------------------------------------------------------------------



화일에서 특정의 문자열 검색 명령 : grep
---------------------------------------------------------------------

1. grep 명령어

┌────────────────────────┐
│ grep [-option] 'pattern' file(s)               │
└────────────────────────┘


grep 명령어는 지정한 pattern의 문자열에 대해, 하나 또는 그 이상의
화일에서 라인 단위로 검색한다. 또한 옵션에 의해 지정된 처리 형태는
pattern이 들어 있는 각 라인별로 실행된다.

특수문자를 이용하여 pattern을 지정할 경우에는 쉘이 분석하는 것을
막고, grep 명령어에 특수문자를 전달하기 위해 반드시 보호문자를
사용하여 묶어주어야 한다. grep 명령어에서 자주 사용되는 특수문자들은
다음과 같다.

. 한문자와 대치
( 예를들면 f.t라하면, 총 3문자로 구성되며, 가운데 글자가
어느것이라도 상관 없음을 의미한다. )
[] 사각괄호([])안에 지정된 문자중 어느 한자와 대치
( 예를들면 f[il]t라하면, 총 3문자로 구성되며, 가운데 글자가
i이거나 l인 문자열을 검색한다. )
* 0개 또는 그 이상의 문자들과 대치
(예를들면 f*t라하면, ft나 fit, fiot등 처음 글자가 f이고
마지막 글자가 t인 문자열을 검색한다. )
^ 각 라인의 처음이 지정한 pattern인 라인들만을 검색한다.
(예를들면 ^file이라면 라임의 첫 칼럼부터 file이라는 문자열이
들어있는 라인들을 검색한다. )
$ 각 라인의 끝이 지정한 pattern인 라인을 검색한다.


만일 grep 명령어에 복수개의 화일을 지정하게 되면, grep 명령어는
출력상에 각 검색된 라인의 처음에 해당 라인이 들어 있는 화일명을
표시하여 준다. 이 경우 -l 옵션을 사용하면, 검색 라인들에 대해
개개로 부여되는 화일명을 화일별로 한개씩만을 표시하게 할수 있다.

( 옵션 )

-i 대,소문자를 구별하지 않는다.
-n 지정한 pattern을 포함하고 있는 라인의 라인번호를 함께
표시한다.
-l 복수 화일 검색시에 검색 라인들을 화일별로 정리하여 표시한다.
-v 지정한 pattern이 들어 있지 않은 라인들을 표시한다.

( 예제 )


<<< Input fileA >>>

$cat fileA
aaapatternaaa
bbbPatternbbb
patterncccccc

$cat fileB
AAAAAA
BBBBBB
pattern
CCCCCC
┌─────────────┐ fileA라는 화일에서 pattern이라는
│ $grep 'pattern' fileA    │ 문자열이 들어있는 라인을 검색하여
│ aaapatternaaa            │ 화면에 표시한다.
│ patterncccccc            │
└─────────────┘
┌──────────────┐ fileA라는 화일에서 pattern이라는
│ $grep -i 'pattern' fileA   │ 문자열을 검색한다. 단, 대소문자를
│ aaapatternaaa              │ 구별하지 않는다.
│ bbbPatternbbb              │
│ patterncccccc              │
└──────────────┘
┌─────────────┐ 현재의 작업 디렉토리내의 모든 화일에서
│ $grep -i 'pattern' *     │ pattern이라는 문자열을 검색한다.
│ fileA:aaapatternaaa      │ 단, 대소문자를 구별하지 않는다.
│ fileA:bbbPatternbbb      │
│ fileA:patterncccccc      │
│ fileB:pattern            │
└─────────────┘
┌────────────┐ 현재의 작업 디렉토리내의 모든 화일에서
│ $grep '^pattern' *     │ 라인의 처음부터 pattern이라는
│ fileA:patterncccccc    │ 문자열이 있는 라인을 검색한다.
│ fileB:pattern          │
└────────────┘

---------------------------------------------------------------------------



화일 내용의 정렬 : sort
---------------------------------------------------------------------

1. 라인 단위의 문장 정렬

┌───────────────────┐
│ $sort [-option] [fields] [file(s)]   │
└───────────────────┘


sort 명령어는 지정한 텍스트 화일의 각 라인을 정렬한다. 명령어 라인상에
대상 화일명을 지정하지 않을 경우에는, sort 명령어는 표준 입력 장치인
터미널의 키보드로 부터 입력을 받아들인다.

sort 명령어는 정렬후의 실행 결과를 표준 출력 장치인 터미널의
스크린으로 표시한다. -o 옵션을 사용하여 특정 화일을 지정할 경우에
출력을 그 화일에 저장할 수 있다.

복수개의 화일을 지정하면, sort 명령어는 정렬을 실행하기 전에
화일들을 병합한후에, 정렬을 수행한다.

sort 명령어는 다음과 같은 순서의 ASCII (America Standard Code
Information Interchange) 값을 기준으로 정렬한다.

. 특수문자 ( period, space, return )
. 번호
. 대문자
. 소문자

이 순서에서 숫자는 그들의 ASCII 값을 기준으로 하여 정렬된다.
따라서 10, 30, 200, 500, 4000의 숫자들도 10, 200, 30, 4000, 500순으로
정렬된다. 이 경우 숫자들을 고유의 숫자 값으로 정렬하기 위해서는
-n 옵션을 지정할 수 있다.

기본적으로 sort 명령어는 첫번째 필드를 기준으로 라인을 정렬한다.
여기서 필드라 함은 공백이나 탭에의해 구별되는 일련의 문자들이다.
sort 명령어는 라인내의 임의의 필드를 대상으로 정렬할 수도 있으며,
각 필드의 구별 문자도 공백 또는 탭이 아닌 다른 문자를 지정하여
사용할 수 있도록 해준다. 이 방식은 조금 있다가 다시 설명한다.

( 옵션 )

-f 대소문자를 구별하지 않는다.
-n 숫자 값을 기준으로 정렬한다.
-o file 지정한 화일에 정렬된 출력을 저장한다.
-r 정렬 순서를 역으로 한다.
-tchar char로 지정한 문자를 필드 구별 문자로 선언한다.

( 예제 )
                 ┌───────┐
<< Input file >> │ $cat test    │
                 │ package      │
                 │ 56           │
                 │ box          │
                 │ Banana       │
                 │ 234          │
                 │ Pear         │
                 │ .profile     │
                 └───────┘
┌────────┐ test 화일의 내용을 정렬한다.
│ $sort test     │ 여기서 유의할 것은 ASCII 코드값이
│ .profile       │ .이 가장 빠르고, 그다음으로
│ 234            │ 숫자, 영대문자, 영소문자가 가장 크다는
│ 56             │ 것과 숫자를 정렬함에 있어서의
│ Banana         │ 처리 형태이다.
│ Pear           │
│ box            │
│ package        │
└────────┘

┌────────┐
│$sort -f test   │ -f 옵션을 사용함으로써 정렬함에
│.profile        │ 있어서 대,소문자 구별이 행해지지 않음을
│234             │ 보여주는 예제이다.
│56              │
│Banana          │
│box             │
│package         │
│Pear            │
└────────┘

┌──────────────┐
│$sort -n -o test.srt test   │ -n 옵션을 사용됨으로써 숫자값을
│.profile                    │  기준으로한 정렬이 수행되며,
│Banana                      │ -o 옵션 사용으로, 그 다음에 연이어
│Pear                        │ 기술되어 있는 test.srt 화일에
│box                         │ 정렬 결과가 저장된다.
│package                     │
│56                          │
│234                         │
└──────────────┘

2. 필드 단위의 문장 정렬

┌───────────────────┐
│ $sort [-options] [fields] [file(s)]  │
│ (field.char)                         │
└───────────────────┘


다음에 설명되는 내용중 필드는 이미 설명한데로 공백 또는 탭에의해
구별되는 라인상의 연속된 문자들을 말한다. sort 명령어에 의해
사용되는 기본적인 대상필드는 첫번째 필드이다. sort 명령어에서 사용되는
정렬하기 위해 사용하는 다른 필드는 명령어 라인상에서 첫번째 필드에
대해 상대적으로 지정한다. 각라인의 필드를 가르키는 명령어 라인상에
지정된 필드들은 sort 명령어에 의해 정렬함에 있어 비교하기 위해
사용한다.

필드 지정자 +n은 첫번째 필드로부터 n필드에서 시작하여, 각 라인의
끝까지 라인들을 대조할 것을 지시한다. 예를들면, +3이란 지정은
첫번째 필드로부터 3번째 필드 또는 4번 필드로부터 비교를 시작하여
각라인의 끝까지 비교를 계속한다.

필드 지정자 -n은 첫번째 필드에서 n 필드에서 비교를 정지하라는 것을
sort 명령어에 지시한다. ( 만약 sort 명령어에서 정지 필드를 지정하지
않을 경우에는 전술한것 같이 각 라인의 끝까지 비교된다. ) 예를들면,
-4라는 지정은 첫번째 필드에서부터 상대적으로 4번째 필드 직전에서
또는 4번 필드에서 비교를 정지하라는 것을 지시한다.

위에서 지정한 +n과 -n을 같이 지정할 수 있다.
예를들면, sort +3 -4 file이라고 지정하면, 입력 화일의 각 라인의
4번째 필드만을 정렬의 대상으로 삼는다.

sort 필드는 한정된 문자들의 범위를 그 이상으로 제한할 수 있다.
그 형식은 sort 필드를 지정하는 것과 유사하다. 예를들면 +2.3은
3번째 필드의 4번째 문자부터 시작하여 입력 화일의 각 라인을 정렬한다.

기본적인 필드 구별자는 공백이나 탭이기 때문에, 원하는 필드의 정렬을
보증하기 위해 -t 옵션을 사용하여 임의의 필드 구별자를 지정한다.

┌─────────────┐
│ $sort -t: +2.4 test      │
└─────────────┘


복수개의 시작과 정지 필드 지정자는 각 라인의 구성 형식이 동일한
라인들에 대한 정렬 필드를 지정하기 위해 지정할 수 있다.

┌─────────────┐
│ $sort +2 -3 +4 -5        │
└─────────────┘


( 옵션 )

+n 정렬을 시작하기 위해 첫번째 필드부터 n필드를 생략한다.
-n 첫번째 필드부터 n 필드전에 정지한다.
-tchar
char로 지정한 문자를 새로운 필드 구별자로 선언한다.

---------------------------------------------------------------------------



화일의 삭제 : rm
---------------------------------------------------------------------

1. 화일의 삭제

rm - 지정한 화일로의 링크를 삭제한다.

┌────────────┐
│ $rm [-option] file(s)  │
└────────────┘


rm 명령어는 화일로의 링크를 삭제한다. 화일의 마지막 링크가 삭제
되었을때, 화일은 억세스 불가능하게 되고, 화일이 점유하고 있던
디스크 영역은 다른 화일에 할당되어 진다. 만약 화일이 심볼릭 링크된
화일일 경우에는, 화일 링크는 삭제되고, 본래의 화일은 그대로 유지된다.

화일을 삭제하기 위해서는 화일이 위치하고 있는 상위(parent) 디렉토리에
대해 읽기(read)및 실행(execute) 접근 권한이 있어야만 한다. 그러나
화일로의 읽기(read)및 쓰기(write) 접근 권한은 요구되지 않는다. 이경우
rm 명령어는 화일의 접근권한을 표시하고, 화일의 삭제 여부를 묻는
메세지를 표시한다. 이때 y라고 응답하면 화일이 삭제되고, 다른 응답을
할 경우에는 화일은 그대로 유지된다. 그리고 명령어 상에 -f 옵션을
지정할 경우에는, rm 명령어는 위와같은 경우에 쓰기(write) 접근 권한이
없는 화일을 삭제하기 위해서, 응답 메세지를 표시하지 않는다.

┌───────────┐
│ $rm -f employees     │
└───────────┘


복수개의 화일을 대화식으로 삭제하기 위해서는 -i 옵션을 사용한다.
이 옵션은 각각의 지정된 화일을 삭제하기 위해 응답 메세지를 표시한다.
개별적으로 화일명을 지정하지 않고, 복수개의 화일을 지정하기 위해
특수문자들을 사용할 수 있다.

┌──────────┐
│ $rm file* memo     │
└──────────┘


-r 옵션은 지정한 디렉토리, 디렉토리내의 화일, 서브 디렉토리와
디렉토리 자체를 삭제한다. 이경우 동일 명령어 라인상에 -f 옵션이
지정되어 있다 하더라도, 쓰기금지된 화일들에 대해서는 삭제 여부를 묻는
응답 메세지를 표시한다. 이 옵션은 주의하여 사용한다. 그리고 이 옵션을
사용할 경우에는 -i옵션을 함께 사용함으로써 필요한 화일을 부주의하게
삭제하는 것을 피할것을 권장한다.

┌─────────────┐
│ $rm -ir report/annual    │
└─────────────┘

( 옵션 )

-f 삭제 여부를 묻는 응답 메세지를 표시하지 않고, 쓰기 금지된
화일을 강제적으로 삭제한다.
-i 대화식으로 화일을 삭제한다.
대상 화일마다 삭제여부를 묻는 응답 메세지가 표시된다.
-r 지정한 디렉토리와 디렉토리내의 화일 그리고 서브 디렉토리들을
모두 삭제한다.

---------------------------------------------------------------------------



디렉토리및 화일 억세스 관리 개요
---------------------------------------------------------------------

1. 디렉토리및 화일 억세스

유닉스는 로그인 명과(logname) 패스워드(passwd)를 통하여 시스템으로의
억세스를 제어한다. 화일및 디렉토리로의접근 권한(permission)은
누가 각각의 화일 또는 디렉토리를 억세스 할수 있는지 또는 어떤 형태의
억세스를 할수 있는지를 제어하기 위해 사용된다.

logname                           ┌────────┐
            ┌───┐─────> ┤ UNIX           │
            └─┰─┘─────> ┤ System         │
            ▒▒▒▒▒ password   └───┬┬───┘
Terminal                          ┌───┘└───┐
                                  └────────┘


화일과 디렉토리가 생성될때, 유닉스는 사용자의 로그인 명으로 누가 생성
하였는지를 기록한다. 이때 생성한 사용자를 화일및 디렉토리의
소유자(owner)라 한다.

유닉스 억세스 접근 권한 사상은 소유자에게 다른 사용자와의 화일및
디렉토리의 공유, 특정 사용자에 대한 억세스 제한및 소유자의 화일과
디렉토리로의 억세스 형태를 한정할 수 있도록 허용한다. 시스템 관리자 즉,
super user는 소유자가 아니라도 또는 접근 권한이 없다 하더라도
모든 참조 권한을 갖는다.

2. 사용자의 분류

유닉스에서는 화일및 디렉토리를 억세스할 수 있는 3 부류의 사용자가 있다.

1) 화일 또는 디렉토리의 소유자(owner)

2) 화일 또는 디렉토리의 소유자가 속하는 그룹에 속한 다른 사용자
: group

통상, 그룹은 동일 부서에 근무하거나 동일 프로젝트에 종사하는
개개인들을 포함하여 구성된다. 동일 그룹에 속하는 사용자들은
통상 Group id 또는 GID라 부르는 동일 그룹번호를 할당 받는다.
이 번호는 각 사용자에 대한 다른 제어 정보와 함께 /etc/passwd
화일에 저장된다. 또한 /etc/group 화일에는 시스템 상의 모든 그룹에
대한 정보들이 저장되어 있다.

3) 화일 또는 디렉토리의 소유자가 속하는 그룹에 속하지 않는
시스템상에 존재하는 기타의 사용자 : other

3. 사용자및 그룹을 관리하는 시스템 화일

/etc/passwd와 /etc/group 화일들은 시스템 사용자와 그룹에 대한
제어 정보들을 갖고 있다. 시스템 자원 관리와 사용자 관리는
기본적으로 시스템 관리자의 책임이다.

다음은 "디렉토리및 화일 억세스 관리"를 설명하기 위해서 사용될
/etc/passwd 화일및 /etc/group 화일의 예제및 설명이다.

┌──────┐
│/etc/passwd │
└──────┘
┌───────────────────────────┐
│user1:x:101:100:User 1 account:/home/user1:/sbin/sh   │
│user2:x:202:200:User 2 account:/home/user2:/sbin/sh   │
│user3:x:103:100:User 3 account:/home/user3:/sbin/sh   │
│user4:x:104:100:User 4 account:/home/user4:/sbin/sh   │
│user5:x:105:100:User 5 account:/home/user5:/sbin/sh   │
└───────────────────────────┘

/etc/passwd 화일은 여러개의 필드로 구성되어 있다.
이 화일의 한 라인은 한명의 사용자에 대한 등록정보들이다.
각각의 라인들은 총 7 개의 필드로 구성되는데, 각각의 필드가
나타내는 정보는 다음과 같다.

user1 -> 사용자의 logname
x -> 패스워드 설정 여부 : x라고 지정되어 있으면, 사용자가
패스워드 기능을 사용하고 있음을 의미.
또한 이필드는 패스워드의 실질적 내용을 보존하고 있는
/etc/shadow 화일로 연결되어 있다.
101 -> 사용자의 UID
100 -> 사용자의 GID :: 이를 primary directory라 한다.
[[[ 차후 자세히 설명된다. ]]]
User 1 account -> 관리자가 기술한 사용자에 대한 주석(comment)
/home/user1 -> 사용자의 초기 로그인 디렉토리
( home directory )
/sbin/sh -> 로그인후 처음 기동할 로그인 쉘 또는 프로그램

여기에서 우선 주목해야 할 것이 있다. GID와 UID라는 것이다.
이들은 사용자및 그룹을 구별하기 위해 시스템에 의해서 사용되는
내부 식별자들로서, 관리자에 의해 지정된다. 이들과 유사한
로그인 식별명과 그룹 식별명이 있는데 이들은 사용자 관점에서 본
식별자들이다. 이를 그림으로 설명하면..

              ┏━━┓               ┏━━┓
(사용자 관점) ┃ 사 ┃ (시스템 관점) ┃ 그 ┃
로그인      ─┨ 용 ┠─UID 그룹   ─┨ 룹 ┠─GID
식별명        ┃ 자 ┃ 식별명        ┃    ┃
              ┗━━┛ (사용자 관점) ┗━━┛ (시스템 관점)

┌──────┐
│/etc/group  │
└──────┘
┌──────────────────────┐
│grp100::100:user1,user3,user5               │
│grp200::200:user2,user4                     │
│grp300::300:user1,user2,user3,user4,user5   │
└──────────────────────┘


grp100 -> 그룹 식별명
미사용 -> 두번째 필드는 그룹 패스워드 필드로 SVR4.0 버전에선
사용하지 않는다.
100 -> GID
user1,user3,user5 -> 그룹에 속한 사용자 식별자들

5. 참조 권한의 종류

이번에는 사용자가 화일 또는 디렉토리에 대해서 수행할 수 있는
작업 행위를 지정하기위한 접근 권한의 3가지 종류에 대해 설명한다.

. 읽기(Read: r) 화일 또는 디렉토리의 내용을 참조할 수 있는
접근 권한
. 쓰기(Write: w) 화일내의 데이타 또는 디렉토리의 내용을
변경할 수 있는 접근 권한
. 실행(Execute: x) 화일내의 프로그램을 수행하거나,
디렉토리의 내용을 억세스할 수 있는 접근 권한

디렉토리의 접근 권한에 대해서는 또다른 고려사항들이 있다.

. 디렉토리의 접근 권한은 화일의 기본적인 처리에 영향을 미친다.
예를들면, 만약 디렉토리가 모든 사용자에게 접근 권한이 허용되면,
사용자에 화일의 read, write, execute 접근 권한이 허용되지
않는 경우라도, 디렉토리내의 화일들을 삭제할수 있다.

. 실행 접근 권한은 디렉토리에 대해서는 화일과는 다른 의미를 갖는다.
디렉토리에 대해서 실행 권한이 주어지면, 디렉토리의 내용을 검색하거나
참조할 수 있게 허용한다.

---------------------------------------------------------------------------



접근 권한(Permission)의 제어 I
---------------------------------------------------------------------

1. 디렉토리및 화일의 접근 권한 확인

ls -l 명령어는 화일과 디렉토리의 속성을 표시한다.
ls -l 명령어의 실행 결과는 다음과 같다.

$ls -l
total 5
┌─────┐
│drwxr-xr-x│ 2 user1 grp100 512 May 1 3:34 .
│drwxr-xr-x│ 2 user1 grp100 512 May 7 10:30 ..
│drwxr-xr-x│ 2 user1 grp100 512 Jun 4 15:04 Budget
│drwxr-xr-x│ 2 user1 grp100 512 Jun 11 08:47 Expenses
│drwxr-xr-x│ 2 user1 grp100 512 Jun 11 09:16 Salaries
│-rw-r--r--│ 2 user1 grp100 512 Jul 9 11:02 memo1
│-rw-r--r--│ 1 user1 grp100 984 Jul 23 14:17 supplies.aug
└┬────┘
  └─ 디렉토리와 화일의 접근권한

┌─────────────┐
│   d rwx r-x r-x          │
│   - rw- r-- r--          │
└─┬──┬──┬───┬─┘
    │    │    │      │Others
    │    │    │ Group
    │    │ User(Owner)
    │ File Type


위의 ls -l 명령의 실행 결과에서 첫번째 필드는 화일 종류와 접근 권한을
나타낸다. 이 필드에서 첫번째 문자는 ,통상 d 와 -, 화일 종류를 나타낸다.
이때 d는 디렉토리를, -는 일반 화일을 의미한다.

화일 종류를 나타내는 문자에 뒤따르는 9 문자는 화일 또는 디렉토리의
접근권한을 나타낸다. 이 9 문자는 3가지 부류의 사용자별 접근 권한이
표시된다. 또한 개개의 사용자 부류별 r (Read), w (Write), x (Execute)의
순서로 접근 권한이 표시된다. 여기에서 -표시는 그 위치에 상응하는
접근 권한이 거부된 것을 의미한다. 예를들면, drwxr-xr-x는 소유자는
read,write,execute 접근 권한이 있음을, 소유자가 속한 그룹의 member와
시스템상의 다른 사용자들에게는 read와 execute 접근 권한만이 부여되어
있음을 의미한다. chmod 명령어는 이와같이 화일및 디렉토리에 부여되어
있는 접근 권한을 변경하기 위해 사용한다.

하나의 디렉토리가 새롭게 생성 되었을때 부여되는 디폴트 접근권한은
모든 사용자에게 read,write,execute를 허용한다.
또한 새롭게 생성된 화일에 대한 디폴트 접근 권한은 각각의 사용자들에게
read,write만을 허용하는 것이다.
이러한 디폴트 접근 권한들은 umask 명령어에 의해 변경할 수 있다.

2. 접근 권한(Permission)의 변경

chmod : 화일 또는 디렉토리의 접근 권한을 할당하거나 변경한다.

┌────────────────┐
│ chmod [-option] mode file(s)   │
└────────────────┘


chmod 명령어의 형식에서 mode는 Absolute 또는 Symbolic 형식으로
지정 가능하다. 이들에 대해서는 이후 자세히 설명된다.
또한 소유자(Owner)와 관리자(Superuser)만이 화일및 디렉토리의
접근 권한에 대한 제어를 수행할 수 있음을 주목해야 한다.

( 옵션 )

-R 지정한 디렉토리내의 모든 화일과 서브 디렉토리들에
지정한 접근 권한을 설정한다. 이 옵션을 사용하지 않으면
현재의 디렉토리와 화일에만 영향을 준다.

3. 접근 권한의 지정 형식

chmod 명령어 상에서 지정하는 접근 권한은 absolute와 symbolic 형식의
두가지 형식중 하나를 지정한다. absolute 형식은 각 사용자별 접근 권한을
표시하기 위해서 숫자를 사용한다. 그러나 symbolic 형식은 접근 권한을
나타내는 문자와 부호의 조합으로 지정한다.

이 두가지 형식을 사용하는 예는 다음과 같다.

1) Absolute 형식
┌────────────┐
│ $chmod 744 memo        │
└────────────┘

2) Symbolic 형식
┌───────────────┐
│ $chmod ug+x,o-r memo         │
└───────────────┘

3.1 Absolute 형식 : Octal 형식

다음 예는 각각의 접근 권한을 할당하기 위한 숫자 값들을 보여준다.

┌──────┬────────────────────────┐
│접근 권한의 │ 사용자 구별                                    │
│ 종류       ├────────┬───────┬───────┤
│            │ 소유자(Owner)  │ 그룹(Group)  │ 기타(Other)  │
├──────┼────────┼───────┼───────┤
│       read │ 4              │ 4            │ 4            │
├──────┼────────┼───────┼───────┤
│ write      │ 2              │ 2            │ 2            │
├──────┼────────┼───────┼───────┤
│ execute    │ 1              │ 1            │ 1            │
├──────┼────────┼───────┼───────┤
│ access 금지│ 0              │ 0            │ 0            │
┝━━━━━━┿━━━━━━━━┿━━━━━━━┿━━━━━━━┥
│ Total      │ 7              │ 7            │ 7            │   
└──────┴────────┴───────┴───────┘


위 도표에서 숫자들은 각각의 사용자에 부여하는 참조 권한을 한정
시키는데 이용한다. 각각의 사용자에 부여할 접근 권한의 지정은
0부터 7까지의 8가지 Total 값으로 표형한다. 8가지 Total값들이
나타내는 의미는 다음과 같다.

0 참조 금지
1 실행만을 허용
2 쓰기만을 허용
3 쓰기및 실행만을 허용
4 읽기만을 허용
5 읽기및 실행만을 허용
6 읽기및 쓰기를 허용
7 읽기,쓰기,실행을 허용

그러면 예제를 통해 각각의 숫자 형식의 접근 권한을 설명해 본다.
┌─────┴──────────────────────┐
│$ls -l prog1                                            │
│-rw-r--r-- 1 user1 grp100 1475 Jul 9 11:02 prog1        │
│$chmod 755 prog1                                        │
│$ls -l prog1                                            │
│-rwxr-xr-x 1 user1 grp100 1475 Jul 9 11:02 prog1        │
└────────────────────────────┘
이 예는 chmod 명령어를 사용하여 접근 권한을 변경하는 것을 보여준다.
예의 처음에서 ls -l 명령어를 사용하여 prog1이라는 화일의 전반적인
속성을 보여주고 있다. 이 화일은 프로그램 화일이라 가정하면, 이 화일은
실행을 하기위해서는 실행 접근 권한이 필요로 하게 된다. 그래서
chmod 명령어를 통해 각각의 사용자들에게 실행 접근 권한을 부여하고
있다. 이때 chmod 명령어에 기술되어 있는 755라는 숫자의 의미를
분석해 보자.

chmod 명령어를 수행하기 이전의 prog1 화일의 접근 권한은 다음과 같다.

소유자 read(4) + write(2) + execute 금지 = 6
그 룹 read(4) + write 금지 + execute 금지 = 4
기 타 read(4) + write 금지 + execute 금지 = 4
─────────────────────────
여기서 ()속에 있는 숫자는 해당 접근 권한을 부여하기
위한 숫자 값을 의미한다.

이와 같은 접근 권한 상태에서 각각의 사용자에 대해 기존의 접근권한을
유지한 상태로 실행 권한을 부여하기 위해 다음과 같이 연산을 한다.

소유자 read(4) + write(2) + execute(1) = 7
그 룹 read(4) + write 금지 + execute(1) = 5
기 타 read(4) + write 금지 + execute(1) = 5

따라서 원하는 접근 권한을 화일에 부여하기 위해서는 755라는 숫자값을
사용해야 함을 알수 있다.

실행후 접근 권한의 변경을 확인하기 위해서 또한번 ls -l 명령을
실행하고 있다.

┌─────────────────────────────┐
│$ls -ld Salaries                                          │
│drwxr-xr-x 2 user1 grp100 512 Jun 11 09:16 Salaries       │
│$chmod 750 Salaries                                       │
│$ls -ld Salaries                                          │
│drwxr-x--- 2 user1 grp100 512 Jun 11 09:16 Salaries       │
└─────────────────────────────┘


위의 예에서 Salaries 라는 디렉토리는 비밀 유지가 필요로 하는
급여 관련 정보들이 들어 있다고 가정하자. 그렇다면 이디렉토리는
급여 관련 정보를 관리하는 사용자 이외에는 억세스하지 못하게
해야 할 것이다. 따라서 이 예에서는 소유자및 그룹에 속하는
사용자가 아닌 다른 사용자(other)들에게 억세스 권한을 전혀 주지
않도록 chmod 명령어를 사용하는 것을 보여주고 있다. chmod 명령어상에
지정된 0이라는 숫자는 억세스 권한을 전혀 부여하지 않음을 나타낸다.

---------------------------------------------------------------------------



접근 권한(Permission)의 제어 II
---------------------------------------------------------------------

3.2 기호(Symbolic) 형식의 접근 권한 지정

기호 형식은 접근 권한을 지정하기 위해서 문자와 기호들을 사용한다.
기호 형식은 다음과 같은 3가지의 요소로 구성된다.

-. 사용자 구분
-. 제어 형식
-. 접근 권한의 종류

각 요소들은 다음과 같다.

-. 사용자 구분

접근 권한을 제어할 사용자 구분을 지정시에는 다음 문자들을
사용한다.
-. u 소유자(owner)
-. g 그룹(group)
-. o 기타(other)
-. a 모든 사용자(owner+group+other)

여기에서 기본적인 사용자 구별이 아닌 모든 사용자를지칭하는
a라는 문자가 제공됨을 주목하기 바란다.

-. 제어 형식

제어 형식은 지정한 사용자에 어떻게 접근 권한이 변경될 것인가를
지정한다. 다음과 같은 기호로 제어 형식을 지정한다.

+ 접근 권한을 부여한다.
- 접근 권한을 제거한다.
= 명시적으로 접근 권한을 할당한다.

+ 와 - 연산자는 현재 설정되어 있는 접근 권한에 관련된 접근 권한을
추가하거나 삭제한다. = 연산자는 현재 설정되어 있는 접근 권한을
모두 삭제한 상태에서 지정한 접근 권한을 부여한다.

-. 접근 권한의 종류

이미 설명한바와 같이 접근 권한에는 3가지가, 즉 읽기(r), 쓰기(w)와
실행(x) , 있다. 그러나 접근 권한의 금지를 의미하는 - 기호는
사용되지 않음을 주목하기 바란다.

다음에 기호 형식을 사용하여 접근 권한을 제어하는 예제들을 보여준다.

┌─────────────────────────────┐
│$ls -ld Budget                                            │
│drwxr-xr-x 2 user1 grp100 512 Jun 4 15:04 Budget          │
│$chmod go-x Budget                                        │
│$ls -ld Budget                                            │
│drwxr--r-- 2 user1 grp100 512 Jun 4 15:04 Budget          │
└─────────────────────────────┘


Budget 디렉토리에 대해서 그룹과 기타의 실행 접근 권한을 제거하는
예제이다. 여기에서 사용자 구분을 표시하는 문자들 사이에 공백이
없음을 주목하기 바란다.

┌─────────────────────────────┐
│$ls -l prog2                                              │
│-rw------- 1 user1 grp100 1986 Jun 13 08:26 prog2         │
│$chmod a=rx prog2                                         │
│$ls -l prog2                                              │
│-r-xr-xr-x 1 user1 grp100 1986 Jun 13 08:26 prog2         │
└─────────────────────────────┘


이 예에서는 모든 사용자에 대해서 읽기와 실행 권한을 명시적으로
부여하는 것을 보여주는 예제이다. 여기서 접근 권한을 변경하기 전에
소유자에게는 쓰기 권한이 부여되고 있었는데, chmod 명령 실행후
쓰기 권한이 제거된 것에 주목해야 한다. 이는 = 연산자는 이전의
접근 권한을 모두 제거한 후 새롭게 권한을 부여함을 의미한다.

┌────────────────────────────┐
│$ls -l temp                                             │
│-rwxr-xr-x 1 user1 grp100 512 Jun20 09:33 temp          │
│$chmod go= temp                                         │
│$ls -l temp                                             │
│-rwx------ 1 user1 grp100 512 Jun 20 09:33 temp         │
└────────────────────────────┘


이 예에서는 = 연산자를 통해 그룹과 기타의 접근 권한을 모두
삭제하는 것을 보여준다. = 연산자를 사용할 경우 = 연산자 이후에
접근 권한의 종류를 지정하지 않을 경우, =연산자는 지정 사용자의
모든 접근 권한에 영향을 미친다는 것을 보여준다.

┌─────────────────────────────┐
│$ls -l script                                             │
│-rw-rw-rw- 1 user1 grp100 2475 Jul 19 11:42 prog1         │
│$chmod go-w,a+x script                                    │
│$ls -l script                                             │
│-rwxr-xr-x 1 user1 grp100 2475 Jul 19 11:42 prog1         │
└─────────────────────────────┘


이 예에서는 하나의 chmod 명령어에서 복수개의 접근 권한 제어를
,를 사용하여 지정하는 방법을 보여준다. 이때 각각의 접근 권한
지정사이에 공백이 없음을 주목하기 바란다.

4. 디폴트 접근 권한의 변경

umask : 새롭게 생성되는 화일이나 디렉토리에 대해 부여되는
디폴트 접근 권한을 변경한다.

디폴트 접근 권한은 디렉토리에 대해서는 777(rwxrwxrwx)이,
화일에 대해서는 666(rw-rw-rw-)이다. 이러한 디폴트 접근 권한은 변경할
수 있다. 이런한 디폴트 접근 권한은현재의 세션내에서만 또는
로그인시에 자동적으로 변경되도록 설정할 수 있다.

자동적으로 디폴트 접근 권한을 변경하기 위해서는 변경 명령인 umask
명령을 시스템 화일인 /etc/profile에 선언하거나, 사용자 환경 제어하는
사용자 home 디렉토리 속의 .profile 화일속에 선언하면 된다. 이 화일들은
사용자 로그인시에 자동적으로 실행되는 쉘 프로그램들이기 때문에
디폴트 접근 권한이 자동적으로 지정된 값으로 변경된다.

umask 명령어는 3부류의 사용자들에 대해 선별적인 접근 권한의 지정을
위해서 8진수 3자리를 이용한다. 이때 지정된 3자리의 8진수들은 상응하는
디폴트 사용자별 접근 권한으로 부터 빼게 된다. 예를들면 umask 022
명령은 이미 설정되어 있는 umask값을 참조하지 않고, 항상 디폴트 접근
권한을 참조한다. 소유자의 접근 권한은 변경되지 않고( 현재의
디폴트 접근 권한에서 0을 뺌으로 변하지 않는다. ),
다만 그룹과 기타에 해당하는 쓰기 권한을 제거한다. 이 명령어 실행후에
새로운 화일이나 디렉토리들에 제공될 접근 권한은 다음과 같이 계산된다.

디렉토리의 경우

디폴트 접근 권한 777(rwxrwxrwx)
umask 명령상에 지정된 8진수 값 - 022
──────────────────────
새로운 디렉토리에 부여되는 접근 권한 755(r-xr-xr-x)

화일의 경우

디폴트 접근 권한 666(rw-rw-rw-)
umask 명령상에 지정된 8진수 값 - 022
───────────────────────────
새로운 화일에 부여되는 접근 권한 644(rw-r--r--)

다음은 umask 명령어를 사용하는 예이다.
┌──────────────────────────────┐
│$umask                                                      │
│022                                                         │
│ls -l                                                       │
│drwxr-xr-x 2 user1 grp100 512 Jun 4 15:04 old_dir           │
│-rw-r--r-- 1 user1 grp100 2358 Jun 4 11:19 old_file         │
│$umask 000                                                  │
│$cat > newfile                                              │
│This file is created after                                  │
│the new permission mask.                                    │
│<^d>                                                        │
│$mkdir new_dir                                              │
│$ls -l                                                      │
│drwxr-xr-x 2 user1 grp100 512 Jun 4 15:04 old_dir           │
│-rw-r--r-- 1 user1 grp100 2358 Jun 4 11:19 old_file         │
│drwxrwxrwx 2 user1 grp100 512 Jun 9 13:21 new_dir           │
│-rw-rw-rw- 1 user1 grp100 1561 Jun 9 13:23 new_file         │
└──────────────────────────────┘


8진수 값을 지정하지 않은, umask 명령은 현재 설정되어 있는
umask 설정 값을 표시한다. 예제에서 umask명령을 실행하기 전에
umask 값이 설정되어 있는 것을 볼수 있는데, 이 값은 통상
/etc/profile속에 선언되어 있는 값으로, 사용자 로그인시에 자동적으로
설정되도록 되어 있다. 따라서 이 예에서는 본래의 디폴트 값으로
umask 값을 되돌린후 새로운 화일과 디렉토리를 생성하여, 그들에
적용된 접근 권한을 보여주고 있다. 여기서 주목해야 할 것은 umask 명령이
기존의 화일및 디렉토리에는 (예에서는 old_file과 old_dir이 해당된다.)
영향을 끼치지 않는다는 것이다.


---------------------------------------------------------------------------



화일의 소유권(ownership) 제어: chown
---------------------------------------------------------------------

1. 화일의 소유권(ownership) 제어

chown - 화일과 디렉토리의 소유자를 변경한다.

화일및 디렉토리의 소유권을 변경함은 사용자들 사이에 정보를 공유하기
위한 한 방편이다.

┌─────────────────┐
│ chown [-option] 사용자 화일명    │
└─────────────────┘


chown 명령어 라인상에서 사용자는 /etc/passwd 화일에 선언되어 있는
로그인 명 또는 UID 번호를 지정할 수 있으며, 화일명은 다수의 화일 또는
다수의 디렉토리들을 지정할 수 있다. 명령어 수행후 대상 화일의
접근 권한은 변경되지 않는다.

화일의 소유자및 관리자만이 화일의 소유권을 변경할 수 있으며, 한번
소유자가 다른 사용자에게 소유권을 넘겼을 경우에는 다시 본래의
사용자에 의해 소유권을 되돌려 받을 수 없음을 주목해야만 한다.
그러나 이 경우에 새로운 소유자에 의해선 본래의 사용자에게
소유권을 되돌릴 수 있다.

( 옵션 )

-R 지정한 디렉토리내의 하부 구조들 즉, 서브 화일및
서브 디렉토리들까지 소유권을 변경한다.
그러나 심볼릭 링크된 화일들의 소유권은 변경하지 않는다.

-h 심볼릭 링크된 화일들의 소유권을 변경한다.

┌─────────────────────────────┐
│$ls -l prog3                                              │
│-rwxr-xr-- 1 user1 grp100 1765 Jul 2 13:34 prog3          │
│$chown user2 prog3                                        │
│$ls -l prog3                                              │
│-rwxr-xr-- 1 user2 grp100 1765 Jul 2 13:34 prog3          │
└─────────────────────────────┘


이 예는 우선 ls -l 명령어를 통해 prog3 화일의 접근권한및 소유권을
보여주고, chown 명령어를 사용하여 화일의 소유권을 user2에
변경을 수행한 후 ls -l 명령어를 통해 소유권 변동을 확인하고 있다.
여기서 주목할 것은 소유권 변경후에도 화일의 접근 권한은 변경되지
않는 점과 chown 명령어를 실행한 사용자가 user1 즉, 화일의 소유자라는
점을 주목해야 한다.

그러면 user1이 user2에게 화일의 소유권을 넘긴후에 다시 user1이
해당 화일의 소유권을 가져올 수 있을까? 물론 이런 시도는 에러 처리된다.
이유는 이미 소유권은 user2에게 넘어 갔기 때문에 user1은 소유자가
아니기 때문이다. 다음 예는 이를 보여준다.

┌──────────────┐
│$chown user1 prog3          │
│chown: user1: Not owner     │
└──────────────┘


이런 경우 새로운 소유자인 user2가 소유권을 넘기는 명령을 실행하면,
원래의 소유자인 user1에게 소유권을 돌릴 수 있다.

---------------------------------------------------------------------------


사용자의 소속 그룹(membership) 제어 I

그룹 소속 관계와 억세스 접근 권한

1. 그룹 소속 관계와 억세스 접근 권한

/etc/group 화일에 각 그룹의 일원으로써 사용자가 등록되어 있기만 하면,
사용자는 한번에 하나의 그룹씩 복수개의 그룹에 소속될 수 있다.
( 어느 한 싯점에 사용자가 소속된 그룹은 오직 하나의 그룹이다. )

유닉스에서는 사용자가 소속 그룹을 변경할 수 있는 기능을 제공하는데,
변경을 수행해도 /etc/passwd 화일내에 지정된 그룹 식별자(GID)는 사용자의
기본 그룹을(이를 Primary Group이라 한다.) 유지한다.
( Primary Group은 사용자가 로그인 작업을 수행시 자동적으로
사용자의 소속 그룹으로 설정된다. )
이 그룹의 식별자는 사용자의 화일과 디렉토리들의 정보속에 선언되어 있다.
특정 화일및 디렉토리의 소유자및 그룹 이름은 ls -l 명령어를
사용하여 표시할 수 있다.

그룹의 소속 관계는 동일 그룹의 멤버들이 소유하고 있는 화일과
디렉토리들의 억세스 권한에 대한 제어를 할수 있게 한다.

이 부분을 예를통해 좀더 자세히 설명한다.
예를들어 myfile이라는 화일이 있다고 가정하자.

┌────────────────────────────┐
│ $ls -l myfile                                          │
│ -rwxr----- 2 user2 grp200 512 May 7 13:34 myfile       │
│ $grep 'user1' /etc/passwd                              │
│ user:x:100:100:user logid:/sbin/sh                     │
│ $grep 'user1' /etc/group                               │
│ grp100::100:user1                                      │
│ grp200::101:user1,user2,user3                          │
└────────────────────────────┘


이 화일은 소유자에게는 모든 권한을, 그룹에게는 읽기및 실행 권한을
부여하나, 기타에는 어떠한 접근 권한을 부여하고 있지 않다.
그리고 user1이라는 사용자는 이 화일을 억세스 할 수 있을까?
물론 현싯점에서는 불가능 할 것이다. 그 이유는 우선, 이 화일은
소유자및 그룹에 대해서만 참조 권한을 부여하고 있다. 그러나
user1은 소유자도 아니고, 기본그룹(primary group)으로 grp100이라는
그룹에 속해 있기 때문에 당연히 참조 권한이 부여되지 않는다.
이런 상황에서 user1이라는 사용자가 업무상 이 화일을 읽기를(read)
해야 할 필요가 있다고 할 경우에, user1이라는 이 화일을 읽기할 수
있는 방법은 무엇일까?

여러가지를 생각해 볼수 있을 것이다.
우선은 이 화일의 소유권을 이미 설명했던 chown 명령을 사용하여
user1에게 넘기는 방법을 생각할 수 있을 것이다. 그러나 이 방법은
본래의 소유자인 user2의 접근 권한에 영향을 주기 때문에 함부로
적용할 수 없을 것이다.
또다른 방법을 생각해 보면은 myfile의 소속 그룹을 grp100으로 변경하는
방법을 생각할 수 있다. 그러나 이 경우에도 grp200이라는 그룹에 속해
있는 다른 사용자에 영향을 주기 때문에 적용하기 곤란할 것이다.
( 화일의 소속 그룹을 grp100으로 바꾸면, user3가 그 싯점에서
화일을 억세스 불가능하게 된다. )
이런 경우에 가장 효율적으로 특정 사용자에게 특정 화일의 접근 권한을
부여하는 방식이 바로, 사용자의 소속 그룹의 변경인 것이다.
( 위의 예에서는 user1의 소속 그룹을 grp100에서 grp200으로 변경하는
경우가 된다. )
위와 같은 문제를 해결하기위한 소속 그룹의 변경 방식은 이후 자세히
설명된다.

id 명령어는 명령어를 실행하고 있는
사용자의 사용자 식별명과 소속된 기본 그룹명을 표시한다. 그리고
groups 명령어는 사용자가 소속된 모든 그룹을 표시해준다.
사용자가 소속된 기본 그룹이외의 다른 그룹(Secondary Group)에 속한
화일과 디렉토리들은 다음 명령어들을 사용해 억세스할 수 있다.

. chgrp 명령어는 화일과 디렉토리의 소속 그룹을 다른 그룹으로 변경한다.
. newgrp 명령어는 사용자의 소속 그룹을 화일과 디렉토리에 대해
접근 권한을 갖고 있는 다른 그룹으로 변경한다.

2. 사용자의 사용자 식별명과 그룹 식별명의 확인

id 현재 명령어를 입력하고 있는 사용자및 그룹 식별명과 식별번호를
( GID와 UID를 말한다. ) 표시한다.

┌──────────┐
│ id [-option]       │
└──────────┘

id 명령어에 의해 표시되는 사용자 정보는 /etc/passwd 화일로부터
취해진다. 또한 그룹 식별명은 /etc/group 화일로 부터 취한다.
만일 명령어 실행후에 그룹 정보가 표시되지 않으면, 이는 사용자가
/etc/group 화일에 그룹의 일원(membership)으로 등록되지 않았음을
의미한다.

( 옵션 )

-a 사용자가 소속된 모든 그룹을 표시한다.

( 예제 )

┌────────────────┐ 이 예는 가장 기본적인 id 명령어의
│$id                             │ 사용예를 보여준다.
│uid=101(user1) gid=100(grp100)  │
└────────────────┘

┌───────────────────────────────┐
│$id -a                                                        │
│uid=101(user1) gid=100(grp100) groups=100(grp100),300(grp300) │
└───────────────────────────────┘


이 예는 -a 옵션을 사용하여 사용자가 속한 모든 그룹을 표시하고 있다.

3. 사용자 소속 그룹 정보의 확인

oups 사용자의 그룹 소속 관계를 표시한다.
┌────────────┐
│ groups [user(s)]       │
└────────────┘



groups 명령어는 현재 명령어를 입력하고 있는 사용자 또는 지정한 사용자의
그룹 소속 정보를 표시한다. 명령어 출력상의 첫번째 내용은 /etc/passwd
화일에 정의되어 있는 사용자의 기본 그룹(Primary Group)을 참조한 것이고,
다른 내용들은 /etc/group 화일로부터 얻어진 사용자의 소속 그룹 관련
정보이다. 만일 소속 그룹이 /etc/passwd 화일내에 사용자의 등록 정보속에
기본 그룹으로 이미 정의되어 있고, 또한 사용자가 /etc/group 화일에서
해당 그룹의 일원으로써 선언되어 있다면, 중복된 그룹 정보가 표시된다.

( 예제 )

┌────────────────┐
│$grep 'user*' /etc/group        │ 이 예에서 grep 명령어를 통해서
│grp100::100:user1               │ etc/group 화일내에 user라는
│grp200::200:user2               │ 문자열이 들어있는 사용자 식별명
│grp300::300:user3,user5         │ 들이 속한 그룹들을 보여주고 있다.
│$id                             │ 여기에서 보면 user1 사용자는
│uid=101(user1) gid=100(grp100)  │ grp100이라는 그룹에 속한 것을
│$groups                         │ 볼수 있다. 그리고 id 명령어를
│grp100 grp100                   │ 통해 지금 명령어를 실행하고 있는
└────────────────┘ 사용자가 user1임을 확인해 준다.
이후 groups 명령을 실행하여 사용자의 소속 그룹을 보여준다.
이때 결과상에서 보면은 grp100이라는 그룹명이 2개가 표시되는데,
이는 직전 grep 명령어에 의해서 확인했듯이 user1이 /etc/group 화일에도
grp100 그룹에 등록되었기 때문이다. 처음의 grp100 정보는 /etc/passwd
화일로 부터 가져온 정보이다.


┌────────┐ 이 예는 명령어를 실행하는 사용자가 아닌 특정의
│$groups user2   │ 사용자에 관련된 소속 그룹 정보를 확인하는
│grp100 grp200   │ 것을 보여주는 예이다.
└────────┘
┌────────────┐ 이 예는 groups 명령어 라인상에 복수의
│$groups user2 user3     │ 사용자를 지정하는 방식을 보여준다.
│user2 : grp100 grp200   │
│user3 : grp100 grp300   │
└────────────┘


---------------------------------------------------------------------------


사용자의 소속 그룹(membership) 제어 II

그룹 소속 관계와 억세스 접근 권한
---------------------------------------------------------------------

1. 화일의 소속 그룹 변경

chgrp 화일의 소속 그룹을 변경한다.

┌──────────────────┐
│ chgrp [-option]group file(s)       │
└──────────────────┘


chgrp 명령어에서 그룹 지정은 그룹명 또는 그룹 식별 번호를 지정할
수 있다. 그룹 식별 번호가 사용되는 경우에, /etc/group 화일이나
/etc/passwd 화일에 기존에 존재하지 않는 그룹에 화일을 할당할 수 있다.

chgrp 명령어에 복수개의 화일을 지정할 수 있다. 명령어 실행후에도
화일의 접근 권한은 변경되지 않고 유지된다.

이 명령어는 화일의 소유자 또는 관리자(superuser)만이 실행할 수 있다.

( 주의 ) 몇몇의 유닉스 시스템에서는 화일의 소속 그룹 변경을
관리자에만 허용한다.

( 옵션 )

-R 지정한 디렉토리내의 모든 구성 요소 즉, 서브 화일및 서브 디렉토리의
소속 그룹을 모두 지정한 소속 그룹으로 바꾼다. 단, 심볼릭 링크된
화일은 변경되지 않는다.

-h 심볼릭 링크된 화일의 소속 그룹을 바꾼다.

( 예제 )
┌───────────────────────────────┐
│$id                                                           │
│uid=103(user3) gid=100(grp100)                                │
│$groups                                                       │
│grp100 grp300                                                 │
│$ls -l                                                        │
│total 5                                                       │
│drwxr-xr-x 2 user3 grp100 512 May 7 13:34 .                   │
│drwxr-xr-x 2 user3 grp100 512 May 13 10:30 ..                 │
│drwxr-xr-x 2 user3 grp100 512 Jun 11 09:16 subdir1            │
│-rw-r--r-- 1 user3 grp100 984 Jul 9 11:02 memo1               │
│-rw-r--r-- 1 user1 grp100 1765 Jul 23 14:17 report5           │
│$chgrp grp300 memo1                                           │
│$ls -l memo1                                                  │
│-rw-r--r-- 1 user3 grp300 984 Jul 9 11:02 memo1               │
└───────────────────────────────┘

이 예에서memo1 화일은 grp100 그룹에 속해 있는 user3가 소유자이다.
memo1 화일의 소속 그룹을 변경한 후 ls -l 명령을 통해 변경후의
화일 상태를 확인하는 예이다. 여기서 주목할 것은 명령어 실행후
그룹 정보 이외에는 전혀 변경되지 않는다는 것이다.

┌──────────────────────────────┐
│$ls -l report5                                              │
│-rw-r--r-- 1 user1 grp100 1765 Jul 23 14:17 report5         │
│$chgrp grp300 report5                                       │
│chgrp: report5: Not owner                                   │
└──────────────────────────────┘


이 예는 위의 예에 연속된 예제이다. 위의 예에서 명령어를 소유자인
user3가 수행했기 때문에 수행되었으나, 이번에는 동일한 사용자가
자신이 소유자가 아닌 화일에 대해 그룹을 변경하려고 했기 때문에
에러 처리되는 것을 볼 수 있다.

2. 사용자의 소속 그룹 변경

newgrp 사용자의 현재 소속 그룹을 변경한다.

┌────────────┐
│ newgrp [-] [group]     │
└────────────┘


이 명령어는 사용자에게 그룹 사용자의 화일및 디렉토리로의 접근 권한을
얻기위해 지정한 그룹으로 현재 자신의 소속 그룹을 바꾸는 것을 허용한다.
명령어상에서 지정한 그룹에 사용자는 반드시 일원으로(member로써)
/etc/group 화일내에 선언되어 있어야 한다. 그리고 명령어상에서
그룹 지정시 그룹 명 또는 그룹 번호를 사용할 수 있다.

이 명령어를 인자(arguments)없이 사용했을 경우에, 사용자의 소속 그룹은
/etc/passwd 화일에 정의되어 있는 기본 그룹(Primary Group)으로 환원된다.

또한 명령어상에서 '-' 인자를 사용 했을 경우에는, 로그인시 사용자의
소속 그룹이 지정한 그룹인것으로 해서 로그인 절차가 다시 수행된다.

현재의 쉘이 newgrp 명령어에 의해서 대치된다.(replace)
이 경우에도 현재의 작업 디렉토리는 변하지 않고 그대로 유지되며,
오직 export되어진 변수들의 값이 유지된다. 일반 변수는 초기화 된다.
( newgrp 명령어에 의한 쉘의 대치 부분은 차후 다시 설명된다.
export의 의미는 일단, 하위 쉘에 변수의 값을 전달하기 위한 명령어라고
이해하기 바란다. 자세한 내용은 유닉스의 기본적인 활용에 대한
강의가 끝나고, 계속될 쉘 프로그래밍 과정에서 자세히 설명할 것이다. )

( 예제 )

다음 4개의 예제는 일련의 예제이다.
그러나 설명을 하기 쉽게하기 위해 각각의 예를 분리해 설명한다.

┌─────────────────────────────┐
│$id                                                       │
│uid=105(user5) gid=100(grp100)                            │
│$groups                                                   │
│grp100 grp300                                             │
│$ls -l                                                    │
│total 5                                                   │
│drwxr-xr-x 2 user5 grp100 512 May 7 13:34 .               │
│drwxr-xr-x 2 user5 grp100 512 May 13 10:30 ..             │
│drwxr-xr-x 2 user5 grp100 512 Jun 11 09:16 dir1           │
│-rw-r--r-- 1 user5 grp100 2345 Jul 9 11:02 file1          │
│-rw-r--r-- 1 user3 grp100 3588 Jul 23 14:17 file2         │
│$newgrp grp300                                            │
│$uid=105(user5) gid=300(grp300)                           │
└─────────────────────────────┘


위의 예는 user5에 관한 사용자 식별명및 그룹의 식별명을 확인하기
위해서 id 명령어를 수행하고 있고, groups 명령어를 통해 user5가
소속된 그룹들을 보여주고 있다. 이 두가지 명령을 통해 현재 user5가
grp100에 속해 있다는 것을 보여준다. 그리고 newgrp 명령어를
사용하여 사용자의 소속 그룹을 grp300으로 바꾸고, 그 결과를
확인하고 있다.

┌─────────────────────────────┐
│$cat > file3                                              │
│This file is created after                                │
│user5 changed from grp100                                 │
│to grp300                                                 │
│<^d>                                                      │
│$ls -l file3                                              │
│-rw-r--r-- 1 user5 grp300 4265 Jul 26 09:23 file3         │
└─────────────────────────────┘


이전의 예에서 user5의 소속 그룹을 grp300으로 바꾸었다.
이 상태에서 file3라는 새로운 화일을 생성한 후 ls 명령을 통해서
생성된 화일의 소속 그룹을 확인하고 있다.

┌───────────┐
│$newgrp grp200        │
│newgrp: Sorry         │
└───────────┘


이번에는 user5의 소속 그룹을 또다른 그룹으로 변경을 시도하고 있다.
그러나 에러 처리된 것을 볼수 있다. 왜 그럴까?
그 이유는 간단하다. user5는 첫번째 예의 groups 명령 결과에 의하면
grp200이라는 그룹에는 소속되어 있지 않았기 때문이다.

┌─────────────────┐
│$newgrp                           │
│$id                               │
│uid=105(user5) gid=100(grp100)    │
└─────────────────┘


마지막 예에서는 newgrp 명령어에 인자를 지정하지 않은 예를 보여준다.
이 경우 /etc/passwd 화일에 선언되어 있는 사용자의 그룹으로
소속 그룹을 되돌려 준다.





'Academy I > Tech Academy' 카테고리의 다른 글

Unix 8 쉘프로그래밍  (0) 2014.12.04
Unix 7 프로세스, 쉘  (0) 2014.12.04
Unix 6 유틸리티  (0) 2014.12.04
Unix 5 통신,네트워크  (0) 2014.12.04
Unix 3 관리명령어 일반  (0) 2014.12.04
Unix 2 계층구조, 파일, 디렉토리  (0) 2014.12.04
Unix 1 역사,구성,특징  (0) 2014.12.04
HTML5 CSS3 Javascript 책 공개링크  (0) 2014.12.03