GUI/CLI, Shell, 파일 권한

GUI와 CLI로 불리는 UI에 대해서 알아보고, Shell 명령어와 파일 권한에 대해 알아봅니다.
Shell, GUI, CLI, 파일 권한


GUI

Windows의 explorer.exeWindows의 explorer.exe

GUI는 그래픽을 통해 사용자와 프로그램이 상호작용하는 환경을 일컫는 말입니다. GUI의 제어는 마우스, 터치패드, 디스플레이 등 다양한 주변기기와의 입출력(IO)을 통해 이루어집니다. 최종 사용자(End User)가 이용하는 운영체제나 응용프로그램은 대부분 GUI를 통해 상호작용합니다. 대표적인 프로그램을 예로 들어보면 윈도우즈의 explorer.exe (바탕화면, 탐색기, 작업표시줄 등을 제공), 웹 브라우저, 게임 등이 있습니다.

MacOS의 FinderMacOS의 Finder

이때 생각해 볼 점은 운영체제 별로 응용프로그램들의 GUI가 비슷하다는 점입니다. 윈도우즈 응용프로그램의 GUI는 서로 비슷한 모습이고, MacOS 응용프로그램의 GUI도 서로 비슷한 모습이고, Android, iOS 등 운영체제에 종속적인 응용프로그램들의 GUI는 서로 비슷한 모습을 하고 있습니다. 이는 운영체제가 프로그램 개발자가 운영체제의 테마에 맞는 공통적인 GUI를 만들 수 있도록 관련 API를 제공하고 응용 프로그램은 이를 활용하여 개발되었기 때문입니다.

CLI

MacOS의 TerminalMacOS의 Terminal

CLI (Command Line Interface)는 텍스트 입출력(IO)을 통해 사용자와 프로그램이 상호작용하는 환경을 일컫는 말입니다. 키보드 입력만으로 운영체제와 프로그램을 제어해야 하기에 최종 사용자나 초보자에게는 익숙하지 않은 환경입니다.

개발자가 CLI 환경에 익숙해져야 하는 이유는 개발자용 프로그램이나 최종 사용자가 이용하지 않는 내부적인 시스템 프로그램은 대부분 CLI를 통해 제어되기 때문입니다. 또한 CLI는 키보드 입력만으로 운영체제와 프로그램을 제어하므로 익숙해지면 좋은 생산성을 낼 수 있습니다.

CLI와 GUI는 인터페이스의 차이일 뿐CLI와 GUI는 인터페이스의 차이일 뿐

로그램은 이용 대상과 목적에 따라서 GUI를 제공 할 수도, CLI를 제공 할 수도 있습니다. 또는 두 방식의 인터페이스를 모두 제공 할 수도, 또는 아무런 인터페이스를 제공하지 않을 수도 있습니다. 둘의 차이는 단순히 상호작용 방식의 차이 일뿐 근본적인 프로그램의 구조나 실행 원리는 동일합니다.

Shell

Git BashGit Bash

운영체제의 기능을 이용하고 또 프로그램을 실행하기 위한 프로그램을 셸(Shell)이라고 합니다. 셸은 CLI/GUI 두가지 방식으로 제공 됩니다. 윈도우즈의 경우 GUI 셸은 explorer.exe (바탕화면이나 탐색기)로 볼 수 있고 CLI 셸은 cmd.exe (명령프롬프트)로 볼 수 있습니다. 제어판에서 운영체제의 설정을 변경하고 탐색기나 바탕화면에서 폴더나 파일을 만들고 프로그램을 실행하는 등 GUI 셸은 직관적으로 사용하기에 좋습니다.

프로그래밍을 본격적으로 시작하기에 앞서서 CLI 셸에 익숙해 지도록 하겠습니다. 이 때 윈도우즈 운영체제를 쓰시는 분들은 UNIX 기반 OS에 익숙해직 위해서 윈도우즈에서 UNIX 기반 OS의 셸(bash, sh 등)을 에뮬레이트하는(흉내내는) Git Bash라는 프로그램을 설치 하고 사용하시면 좋겠습니다. UNIX 기반 OS에 익숙해 지려는 이유는 대부분의 서버 환경이나 오픈 소스 개발 진영이 UNIX 기반 OS 위에서 구축되고 있기 때문입니다.

Shell 명령어

프로그램 이름용도비고
pwd현재 작업 중인 디렉토리의 경로를 출력present working directory
ls -a 현재 작업 중인 폴더에 존재하는 파일들의 이름을 출력list
cd 폴더명현재 위치를 이동change directory
clear셸 화면을 청소
mkdir 폴더명 [폴더명2, 폴더명3, …]폴더를 생성make directory
touch 파일명 [파일명2, 파일명3, …]빈 파일을 생성
rm -rf 파일명 [파일명2, 파일명3, …]파일 및 폴더를 삭제remove
mv 파일명 [파일명2, 파일명3, …]목적 파일명 파일 및 폴더를 옮기거나 이름을 변경move
cp 파일명 [파일명2, 파일명3, …]목적 파일명 파일 및 폴더를 복사copy
cat -n 파일명 [파일명2, 파일명3, …]파일의 내용을 텍스트로 읽어서 출력concatenate

프로그램의 실행

Git Bash나 Terminal 종류의 CLI 셸을 이용해 Linux/Unix 환경의 셸의 대표적인 프로그램들 대해 알아보겠습니다. 셸(shell)에서 프로그램을 실행시키는 방법은 일반적으로 파일명 [-추가 옵션] [실행시 전달할 인자들] 입니다.

경로

셸에서 디렉토리를 돌아다니면서 작업을 하기에 앞서서 경로에 대한 이해가 필요합니다. 경로는 현재 디렉토리를 기준으로 표현 할 수도 있고(상대 경로), 최상위 디렉토리(root)를 기준으로 표현(절대 경로) 할 수도 있습니다

  • 최상위 디렉토리는 윈도우즈의 경우에는 C:\, D:\ 등이 될 수 있고 UNIX 기반 OS에서는 / 가 됩니다.

  • 절대 경로는 /Some/Path/From/Root 와 같은 식으로 최상위 디렉토리에서 부터 파일 및 폴더의 경로를 표현합니다.

  • 상대 경로는 . 으로 대변되는 현재 위치에서 출발하여 ./Some/path/../From/Here와 같이 경로를 표현합니다. . 은 현재 위치를 대변하고, ..은 현재 위치의 상위 디렉토리를 대변합니다. 추가로 ~는 운영체제에서 지정해준 사용자의 홈 디렉토리를 대변합니다.

자동 완성과 히스토리

셸에서 명령어를 어느 정도 입력하다가 탭키를 누르면 자동완성을 도와주는 경우가 많습니다. 또한 를 이용해서 입력했던 명령어들을 다시 불러올 수 있습니다. 탭과 화살표를 잘 쓰면 생산성을 높힐 수 있습니다.

연습

pwd
ls
mkdir test_folder
touch test_file
ls
ls -al
rm test_file
rm -r test_folder
ls
cd ..
ls
cd ~
touch a
ls
touch b c
cp c d
mv d e
ls
clear

환경 변수

환경 변수 또는 시스템 변수는 운영체제에 등록된 일련의 값들입니다. 이런 값들은 운영체제가 실행하는 모든 프로세스에서 공통적으로 이용됩니다. 대표적으로 $PATH와 같은 환경 변수는 셸 프로그램이 실행할 프로그램을 찾는데 도움을 줍니다. ls와 같은 프로그램은 실제로 /bin/ls에 저장되어 있지만 셸에서 프로그램을 실행 할 때 현재 경로에 프로그램이 없으면 $PATH에 지정된 경로에서 프로그램을 차례대로 찾아보기 때문에 ls를 입력하더라도 /bin/ls를 실행 할 수 있습니다. 제 컴퓨터의 $PATH는 다음과 같습니다.

echo $PATH
/Users/dehypnosis/.rbenv/shims:/usr/local/apache-ant-1.9.4/bin/:/Users/dehypnosis/Library/Android/sdk/tools:/Users/dehypnosis/Library/Android/sdk/platform-tools:/Users/dehypnosis/Library/Android/sdk:/Users/dehypnosis/.composer/vendor/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/apache-ant-1.9.4:/usr/local/apache-ant-1.9.4/bin:/opt/X11/bin

파일 권한

운영체제의 파일 시스템에는 파일 권한(File Permission)이라는 요소가 있습니다. 운영체제는 각 파일과 디렉토리에 설정된 권한을 기반으로 같은 머신을 이용하는 사용자들의 접근 권한을 제어합니다. 이 파일 권한은 단일 머신에서 사용자간의 파일 영역을 분리해주거나, 외부에서 업로드된 파일들의 실행 권한에 대한 제어하는 등 보안 이슈와 직결되어 있습니다.

dehypnosis-mac:~ dehypnosis$ ls -al
total 792
drwxr-xr-x+   96 dehypnosis  staff    3264 Mar  6 13:14 .
drwxr-xr-x     5 root        admin     170 Oct  6 18:37 ..
drwxr-xr-x     3 dehypnosis  staff     102 Aug  3  2016 .AndroidStudio2.1
drwxr-xr-x     6 dehypnosis  staff     204 Dec  1 15:15 .AnySign4PC
-r--------     1 dehypnosis  staff       7 Oct  6 18:45 .CFUserTextEncoding
-rw-r--r--@    1 dehypnosis  staff   18436 Mar  3 12:36 .DS_Store
drwxr-xr-x     3 dehypnosis  staff     102 Mar 28  2015 .IdeaIC14
drwxr-xr-x     3 dehypnosis  staff     102 Apr  6  2015 .IntelliJIdea14
drwx------     3 dehypnosis  staff     102 Feb 11  2015 .MacOSX
drwx------   328 dehypnosis  staff   11152 Mar  4 22:17 .Trash
drwxr-xr-x     4 dehypnosis  staff     136 Apr  8  2015 .Trash-1000
drwxr-xr-x     3 dehypnosis  staff     102 Feb 13  2015 .WebStorm9
-rw-------     1 dehypnosis  staff     259 Oct 11 22:52 .Xauthority
drwxr-xr-x     4 dehypnosis  staff     136 Dec 31  2014 .adobe
drwxr-xr-x    20 dehypnosis  staff     680 Aug  4  2016 .android
drwxr-xr-x    14 dehypnosis  staff     476 Oct 17 14:06 .atom
drwxr-xr-x     4 dehypnosis  staff     136 Jan 18  2016 .avidemux6
-rw-r--r--     1 dehypnosis  staff  140925 Dec  7 17:22 .babel.json
...

파일 권한의 종류

파일 권한은 일반 파일에 대해서 읽기(read), 쓰기/삭제(write), 실행(execute) 디렉토리에 대해서 하위 파일 읽기(read), 하위 파일 쓰기/삭제(write), 하위 파일 실행 및 디렉토리 접근(execute) 권한으로 이루어집니다.

여기에 더해서 유닉스 시스템에서 사용자들은 특정 그룹에 속해있기 때문에, 모든 파일은 파일 소유자(user), 파일 소유자와 같은 그룹(group), 이외(other)의 세 부류에 대해서 rwx의 세가지 권한, 총 9가지의 권한 설정을 갖습니다.

파일 권한의 수치화 및 변경

파일 권한은 3자리의 8진수로 표기 할 수 있습니다. 첫째 자리 숫자는 파일 소유자의 권한, 두번째 자리 숫자는 소유자와 같은 그룹의 권한, 세번째 자리는 나머지 유저에 대한 권한입니다. 각 숫자는 read(4), write(2), execute(1)의 합으로 표기됩니다. 예를 들어 7은 r+w+x, 5는 r+x, 1은 x, 0은 권한 없음을 의미합니다. 쉘에서 파일 권한을 변경하는 방법은 다음과 같습니다.

dehypnosis-mac:~ dehypnosis$ touch w x y z
dehypnosis-mac:~ dehypnosis$ ls -l
-rw-r--r--   1 dehypnosis  staff     0 Mar  6 13:28 w
-rw-r--r--   1 dehypnosis  staff     0 Mar  6 13:28 x
-rw-r--r--   1 dehypnosis  staff     0 Mar  6 13:28 y
-rw-r--r--   1 dehypnosis  staff     0 Mar  6 13:28 z

dehypnosis-mac:~ dehypnosis$ chmod 700 w
dehypnosis-mac:~ dehypnosis$ chmod 500 x
dehypnosis-mac:~ dehypnosis$ chmod 300 y
dehypnosis-mac:~ dehypnosis$ chmod 100 z
dehypnosis-mac:~ dehypnosis$ ls -l
-rwx------   1 dehypnosis  staff     0 Mar  6 13:28 w
-r-x------   1 dehypnosis  staff     0 Mar  6 13:28 x
--wx------   1 dehypnosis  staff     0 Mar  6 13:28 y
---x------   1 dehypnosis  staff     0 Mar  6 13:28 z

dehypnosis-mac:~ dehypnosis$ chmod 755 x y z w
dehypnosis-mac:~ dehypnosis$ ls -l
-rwxr-xr-x   1 dehypnosis  staff     0 Mar  6 13:33 w
-rwxr-xr-x   1 dehypnosis  staff     0 Mar  6 13:28 x
-rwxr-xr-x   1 dehypnosis  staff     0 Mar  6 13:28 y
-rwxr-xr-x   1 dehypnosis  staff     0 Mar  6 13:28 z

관리자 권한

마지막으로 특정 프로그램을 관리자(UNIX의 root 유저/Windows의 Administrator 유저) 권한으로 실행하는 명령어를 기억해둡니다. 일반 유저의 권한으로는 각종 프로그램의 설치나 시스템 설정의 변경이 불가능 할 수 있습니다. 이 때는 sudo 명령어로 임시적으로 최고 관리자 권한을 획득하여 프로그램을 실행합니다.

dehypnosis-mac:~ dehypnosis$ touch /var/log/someLogFile
touch: /var/log/someLogFile: Permission denied
dehypnosis-mac:~ dehypnosis$ sudo touch /var/log/someLogFile
dehypnosis-mac:~ dehypnosis$ ls /var/log/someLogFile
/var/log/someLogFile
이 강의를 포함한 커리큘럼
저자

김동욱

개발 경력 약 10년, 전문 분야는 웹 및 각종 응용 소프트웨어 플랫폼입니다. Codeflow를 운영하고 있습니다.

2018년 04월 10일 업데이트

지원되지 않는 웹 브라우저거나 예기치 않은 오류가 발생했습니다.