파일 권한 관리

LinuxBeginner
지금 연습하기

소개

이번 실습에서는 Linux 파일 권한의 세계를 깊이 있게 살펴봅니다. chown, touch, chmod라는 세 가지 핵심 명령어를 다룰 예정입니다. 이 도구들은 Linux 시스템에서 파일과 디렉터리에 대한 접근 권한을 관리하는 데 매우 중요합니다. 실습을 마치면 파일을 생성하고, 소유권을 변경하며, 파일 권한을 수정하는 방법을 확실히 익히게 될 것입니다. 이 명령어들을 이해하면 시스템 내 파일의 읽기, 쓰기, 실행 권한을 직접 제어할 수 있게 됩니다.

새 파일 생성하기

먼저 touch 명령어를 사용하여 새 파일을 생성해 보겠습니다. 이 다재다능한 명령어는 새로운 빈 파일을 만들거나 기존 파일의 타임스탬프를 업데이트할 때 사용합니다. 파일을 "터치(touch)"하여 존재하게 만들거나 마지막 접근 시간을 갱신하는 빠른 방법이라고 생각하면 됩니다.

먼저 올바른 디렉터리에 있는지 확인하세요. 우리는 project 디렉터리에서 작업할 것입니다:

cd ~/project

cd 명령어는 "change directory"의 약자입니다. ~ 기호는 홈 디렉터리를 나타내며, /project는 이동하려는 하위 디렉터리를 지정합니다. 만약 project 디렉터리가 존재하지 않으면 이 명령어는 실패할 수 있습니다. 확실하지 않다면 먼저 디렉터리를 생성하는 것이 좋지만, 이 실습 환경에서는 이미 디렉터리가 생성되어 있을 것입니다.

이제 example.txt라는 이름의 새 파일을 생성해 봅시다:

touch example.txt

이 명령어는 현재 디렉터리에 example.txt라는 빈 파일을 생성합니다. 파일이 생성되었는지 확인하려면 ls 명령어를 사용하세요:

ls

ls는 "list"의 약자입니다. 현재 위치에 있는 파일과 디렉터리 목록을 보여줍니다. 출력 결과에 example.txt가 보여야 합니다. 만약 보이지 않는다면 touch 명령어를 올바르게 실행했는지, 그리고 ~/project 디렉터리에 있는지 다시 한번 확인하세요.

파일 소유권 변경하기

파일을 생성했으니 이제 소유권을 변경하는 방법을 배워보겠습니다. chown 명령어를 사용하면 파일의 사용자 및 그룹 소유권을 모두 수정할 수 있습니다. 소유권은 누가 해당 파일을 제어할 수 있는지를 결정합니다.

먼저 example.txt 파일의 현재 소유권을 확인해 봅시다:

ls -l example.txt

ls -l 명령어(긴 형식으로 목록 표시)는 권한, 소유자, 그룹을 포함한 파일의 상세 정보를 제공합니다. 다음과 비슷한 출력이 나타날 것입니다:

-rw-rw-r-- 1 labex labex 0 Jul 29 15:11 example.txt

이 출력 내용을 분석해 보겠습니다:

  1. -rw-rw-r--는 파일 권한을 나타냅니다(4단계에서 자세히 다룹니다). 첫 번째 문자는 파일 유형을 나타냅니다(일반 파일은 -, 디렉터리는 d 등). 나머지 문자들은 소유자, 그룹, 기타 사용자에 대한 읽기, 쓰기, 실행 권한을 나타냅니다.
  2. 첫 번째 labex는 파일의 현재 소유자입니다. 파일을 소유한 사용자 이름입니다.
  3. 두 번째 labex는 파일의 현재 그룹입니다. 그룹은 권한을 공유할 수 있는 사용자들의 집합입니다.
  4. 0은 파일 크기(바이트 단위)입니다. 파일이 비어 있으므로 크기는 0입니다.
  5. Jul 29 15:11은 마지막 수정 날짜와 시간입니다.
  6. example.txt는 파일 이름입니다.

이제 파일의 소유권을 root 사용자로 변경해 보겠습니다. root는 Linux 시스템의 관리자 계정이며 특별한 권한을 가집니다.

sudo chown root:root example.txt

이 명령어의 의미는 다음과 같습니다:

  • sudo는 루트 권한으로 명령어를 실행합니다. 비밀번호를 입력하라는 메시지가 나타날 수 있습니다. chown은 시스템 보안에 영향을 줄 수 있는 강력한 명령어이므로 높은 권한이 필요합니다. sudo 없이 실행하면 "Permission denied" 오류가 발생합니다.
  • chown은 소유권을 변경하는 명령어입니다.
  • root:root는 새로운 소유자와 그룹을 지정합니다(둘 다 root로 설정). 구문은 owner:group입니다.
  • example.txt는 대상 파일입니다.

변경 사항을 확인해 봅시다:

ls -l example.txt

이제 소유자와 그룹이 모두 root로 변경된 것을 확인할 수 있습니다:

-rw-rw-r-- 1 root root 0 Jul 29 15:11 example.txt

여전히 labex로 표시된다면 chown 명령어를 실행할 때 sudo를 사용했는지, 비밀번호를 올바르게 입력했는지 확인하세요.

디렉터리 소유권 변경하기

chown 명령어는 디렉터리 전체와 그 내부 내용의 소유권도 변경할 수 있습니다. 이를 직접 확인해 봅시다. 이는 모든 파일과 하위 디렉터리가 동일한 소유자를 갖도록 보장해야 하는 복잡한 디렉터리 구조를 관리할 때 특히 유용합니다.

먼저 몇 개의 파일이 포함된 새 디렉터리를 생성합니다:

mkdir -p new-dir/subdir
echo "Hello, world" > new-dir/file1.txt
echo "Another file" > new-dir/subdir/file2.txt

이 명령어들을 분석해 보겠습니다:

  • mkdir -p new-dir/subdirnew-dir 디렉터리와 그 하위 디렉터리인 subdir를 생성합니다. -p 옵션은 필요에 따라 상위 디렉터리를 생성하도록 mkdir에 지시합니다. -p가 없으면 new-dir이 존재하지 않을 경우 new-dir/subdir 생성은 실패합니다.
  • echo "Hello, world" > new-dir/file1.txtnew-dir 디렉터리 안에 file1.txt라는 파일을 생성하고 "Hello, world"라는 텍스트를 씁니다. > 기호는 리디렉션에 사용되며, echo 명령어의 출력을 지정된 파일로 보냅니다.
  • echo "Another file" > new-dir/subdir/file2.txt는 마찬가지로 new-dir/subdir 디렉터리 안에 file2.txt를 생성하고 텍스트를 씁니다.

이제 현재 소유권을 확인해 봅시다:

ls -lR new-dir

ls -lRnew-dir의 내용을 재귀적으로 나열합니다. -R 옵션(recursive)은 lsnew-dir 내부의 모든 파일과 하위 디렉터리, 그리고 그 내용까지 모두 나열하게 합니다.

다음과 같은 결과가 나타날 것입니다:

new-dir:
total 4
-rw-rw-r-- 1 labex labex 13 Jul 29 09:15 file1.txt
drwxrwxr-x 2 labex labex 23 Jul 29 09:15 subdir

new-dir/subdir:
total 4
-rw-rw-r-- 1 labex labex 13 Jul 29 09:15 file2.txt

new-dir 디렉터리, 하위 디렉터리 subdir, 그리고 파일 file1.txtfile2.txt 모두 labex가 소유하고 있음을 보여줍니다.

이제 new-dir과 그 내부의 모든 내용을 root 사용자로 변경해 봅시다:

sudo chown -R root:root new-dir

이 명령어에서:

  • -R 옵션은 chown이 재귀적으로 작동하여 new-dir 내부의 모든 파일과 하위 디렉터리의 소유권을 변경하도록 합니다. 이는 매우 중요합니다. -R이 없으면 new-dir 디렉터리의 소유권만 변경되고 내부 파일들은 여전히 labex 소유로 남게 됩니다.

변경 사항을 확인해 봅시다:

ls -lR new-dir

이제 다음과 같이 표시되어야 합니다:

new-dir:
total 4
-rw-rw-r-- 1 root root 13 Jul 29 09:15 file1.txt
drwxrwxr-x 2 root root 23 Jul 29 09:15 subdir

new-dir/subdir:
total 4
-rw-rw-r-- 1 root root 13 Jul 29 09:15 file2.txt

보시다시피 디렉터리와 그 내부 모든 내용의 소유권이 root로 변경되었습니다. 이는 디렉터리 구조 내에서 광범위한 소유권 변경을 수행할 때 -R 옵션이 얼마나 강력한지 보여줍니다.

파일 권한 변경하기

Linux에서 파일 권한은 일련의 문자나 숫자로 표현됩니다. 이 권한을 읽고 변경하는 방법을 알아봅시다. 권한을 이해하는 것은 파일을 보호하고 무단 접근을 방지하는 데 필수적입니다.

먼저 example.txt 파일의 현재 권한을 살펴봅시다:

ls -l example.txt

다음과 같이 보일 것입니다:

-rw-rw-r-- 1 root root 0 Jul 29 15:11 example.txt

-rw-rw-r-- 부분이 파일 권한을 나타냅니다. 여기서 숫자 표기법과 기호 표기법이 사용됩니다. 분석해 보겠습니다:

  • 첫 번째 문자(-)는 일반 파일임을 나타냅니다. 다른 일반적인 지표로는 디렉터리를 나타내는 d, 심볼릭 링크를 나타내는 l이 있습니다.
  • 다음 세 문자(rw-)는 소유자의 권한(읽기 및 쓰기, 실행 불가)을 나타냅니다.
    • r은 읽기 권한: 소유자가 파일을 열고 읽을 수 있습니다.
    • w는 쓰기 권한: 소유자가 파일을 수정할 수 있습니다.
    • x는 실행 권한: 소유자가 파일을 실행할 수 있습니다(프로그램이나 스크립트인 경우). -는 해당 권한이 거부되었음을 의미합니다.
  • 다음 세 문자(rw-)는 그룹에 대한 권한입니다. 위와 동일한 의미를 가지며 파일 그룹의 구성원에게 적용됩니다.
  • 마지막 세 문자(r--)는 기타 사용자(그 외 모든 사람)에 대한 권한입니다. 역시 동일한 의미를 가지며 소유자도 아니고 그룹 구성원도 아닌 사용자에게 적용됩니다.

이제 chmod 명령어를 사용하여 이 권한들을 변경해 봅시다. chmod는 "change mode"의 약자이며 권한을 수정할 수 있게 해줍니다. 숫자 표기법부터 시작해 보겠습니다.

sudo chmod 700 example.txt

이 명령어에서:

  • 700은 권한을 숫자로 표현한 것입니다:
    • 첫 번째 숫자(7)는 소유자의 권한을 나타냅니다.
    • 두 번째 숫자(0)는 그룹의 권한을 나타냅니다.
    • 세 번째 숫자(0)는 기타 사용자의 권한을 나타냅니다.

각 숫자는 0에서 7까지의 값이며, 읽기(4), 쓰기(2), 실행(1) 권한 값을 더하여 계산합니다:

  • 4: 읽기 권한
  • 2: 쓰기 권한
  • 1: 실행 권한
  • 0: 권한 없음

따라서 7(첫 번째 숫자)은 소유자에게 읽기(4), 쓰기(2), 실행(1) 권한을 부여합니다: 4+2+1=7 0(두 번째 숫자)은 그룹에게 아무 권한도 주지 않습니다(0+0+0=0). 0(세 번째 숫자)은 기타 사용자에게 아무 권한도 주지 않습니다(0+0+0=0).

결과적으로 700은 소유자: 읽기, 쓰기, 실행 가능. 그룹: 없음. 기타: 없음.을 의미합니다.

변경 사항을 확인해 봅시다:

ls -l example.txt

이제 다음과 같이 보일 것입니다:

-rwx------ 1 root root 0 Jul 29 15:11 example.txt

이제 소유자는 rwx(읽기, 쓰기, 실행) 권한을 가지며, 그룹과 기타 사용자는 아무런 권한이 없습니다.

디렉터리 권한 변경하기

디렉터리 권한 변경도 파일 권한 변경과 유사하게 작동합니다. 새 디렉터리를 만들고 권한을 수정하며 연습해 봅시다. 디렉터리 권한은 누가 디렉터리 내용을 나열하고, 새 파일을 생성하며, 기존 파일에 접근할 수 있는지를 제어합니다.

먼저 새 디렉터리를 만들고 비표준 권한을 설정해 봅시다:

mkdir ~/test-dir
chmod 700 ~/test-dir

이제 현재 권한을 확인해 봅시다:

ls -ld ~/test-dir

ls -l-d 옵션은 디렉터리 내부 내용이 아닌 디렉터리 자체를 나열하도록 합니다. -d가 없으면 ls는 현재 비어 있는 test-dir 내부의 파일과 하위 디렉터리를 나열하려고 할 것입니다. 결과는 다음과 같아야 합니다:

drwx------ 2 labex labex 4096 Jul 29 15:45 /home/labex/test-dir

맨 앞의 d는 디렉터리임을 나타냅니다. rwx------는 소유자가 읽기, 쓰기, 실행 권한을 가지며 그룹과 기타 사용자는 권한이 없음을 나타냅니다. 디렉터리의 경우:

  • 읽기 권한(r)은 ls를 사용하여 디렉터리 내용을 나열할 수 있게 합니다.
  • 쓰기 권한(w)은 디렉터리 내에 새 파일과 하위 디렉터리를 생성할 수 있게 합니다.
  • 실행 권한(x)은 디렉터리 내의 파일과 하위 디렉터리에 접근(예: cd로 이동)할 수 있게 합니다.

이제 권한을 변경해 봅시다:

chmod -R 755 ~/test-dir

이 명령어에서:

  • -R은 모든 파일과 하위 디렉터리에 재귀적으로 변경 사항을 적용합니다(현재는 디렉터리가 비어 있지만). 나중에 파일을 추가할 경우를 대비해 디렉터리를 다룰 때는 포함하는 것이 좋습니다.
  • 755는 소유자에게 읽기, 쓰기, 실행 권한을, 그룹과 기타 사용자에게는 읽기 및 실행 권한을 부여합니다.

755를 분석해 보면:

  • 소유자(7): 읽기(4) + 쓰기(2) + 실행(1) = 7
  • 그룹(5): 읽기(4) + 실행(1) = 5
  • 기타(5): 읽기(4) + 실행(1) = 5

변경 사항을 확인해 봅시다:

ls -ld ~/test-dir

이제 다음과 같이 보일 것입니다:

drwxr-xr-x 2 labex labex 4096 Jul 29 15:45 /home/labex/test-dir

소유자만 접근 가능했던 상태(700)에서 소유자는 모든 권한을 갖고 기타 사용자는 읽기 및 실행이 가능한 상태(755)로 변경된 것을 명확히 확인할 수 있습니다. 이제 누구나 test-dir의 내용을 나열하고 내부 파일에 접근할 수 있지만, 새 파일을 생성하거나 기존 파일을 수정하는 것은 소유자만 가능합니다.

권한에 대한 기호 표기법 사용하기

숫자 표기법은 간결하지만, 특정 권한만 변경하고 싶을 때는 기호 표기법이 더 직관적일 수 있습니다. 기호 표기법은 사용자, 그룹, 기타 사용자를 나타내는 문자와 권한을 추가하거나 제거하는 연산자를 사용합니다.

이 단계에서는 작은 셸 스크립트를 만들고 실행 권한을 추가해 보겠습니다.

먼저 내용을 포함한 새 스크립트 파일을 만듭니다:

cd ~/project
echo '#!/bin/bash' > script.sh
echo 'echo "Hello, World"' >> script.sh

이 명령어들은 두 가지 작업을 수행합니다:

  • 첫 번째 echo 명령어는 script.sh를 생성하고 첫 번째 줄인 #!/bin/bash를 씁니다. 이 줄을 셰뱅(shebang)이라고 하며, Linux에게 Bash로 스크립트를 실행하라고 지시합니다.
  • 두 번째 echo 명령어는 >>를 사용하여 파일 끝에 새 줄을 추가합니다. echo "Hello, World"를 작성하며, 스크립트가 실행될 때 Hello, World가 출력됩니다.

파일에 두 줄이 포함되어 있는지 확인하려면 다음을 사용하세요:

cat script.sh

다음과 같이 보여야 합니다:

#!/bin/bash
echo "Hello, World"

이제 초기 권한을 확인해 봅시다:

ls -l script.sh

다음과 비슷하게 보일 것입니다:

-rw-rw-r-- 1 labex labex 32 Jul 29 16:30 script.sh

보시다시피 초기에는 소유자와 그룹에 읽기/쓰기 권한만 있고, 기타 사용자에게는 읽기 권한만 있습니다. 프로그램으로 실행하는 데 필요한 실행 권한이 없습니다.

스크립트를 실행해 봅시다:

./script.sh

아직 실행 권한이 없기 때문에 "Permission denied" 오류가 발생합니다. ./ 부분은 셸에게 현재 디렉터리에 있는 스크립트를 실행하라고 지시합니다.

이제 기호 표기법을 사용하여 소유자에게 실행 권한을 추가해 봅시다:

chmod u+x script.sh

이 명령어에서:

  • u는 사용자(소유자)를 의미합니다. 다른 옵션으로는 그룹을 위한 g, 기타 사용자를 위한 o, 모두를 위한 a(사용자, 그룹, 기타 사용자)가 있습니다.
  • +x는 실행 권한을 추가합니다. + 기호는 권한을 추가하고, - 기호는 권한을 제거합니다.

따라서 u+x는 "소유자에게 실행 권한을 추가하라"는 의미입니다.

변경 사항을 확인해 봅시다:

ls -l script.sh

이제 다음과 같이 보일 것입니다:

-rwxrw-r-- 1 labex labex 32 Jul 29 16:30 script.sh

이제 소유자는 rwx(읽기, 쓰기, 실행) 권한을 가집니다.

스크립트를 다시 실행해 봅시다:

./script.sh

이번에는 다음과 같은 출력이 나타납니다:

Hello, World

이 예제는 왜 스크립트에 실행 권한을 추가해야 하는지, 그리고 권한 추가 전후의 차이가 무엇인지 명확히 보여줍니다. 기호 표기법을 사용하면 전체 숫자 표기법을 다시 계산할 필요 없이 특정 권한만 쉽게 수정할 수 있습니다.

요약

이번 실습에서는 Linux 파일 권한 관리를 위한 필수 명령어들을 살펴보았습니다:

  1. touch를 사용하여 새 파일을 생성하고 기존 파일을 업데이트했습니다.
  2. chown을 사용하여 파일 및 디렉터리 소유권을 변경하는 방법과 디렉터리 구조 전체에 대한 재귀적 변경 방법을 배웠습니다.
  3. chmod를 숫자 및 기호 표기법으로 사용하여 파일과 디렉터리 권한을 수정하고, 소유자/그룹/기타 사용자에 대한 권한 수준을 이해했습니다.
  4. 스크립트 실행을 위해 실행 권한이 필요한 경우 등 권한이 중요한 실제 사례들을 확인했습니다.
  5. chmod를 위한 숫자 표기법과 기호 표기법의 차이점, 그리고 각각이 언제 더 적절한지 알아보았습니다.

이 명령어들은 Linux 시스템에서 보안을 유지하고 접근을 제어하는 데 매우 중요합니다. 특히 sudo를 사용할 때는 권한 변경 시 항상 주의하십시오. 잘못된 변경은 시스템 보안과 기능에 심각한 결과를 초래할 수 있습니다. 명령어를 실행하기 전에 항상 다시 확인하고, 변경 사항이 미칠 영향을 이해하십시오.