소개

이 실습에서는 Linux 의 파일 권한을 살펴봅니다. chown, touch, chmod라는 세 가지 기본 명령을 사용합니다. 이 도구는 Linux 시스템에서 파일과 디렉터리에 대한 액세스를 관리하는 데 중요합니다. 실습을 마치면 파일 생성, 파일 소유권 변경, 파일 권한 수정 방법을 이해하게 됩니다. 이러한 명령을 사용하면 시스템에서 누가 파일을 읽고, 쓰고, 실행할 수 있는지 제어할 수 있습니다.

새 파일 만들기

먼저 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는 root 권한으로 명령을 실행합니다. 비밀번호를 입력하라는 메시지가 표시될 수 있습니다. 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

여전히 root 대신 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 파일을 만들고 "Another file"이라는 텍스트를 기록합니다.

이제 현재 소유권을 확인합니다.

ls -lR new-dir

ls -lRnew-dir의 내용을 재귀적으로 표시합니다. -R 옵션은 new-dir 안의 모든 파일과 하위 디렉터리 및 그 내용을 표시하도록 ls에 지시합니다.

다음과 비슷한 출력이 표시되어야 합니다.

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 안의 모든 파일과 하위 디렉터리의 소유권을 변경합니다. 이 옵션이 없으면 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 옵션은 디렉터리의 내용이 아니라 디렉터리 자체를 표시하도록 ls에 지시합니다. -d가 없으면 현재 비어 있는 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를 사용할 때는 권한을 변경하는 작업에 항상 주의해야 합니다. 잘못된 변경은 시스템 보안과 기능에 큰 영향을 줄 수 있습니다. 명령을 실행하기 전에 항상 다시 확인하고, 변경 사항의 영향을 이해한 후 실행합니다.