1. CLI? GUI?
인터페이스의 형태는 기본적으로 GUI와 CLI로 나뉘어진다.
GUI : Graphic User Interface의 약자로, 다음과 같은 특징을 갖는다.
- 그래픽으로 모든것을 표현하여 사용자가 이해하기 쉽게 만든 것
- 여러개의 프로그램을 한 화면에 동시에 띄울 수 있다.
- 예시로 윈도우, 웹 브라우저 등이 있다.
CLI : Command Line Interface의 약자로, 다음과 같은 특징을 갖는다.
- 근본에 가까운 인터페이스로 모든 것을 명령어로 입력받고 '문자'로 표시한다.
- 하나의 화면에 하나의 프로그램의 정보만 표현 할 수 있다.
- 예시로 리눅스의 터미널, 윈도우의 CMD 등이 있다.
우리는 여기서 CLI의 대표격인 리눅스의 'Shell'을 사용할 것이다.
2. Shell이란?
리눅스에서 사용하는 대표적인 CLI 프로그램이다.
보통 리눅스에는 bash(=dash), sh 쉘 프로그램들을 사용하고 기본적으로는 bash를 사용한다.
(이외에도 사용이 편한 zsh 등이 존재)
리눅스에서는 이 Shell 프로그램을 사용하여 명령어를 입력받고 실행/출력을 해준다.
그리고 실행할때이 Shell에 포함되어 있는 '환경변수'를 참고하여 명령어들을 실행하게 된다.
3. 환경변수?
환경 변수는 실행 중인 프로그램(프로세스)에 대한 정보들을 내포하고 있는 '변수'이다.
결국 변수(변하는 값)이기 때문에 환경 변수의 값은 고정적이지 않고 유동적이다.
3 - 1. env 명령어
다음의 env 명령어를 입력하여 현재 Shell의 환경변수를 확인해보자.
> $ env
REMOTE_HOST=::ffff:114.71.203.250
HOSTNAME=13d7f6beaf0b
HOME=/root
OLDPWD=/
TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
DEBIAN_FRONTEND=noninteractive
PWD=/home/secu/duck/training/user/training_41255
위와 같이 env 명령어를 사용하면 Shell에서의 모든 환경변수를 볼 수 있다.
위 실행 결과를 보면 환경 변수는 다음의 형태를 갖는다는 것을 확인할 수 있다.
환경변수_이름=값
또한 환경변수의 이름은 전부 대문자라는 것을 알 수 있다.
환경변수에는 대표적으로 다음과 같은 것들이 있다.
| HOME | 사용자의 home 디렉토리(윈도우의 폴더와 같은 개념)의 경로이다. |
| PATH | 명령어(프로그램)들의 경로인 path를 담고 있다. 이 path 디렉토리에 포함된 명령어(프로그램)들은 경로와 상관없이 이름을 입력하는 것만으로도 실행 할 수 있다. |
| LANG | 문자 인코딩 방식이다. |
| PWD | 프로그램이 실행중인 현재 경로이다. (중요) |
| SHELL | 현재 사용 중인 Shell 프로그램의 절대경로이다. |
| USER | 현재 사용자의 USER명이다. |
| _ | 가장 최근에 실행한 명령어의 절대 경로이다. |
등등...
환경 변수는 사용하는 프로그램의 상황에 맞춰 매우 다양한 변수들이 추가로 설정/제거 될 수 있다.
3 - 2. export 명령어
이번엔 환경변수를 추가해보자.
export 명령어는 환경변수를 추가하는 명령어로, 다음의 형태로 사용이 된다.
> $ export [환경변수_이름]=[값]
직접 export 명령어를 사용하여 TEST 변수를 추가해보자.
$ export TEST=TEST1
$ env
REMOTE_HOST=::ffff:114.71.203.250
HOSTNAME=13d7f6beaf0b
HOME=/root
OLDPWD=/
TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
DEBIAN_FRONTEND=noninteractive
TEST=TEST1
PWD=/home/secu/duck/training/user/training_41255
위의 env 결과를 보면 export 명령어를 통해 환경변수가 잘 추가된 것을 확인 할 수 있다.
3 - 3. unset 명령어
이번엔 환경변수를 해제해보자.
unset 명령어는 환경변수를 해제하는 명령어로, 다음의 형태로 사용이 된다.
> $ unset [환경변수_이름]=[값]
실습을 통해 아까 설정한 TEST 환경변수를 제거해보자.
$ unset TEST
$ env
REMOTE_HOST=::ffff:114.71.203.250
HOSTNAME=13d7f6beaf0b
HOME=/root
OLDPWD=/
TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
DEBIAN_FRONTEND=noninteractive
PWD=/home/secu/duck/training/user/training_41255
이렇게 unset 명령어를 사용하면 환경변수를 해제할 수 있다.
(잠깐 상식: export/unset 명령어는 프로그램이 아니다. export 명령어는 Shell 프로그램에 내장되어 있는 '내부 명령어'이다.)
4 - 1. 디렉토리와 파일 1
리눅스에서 사용하는 파일 구조는 크게 디렉토리와 파일로 나뉘어진다.
디렉토리(Directory) : 윈도우의 폴더와 같은 개념
파일(File) : 디렉토리를 제외한 모든 것
4 +. ls 명령어
디렉토리와 파일은 ls -al 명령어로 확인 할 수 있다.
ls 명령어는 다음의 형태로 사용된다.
> $ ls [옵션] [경로]
ls -al / 을 입력하여 루트 디렉토리의 내용을 확인해보자.
$ ls -al /
total 64
drwxr-xr-x 1 root root 4096 Mar 28 14:41 .
drwxr-xr-x 1 root root 4096 Mar 28 14:41 ..
-rwxr-xr-x 1 root root 0 Mar 28 14:41 .dockerenv
lrwxrwxrwx 1 root root 7 Nov 30 2022 bin -> usr/bin
drwxr-xr-x 2 root root 4096 Apr 15 2020 boot
drwxr-xr-x 5 root root 360 May 6 14:13 dev
drwxr-xr-x 1 root root 4096 Mar 28 14:41 etc
drwxr-xr-x 1 root root 4096 Feb 14 2023 home
lrwxrwxrwx 1 root root 7 Nov 30 2022 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 30 2022 lib32 -> usr/lib32
lrwxrwxrwx 1 root root 9 Nov 30 2022 lib64 -> usr/lib64
lrwxrwxrwx 1 root root 10 Nov 30 2022 libx32 -> usr/libx32
drwxr-xr-x 2 root root 4096 Nov 30 2022 media
drwxr-xr-x 2 root root 4096 Nov 30 2022 mnt
drwxr-xr-x 2 root root 4096 Nov 30 2022 opt
dr-xr-xr-x 673 root root 0 May 6 14:13 proc
drwx------ 2 root root 4096 Nov 30 2022 root
drwxr-xr-x 5 root root 4096 Nov 30 2022 run
lrwxrwxrwx 1 root root 8 Nov 30 2022 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Nov 30 2022 srv
dr-xr-xr-x 13 root root 0 May 6 14:13 sys
drwxrwxrwt 1 root root 4096 Feb 14 2023 tmp
drwxr-xr-x 1 root root 4096 Nov 30 2022 usr
drwxr-xr-x 1 root root 4096 Nov 30 2022 var
위 명령어에서 -a 옵션은 숨겨진 파일도 같이 확인하는 명령어이고
-l 옵션은 다음과 같은 구조로 자세하게 출력을 해주는 옵션이다.
[권한] [링크 개수] [소유자 권한] [소유 그룹 권한] [파일 크기] [생성 시간] [파일 명]
이 중, 권한을 봤을때 디렉토리와 파일은 다음으로 구분할 수 있다.
d--------- : d로 시작하는 파일은 디렉토리를 뜻한다.
---------- : 아무것도 없으면 일반 파일을 뜻한다.
이 외에도 l 등 특수한 파일들을 뜻하는 옵션들도 있다. 이에 대한 설명은 이후 포스트에.
4 - 2. 디렉토리와 파일 2
ls -al을 사용했을 때 맨위에는 항상 .과 .. 디렉토리가 존재하는데 이 둘은 각각 다음을 뜻한다.
- . : 현재 디렉토리를 명시
- .. : 상위 디렉토리를 명시
이 둘에 대한 내용은 '6. 절대경로? 상대경로?'에서 자세히 다루도록 하겠다.
리눅스에서 숨김 파일은 파일명 앞에 '.'을 붙이면 된다.
.파일명
이런 경우 ls에서 -a 옵션을 주지 않는 이상 해당 파일은 보이지 않는다.
5. 디렉토리 구분
리눅스의 디렉토리 구조는 파일 시스템 계층구조 표준(Filesystem Hierachy Standard)에 의해 정의된다.
아래 구조를 따르지 않는 리눅스 배포판도 있다.
리눅스 디렉토리 구조는 다음과 같다.
| / | root 디렉토리, 리눅스 파일 체제의 최상위 디렉토리로 모든 디렉토리의 시작점이다. |
| bin | 리눅스의 기본 명령어(binary)들이 들어있는 디렉토리로 기본적인 명령어들이 모여있는 디렉토리이다. |
| sbin | bin 디렉토리와 유사하지만 오직 루트유저만 실행할 수 있는 프로그램들이 있는 디렉토리이다. |
| dev | 장치파일들이 저장되어 있는 디렉토리로. 연결되어 있는 장치의 정보를 확인할 수 있다. |
| etc | 시스템 환경 설정 파일이 있는 디렉토리로, 네트워크 관련 설정파일, 사용자 정보 및 암호정보, 파일 시스템 정보, 보안 파일 등등이 있다. |
| home | 리눅스 사용자의 홈 디렉토리이다. |
| media | CD_ROM이나 USB 같은 외부 장치를 연결하는 디렉토리이다. |
| mnt | 파일 시스템을 임시로 연결하는 디렉토리이다. |
| root | 시스템 관리자의 홈 디렉토리로 일반 사용자가 접근하지 못한다. |
| sys | 리눅스 커널관련 정보가 있는 디렉토리이다. |
| tmp | 시스템 사용중에 발생한 임시 데이터가 저장되는 디렉토리로 부팅시 초기화 된다. |
| usr | 기본 실행파일과 라이브러리 파일, 헤더 파일 등이 저장되어있는 디렉토리로, 대부분의 응용프로그램과 파일이 저장되어 있다. |
| var | 시스템 운영중에 발생한 데이터와 로그가 저장되는 디렉토리이다. |
종류가 많지만 모두 외우지 않아도 되고, 어떤 것이 있다 정도만 알고 있으면 된다.
6. 절대경로? 상대경로?
이번엔 절대경로와 상대경로에 대해 배워보겠다.
CLI 형태의 Shell에서는 프로그램의 위치를 절대경로와 상대경로로 표현한다.
- 절대경로 : 절대적인 경로로 root 디렉토리(/)를 기준으로 표현한 경로
- 상대경로 : 상대적인 경로로 현재 실행중인 프로그램(프로세스)이 실행되고 있는 위치를 기준으로 표현된다.
6 - 1. pwd 명령어
실습에 앞서 pwd 명령어를 통해 쉽게 이해해보자.해보자.
pwd 명령어는 현재 디렉토리의 절대 경로를 확인하는 명령어로 다음의 형태로 사용된다.
> $ pwd
/home/secu/duck/training/user/training_41255
절대경로는 위처럼 맨 앞이 '/'으로 시작한다는 특징이 있다.
이유는 최상위 디렉토리인 'root(뿌리) 디렉토리'를 리눅스에서는 '/'라고 표현하기 때문이다.
절대경로를 사용하면 프로그램이 어디에서 실행되든
특정 파일의 위치를 항상 고정적인 기준으로 찾을 수 있다는 장점이 있다.
하지만 디렉토리가 많다면 경로가 매우매우 길어진다는 단점이 있다.
6 - 2. 상대경로 실습
그럼 이번엔 ls 명령어와 상대 경로를 통해
현재 디렉토리의 한칸 위의 디렉토리인 user/ 디렉토리의 내용을 확인해보자.
(여기서 쓴 '[dierctory_name]/'은 앞의 긴 경로를 생략할 때 표현한 방식이다.)
ls -al ../ 을 입력하여 상위 디렉토리의 내용을 확인해보자.
> $ ls -al ../
total 292
drwxrwxr-x 1 root secu 4096 Sep 20 14:44 .
drwxrwxr-x 1 root secu 4096 Feb 28 2023 ..
-rw-rw-r-- 1 root secu 8 Apr 5 2022 tmp
drwxr-xr-x 2 secu secu 4096 Mar 31 16:47 training_1187
drwxr-xr-x 2 secu secu 4096 Mar 31 17:17 training_12941
drwxr-xr-x 2 secu secu 4096 Apr 1 13:32 training_1525
drwxr-xr-x 2 secu secu 4096 May 10 13:35 training_15441
drwxr-xr-x 2 secu secu 4096 Mar 28 17:10 training_15800
drwxr-xr-x 2 secu secu 4096 Mar 28 19:56 training_16758
drwxr-xr-x 2 secu secu 4096 Mar 30 16:42 training_1911
drwxr-xr-x 2 secu secu 4096 May 3 12:30 training_21014
drwxr-xr-x 2 secu secu 4096 May 6 20:08 training_21193
drwxr-xr-x 2 secu secu 4096 Sep 19 20:42 training_23106
drwxr-xr-x 2 secu secu 4096 May 10 13:31 training_26643
drwxr-xr-x 2 secu secu 4096 Sep 18 23:12 training_27026
drwxr-xr-x 2 secu secu 4096 May 3 14:52 training_28047
...
위와 같이 user/ 디렉토리의 파일들이 보인다.
상대경로는 위처럼 맨 앞이 ./ 또는 ../으로 시작한다는 특징이 있다.
이는 ls -al 명령어를 배울때 나왔던 현재 디렉토리를 가리키는 것과 상위 디렉토리를
가리키는 것을 뜻한다.
../../ 과 같이 상위 디렉토리의 상위 디렉토리를 가리키는 것 또한 가능하다.
또한 ../../../../../../ ... /../../../../etc/passwd와 같이 ../이 매우매우 많이 있어도
결국에는 최상위 디렉토리를 가리킨다는 특징이 있어
이 점을 이용한 방식이 웹해킹을 하거나 할때 많이 쓰이기도 하니 알고있으면 좋다.
상대경로를 사용하면 실행되고 있는 프로그램(프로세스)의 실행 위치가 기준이 되어
가까이에 있는 파일/디렉토리에 적은 입력으로 접근이 가능하다는 장점이 있다.
> $ ls
file1 file2
"현재 디렉토리 내에 있는 file2에 접근"
> $ ./file2
하지만 멀리 있는 파일/디렉토리에 접근해야 하는 경우에는
절대경로를 사용하는 것보다 더 길어질 수 있다는 단점이 존재한다.
또 실행되고 있는 프로그램의 실행 위치가 바뀐다면 상대경로 또한 같이 바뀌어야 한다는 점도 존재한다.
이처럼 상대경로와 절대경로는 각각의 장단점이 있으므로 사용자가 상황에 맞게 잘 써야한다.