Codesigner

[Linux] 리눅스(Linux) 파일 접근 권한 & 쉘 기능 본문

Linux

[Linux] 리눅스(Linux) 파일 접근 권한 & 쉘 기능

eunsukimme 2019. 6. 16. 23:40

저번 포스팅에서 리눅스에서의 파일 시스템 구조와 기본적인 명령어들에 대해서 알아보았다. 이번 포스팅에서는 리눅스에서 파일에 접근하는 권한을 제어하는 방법과 기타 쉘 기능에 대해서 알아보도록 하자. 그전에 먼저 파일의 접근을 제어하는 이유에 대해서 생각해보자. 리눅스는 다중 사용자를 지원한다고 말했다. 즉, 홈 디렉터리 밑에 여러 사용자들의 폴더가 존재한다는 것이다. 그 폴더에서는 사용자들이 설치한 프로그램뿐만 아니라 여러 가지 데이터들도 존재한다. 만약, 중요한 데이터를 담고 있는 파일을 다른 사용자가 읽거나 열어서 수정할 수 있다면 어떻게 될까? 이러한 문제를 예방하기 위해 리눅스에서는 파일의 접근 권한을 제어할 수 있게 하였다. 지금부터 어떻게 권한을 제어하고 기타 쉘 기능을 이용하는지에 대해 알아보도록 하자

 

 

 

파일 접근 권한

리눅스는 파일의 사용자를 다음과 같은 세 범주로 나누어 구분한다

  1. Owner (u): 파일의 소유자

  2. Group (g): 파일의 소유 그룹

  3. Other (o): 그 외의 모든 사용자

또한 파일에 대한 권한을 다음과 같은 세 범주로 나누어 구분한다

  1. Read (r)

  2. Write (w)

  3. Execute (x)

따라서 각 파일에 대해서 만들어지는 권한은 3*3=9 종류의 권한이 존재하게 된다. 현재 디렉터리에 존재하는 파일에 부여된 권한을 확인하려면 터미널에서 다음 명령을 실행하면 된다

$ ls -l filename

<그림 1> 파일 접근 권한 확위 

위 사진에서 가장 왼 쪽에 -rw-r--r-- 로 나타난 10자리 문자가 바로 파일의 권한을 의미한다. 이 괴상한 문자가 어떻게 파일의 권한을 의미하는 것일까? 그 해답은 해당 문자를 표시하는 규칙에 있다. 파일의 권한을 표시하는 규칙은 다음과 같다

 

<그림 2> 리눅스 파일 접근 권한 표기 규칙

 

가장 왼쪽의 첫 문자는 바로 타입을 표시한다. 하이픈(-)의 경우 파일을 의미하며, d는 디렉터리를, l은 심볼릭 링크 등 여러 문자로 그 의미를 표시한다. 위 예시의 경우 하이픈 문자로 파일을 의미한다. 다음으로 왼쪽에서 2-4자리 문자는 파일 소유자(user)의 읽기(Read), 쓰기(Write), 실행(Execute) 권한을 나타낸다. 위 예시에서 2-4자리 문자는 'rw-' 이므로 이는 읽기와 쓰기는 가능하지만 실행 권한은 존재하지 않는다는 걸 의미한다. 다음으로 5-7자리 문자는 파일이 속한 그룹의 권한을 나타낸다. 위 예시에서 5-7자리 문자는 'r--' 이므로 읽기만 가능하단 것을 의미한다. 마지막으로 8~10자리 문자는 다른 모든 사용자의 권한을 의미하고, 마찬가지로 읽기만 가능함을 나타낸다

 

바이너리 파일의 실행을 위해서는 x면 충분하다. 쉘 스크립트의 경우는 r과 x가 필요하다. 또, 디렉터리를 접근하기 위해서는 r과 x가 필요한데, r은 디렉터리 내의 파일들의 목록을 보기 위해서고 x는 디렉터리에 들어가기 위함이다. 디렉터리 내의 파일의 이름 변경, 삭제, 복사 등을 위해서는 디렉터리에 대한 w가 필요하다. 그러면 이러한 권한들을 어떻게 부여하고 제어할 수 있을까?

 

 

 

접근 권한 제어

리눅스에서는 접근 권한을 제어하는 명령어 chmod 를 제공한다. chmod는 위에서 말했던 10자리의 접근 권한을 변경하는 명령어이다. chmod 문법은 다음과 같다

$ chmod <permissions> <files>

위 코드는 주어진 파일(files)의 접근 권한(permissions)을 설정한다. 여기서 permissions를 지정하는 방법은 8진수 표현과 기호를 이용한 표현 두 가지가 존재한다. 먼저, 8진수 표현은 다음과 같다

$ chmod 644 <file>

위 표현에서 644는 팔진수로 110 100 100을 나타낸 것이다. 각 3비트들은 Owner, Group, Others를 나타낸 것이고, 그 안의 각 비트들은 r, w, x를 나타낸 것이다. 즉, 위 예시는 r과 x권한을 Owner(u)에게, r권한을 Group(g)과 Others(o)에게 부여한다. 다음으로 기호를 이용한 표현법을 보자

$ chmod go+r <file>    // 읽기(r) 권한을 group과 others에 추가
$ chmod u-w <file>    // 쓰기(w) 권한을 user로부터 제거
$ chmod a-x <file>    // 실행(x) 권한을 모두(all)로부터 제거

위 표현에서 플러스(+)와 마이너스(-) 기호는 권한의 부여/제거를 의미한다. 기호 왼쪽은 사용자를 의미하는 문자(u, g, o, a)들이 오고, 기호 오른쪽에는 부여/제거할 권한을 의미하는 문자들이 위치한다

리눅스에서는 파일의 접근 권한뿐만 아니라 소유권 또한 변경할 수 있다. 이는 임베디드 시스템 개발에 있어서 유용하게 사용할 수 있다. 파일의 소유권 변경 명령은 chown(소유자 변경), chgrp(소유 그룹 변경)이다. 이들의 몇 가지 예시를 살펴보면 다음과 같다

// 사용자 sco를 /home/linux/src 에 있는 모든 파일들의 소유자로 지정
$ chown -R sco /home/linux/src

// empire를 /home/askywalker 에 있는 모든 것들의 소유 group으로 지정
$ chgrp -R empire /home/askywalker

 

 

 

기타 쉘(Shell) 기능 : 와일드카드

이번 섹션에서는 쉘 상에서 활용할 수 있는 몇 가지 기능에 대해서 알아보도록 하자. 먼저 쉘은 다음과 같은 몇 가지 와일드카드(Wildcard)를 지원한다. 와일드카드란, 쉘 상에서 명령을 실행할 때 특수한 의미로 사용되는 문자를 말한다

 

<그림 3> 리눅스 쉘 와일드카드

  • *

    • 일치되는 모든 문자를 의미한다

    • 예를 들어 ls ab* 명령은 'ab' 문자열이 들어가는 모든 파일들을 출력한다

    • 또한 ls ab*.mp4 명령은 'ab' 문자열이 들어가는 파일들 중 mp4 확장자를 가진 파일들을 출력한다

  • ?

    • '?' 문자에 일치하는 하나의 문자를 의미한다

    • 예를 들어 simple.txt라는 파일이 존재한다고 할 때, ls s????.txt 명령은 simple.txt를 출력한다. 각 물음표가 하나의 문자에 대응된다

  • [set]

    • 주어진 set의 각각의 문자들을 의미한다

    • 예를 들어 ls /bin/[a-c]* 는 a, b, 혹은 c로 시작되는 모든 파일명을 나열한다

  • [!set]*

    • [set]과 반대로, 각각의 문자들을 제외한 문자를 의미한다

    • 예를 들어 ls /bin/[!a-c]* 는 a, b, 그리고 c를 제외한 모든 문자로 시작되는 모든 파일명을 나열한다

 

 

 

기타 쉘(Shell) 기능 : 입출력 리디렉션(Redirection)

쉘에는 표준 입력(stdin), 표준 출력(stdout), 표준 에러(stderr)라는 세 가지 기본적인 스트림이 존재한다. 이를 도식화한 그림은 다음과 같다

 

<그림 4> 표준 입력, 출력, 에러

 

일반적으로 표준 입력은 0, 표준 출력은 1, 표준 에러는 2로 나타낸다. 리눅스에서는 이러한 표준 입력, 출력, 에러를 파일로부터 혹은 파일로 리디렉션(redirection)할 수 있다

  • 입력 redirection

    • 표준 입력으로부터 입력을 받은 명령어(혹은 프로그램)가 파일로부터 입력을 받도록 한다

    • $ mycommand < infile 명령은 infile 이란 파일을 mycommand 명령의 입력으로 사용한다는 걸 의미한다

  • 출력 redirection

    • 표준 출력으로 출력하는 명령어(혹은 프로그램)가 파일로 출력하도록 한다

    • $ mycommand > outfile 명령은 mycommand의 출력을 outfile 에 덮어쓴다는 걸 의미한다

    • $ mycommand >> outfile 명령은 mycommand 의 출력을 outfile 에 추가한다는 걸 의미한다

  • 에러 redirection

    • $ mycommand 2> errorfile 명령은 mycommand의 에러를 errorfile 에 덮어쓴다는 걸 의미한다

    • $ mycommand > outfile 2> errorfile 명령은 mycommand 의 출력은 outfile에, 에러는 errorfile에 별개로 작성한다는 걸 의미한다

    • $ mycommand > outfile 2>&1 명령은 mycommand의 출력과 에러 모두 outfile에 작성한다는 걸 의미한다

 

 

 

기타 쉘(Shell) 기능 : 파이프(Pipe)

파이프(|) 연산자를 활용해 한 명령어(프로그램)의 표준 출력을 다른 명령어(프로그램)의 표준 입력으로 redirection이 가능하다. 예를 들어 who 명령으로 사용자들을 나열하는 출력을 파이프(|) 연산자로 sort 명령의 입력으로 넘길 수 있다

$ who | sort

 

 

 

기타 쉘(Shell) 기능 : 명령의 결합

쉘에서 여러 개의 명령어를 순차적으로 실행 가능하다

$ command1; command2; command3	// 명령 순차 실행

또한 여러 명령어를 순차적으로 실행하되 하나라도 실패할 경우 중단할 수 있다

$ command1 && command2 && command3	// 순차적으로 실행하되 실패시 중단

혹은 반대로 하나라도 성공할 경우 중단할 수 있다

$ command1 || command2 || command3	// 하나라도 성공시 중단

 

 

 

Review

지금까지 리눅스에서 파일의 접근 권한을 제어하는 방법과 기타 쉘 기능들에 대해서 알아보았다. 기타 쉘 기능들을 잘 활용할 수 있다면 기본적인 명령어들 만으로도 많은 일을 할 수가 있다. 다음 포스팅에서는 프로세스와 리눅스 환경 변수에 대해서 알아보도록 하자

 

 

Comments