본문 바로가기
DL/LMS

2021.01.18 (월) [LMS-F] 터미널로 배우는 리눅스 운영체제

by SVCHOST 2021. 2. 1.

명령어 정리

- echo : 뒤이어 입력한 내용을 출력한다.



- pwd : Present Working Directory. 현재 내가 위치한 디렉토리 위치를 출력


- ls : 현재 디렉토리 내의 파일 및 폴더들을 출력

  • -a : 모든 숨김파일 등 표시
  • -l: 각 파일 및 폴더의 권한, 소유자, 크기, 수정일시 등 자세한 정보를 출력합니다.
  • -h: 파일 크기를 바이트 수 대신 사람이 알아볼 수 있는 단위(1K, 234M, 2G 등)로 표시합니다.
  • -t: 파일 수정시간 순으로 정렬해서 출력합니다. 최신 파일이 위쪽으로 표시됩니다.
  • -r: 정렬 순서를 뒤집어 출력합니다. -rt의 형태로 쓰면 최신 파일이 아래쪽으로 표시되어 유용할 때가 있습니다.
TIP) ls -alrt 가 유용할 때가 많다고 함.

- man : 프로그램의 매뉴얼 페이지를 출력. (man ls)


- cd : Change Directory. 뒤에 따라오는 폴더로 내가 있는 셸의 현재 위치를 이동시킨다.

그냥 cd 만 치고 뒤에 디렉토리를 지정하지 않으면, 유저의 home 디렉토리(~) 로 이동한다.

- ps : 현재 터미널과 관련된 프로세스 목록을 출력.
  pr -ef : 모든 터미널에서 현재 실행중인 프로세스 목록 및 부가정보를 출력.


- sudo kill -s KILL [프로세스번호] : 실행중인 프로세스를 강제 종료.
- grep : 입력으로 전달된 내용에서 특정 문자열을 포함한 라인만 선택해서 출력. 파이프(|)를 통해 다른 명령문 실행결과와 결합해서 사용할 때 특히 유용하다.
- sudo : 이어지는 명령을 최고관리자 권한으로 실행.
- kill : PID에 해당하는 프로세스에 시그널을 보낸다.

- which : 명령어의 전체 경로를 출력


- echo $PATH : PATH라는 이름의 환경변수($)의 값을 출력.
- export : 셸 변수나 함수를 현재 환경으로 내보냄. (환경변수 추가할 때 사용)
- env : 명령어가 제공된다면 해당 명령어를 새로운 환경에서 실행. 명령어가 제공되지 않은 경우 현재 설정된 환경변수들을 모두 출력.

- apt-get : APT 패키지 관리자를 통해 공인 저장소에서 패키지를 가져다 설치하거나 제거함.
- sudo apt-get update
- sudo apt-get install [패키지이름]
- sudo apt-get remove [패키지이름]

- cat : 하나 이상의 텍스트 파일을 순서대로 출력

- chown : 대상 파일의 소유 사용자와 그룹을 변경
- chmod : 대상 파일의 권한을 변경

- sort : 입력된 텍스트를 줄 단위로 정렬

  • 셸 환경
    • 👍history: 셸 명령어 이력을 출력합니다.
    • 👍man: 프로그램의 매뉴얼 페이지를 출력합니다.
    • 👌which: 명령어의 전체 경로를 출력합니다.
    • 👌export: 셸 변수나 함수를 현재 환경으로 내보냅니다.
    • 👌env: 명령어가 제공된다면 해당 명령어를 새로운 환경에서 >실행합니다. 명령어가 제공되지 않은 경우 현재 환경의 정보를 출력합니다.
  • 텍스트 처리
    • ❤️echo: 뒤이어 입력한 내용을 출력합니다.
    • ❤️cat: 하나 이상의 텍스트 파일을 순서대로 출력합니다.
    • 👍sort: 입력된 텍스트를 줄 단위로 정렬합니다.
    • 👍less: 텍스트 파일의 내용을 자유롭게 조회하고 검색합니다.
    • 👍head: 텍스트 파일의 앞 몇 줄만 출력합니다.
    • 👍tail: 텍스트 파일의 마지막 몇 줄만 출력합니다.
    • 👍cut: 텍스트를 구분자(delimiter)에 따라 나눕니다.
    • 👍uniq: 텍스트 중 중복 값들을 제거합니다.
    • 👍grep: 정규식을 활용해 텍스트를 검색합니다.
    • 👍wc: 텍스트를 단어, 줄, 문자 등 단위로 셉니다.
    • 👌comm: 텍스트 파일을 비교합니다.
    • 👌zcat: 압축된 텍스트 파일을 출력합니다.
    • 👌sed: 정규식을 활용해 텍스트를 변형합니다.
    • 👌awk: 텍스트를 스캔하고 변형합니다.
  • 파일 제어 및 이동
    • ❤️ls: 현재 디렉토리 내의 파일 및 폴더들을 출력합니다.
    • ❤️cd: Change Directory의 약자로, 뒤에 따라오는 폴더로 >내가 있는 셸의 현재 위치를 이동시킵니다.
    • ❤️cp: 파일을 복사합니다.
    • ❤️mv: 파일을 이동합니다.
    • ❤️rm: 파일을 삭제합니다. 폴더를 삭제하기 위해서는 -r (recursive) 옵션을, 빈 폴더가 아니더라도 내부까지 삭제하려면 -f (force) 옵션을 함께 사용해야 합니다.
    • 👍chown: 대상 파일의 소유 사용자와 그룹을 변경합니다.
    • 👍chmod: 대상 파일의 권한을 변경합니다.
    • 👍find: 파일을 찾습니다.
    • 👍pwd: Present Working Directory의 약자입니다. 현재 내가 >위치한 디렉토리 위치를 출력합니다.
    • 👌ln: 파일에 대한 링크를 생성합니다.
    • 👌touch: 파일 접근 및 수정 시간을 변경합니다. 빈 파일을 만드는데도 사용할 수 있습니다.
    • 👌tar: 파일 및 폴더를 하나의 아카이브 파일로 통합하고 압축합니다.
    • 👌mount: 새로운 저장장치를 파일시스템으로서 추가합니다.
    • 👌rename: 여러 파일들의 이름을 규칙에 따라 한번에 변경합니다.
    • 👌df: 파일시스템의 남은 용량을 표시합니다.
  • 시스템 및 프로세스 제어
    • ❤️sudo: 이어지는 명령을 최고 관리자 권한으로 실행합니다.
    • ❤️apt-get: APT 패키지 관리자를 통해 공인 저장소에서 패 >키지를 가져다 설치하거나 제거합니다.
    • 👍ps: 현재 프로세스 목록을 출력합니다.
    • 👍kill: PID에 해당하는 프로세스에 시그널을 보냅니다.
    • 👌fg: 배경에서 실행되는 작업을 전경(foreground)으로 가져옵니다.
    • 👌bg: 작업을 배경(backgound)으로 보냅니다.
    • 👌jobs: 전경 및 배경 작업의 목록을 표시합니다.
  • 기타
    • ❤️ssh: 원격으로 셸에 접속합니다.
    • 👍tmux: 여러 개의 셸 세션을 관리하고, 터미널 접속이 끊어지더라도 셸 세션을 유지합니다.
    • 👍watch: 이어지는 명령을 주기적으로 실행하여 표시합니다.
    • 👍curl: 주어진 URL과 통신합니다.
    • 👍wget: 네트워크를 통해 파일을 다운로드합니다.
    • 👍scp: SSH를 통해 원격으로 파일을 전송합니다.
    • 👌ssh-keygen: SSH 공개키 비밀키 쌍을 생성합니다.
    • 👌ssh-copy: SSH 공개키를 해당 서버에 등록합니다.
    • 👌rsync: 원격으로 파일을 동기화합니다.
    • 👌xarg: 명령어를 구성하여 실행합니다. 이전 명령에서 인자를 넘겨받아 실행하거나, 다중 프로세스를 사용하여 명령을 병렬로 실행하는 등의 작업이 가능합니다.
    • 👌cron: 주기적으로 실행될 명령을 등록합니다.
    • 👌htop: 프로세스 목록 및 자원 사용량을 시각적으로 표시합니다.

리눅스에서는 역슬래시(\)가 아닌 슬래시(/)를 통해 폴더 간 구분을 한다.

Home 디렉토리를 ~로 표시하는 것은 Home키와 ~키가 같은 자판에 있던 아주 오래전 시절부터 전해져 내려온 유구한 전통이라고 함.

@ 앞의 ssac2는 현재 로그인 한 사용자명.
@ 뒤의 ssac2-ROG-Strix-... 는 컴퓨터의 이름, 호스트명.
: 뒤의 ~는 현재 위치.
마지막 $ 는 현재 로그인한 사용자가 일반 사용자임을 나타낸다. (root 게정의 경우에는 #로 표시됨.)

 

리눅스는 UNIX라는 운영체제를 본떠 만들어졌는데, 이 UNIX의 철학 중 하나는 "모든 것은 파일이다"라는 점입니다. 윈도우에서는 각종 시스템 설정값이 레지스트리에 들어있지만, 리눅스에서는 설정값 또한 파일이며, 키보드 등의 하드웨어 기기들도 파일로서 접근 가능합니다.

 

대부분의 명령어들은 --help라는 인자를 기본으로 제공한다. 여기서 해당 명령어에 대한 설명이나 옵션 등에 대해 확인할 수 있다.

내용이 너무 길어서 화면을 넘어간 경우 Ctrl + Shift + 방향키 위/아래 를 통해 한줄씩 스크롤하거나, Shift + PageUp/PageDown 키로 한 페이지씩 위/아래로 스크롤 할 수 있다.

 

또는 명령어의 설명을 위해 --help 인자 대신 man 명령어를 사용하는 방법도 있다. manual

 

 

root 디렉토리 ( / )에 존재하는 것

  • /home: 사용자별 홈 디렉토리들이 있는 곳
  • /root: 최고 관리자 계정의 홈 디렉토리
  • /mnt: 저장장치(HDD, SSD)가 붙는 위치
  • /media: 이동식 미디어(USB 드라이브)가 붙는 위치
  • /tmp: 재부팅 시 삭제될 임시 파일들을 저장하는 폴더
  • /dev: 컴퓨터에 연결된 하드웨어 및 가상 기기(device)들을 가리키는 파일들
  • /proc: 현재 실행 중인 프로세스들을 가리키는 파일들
  • /etc: 각종 설정 파일들
  • /bin: 실행 가능한 프로그램(binary)들
  • /sbin: 시스템 관리용 프로그램들
  • /usr: 다중 사용자 모드에서 사용 가능한 파일 및 프로그램들 (root 계정만 있는 단일 사용자 모드에서는 사용 불가)
  • /var: 캐시, 로그 등 시스템 구동 간 계속 내용이 바뀌는 파일들

 

운영체제란?

CPU, Memory, SDD 등 각종 디바이스를 통합관리하면서 그 연산자원을 수많은 어플리케이션들에게 분배하는 자리에 있는 것은 바로 커널(Kernel)이라는 것이다. 커널은 보안, 자원관리, 디바이스 인터페이스 추상화 등 운영체제의 가장 핵심이 되는 구성요소이다.

 

커널(Kernel)

운영체제는 커널과 셸로 이루어져 있다.

우분투의 커널은 리눅스이고, 마이크로소프트 윈도우(Windows)의 경우 2000 이후의 버전은 Windows NT라는 커널을 사용하며, 맥 OS(macOS)의 경우에는 XNU(XNU is Not Unix의 약자)라는 커널을 사용한다.

 

맥 OS의 XNU 커널과 우분투의 리눅스 커널은 역사적 배경 때문에 모두 유닉스와 유사하며, 유닉스 표준(POSIX)과 일부 호환성이 제공된다. 이런 유사성은 두 운영체제 모두 동일하게 bash를 기본 셸로 제공하는 점에서도 찾아볼 수있다.

 

셸(Shell)

GUI(Grapical User Interface) vs. CLI(Command Line Interface)

 

프로세스와 스레드

프로그램은 컴퓨터가 수행할 작업을 기록해놓은 것을 뜻한다. 프로그램이 실제로 작업으로써 수행될 때 운영체제는 이를 프로세스(process)라는 단위로 관리하며, 운영체제는 프로세스 단위로 메모리와 CPU 연산 등 컴퓨팅 자원을 분배한다.

 

  • 메모리 관리: 운영체제는 프로세스가 컴퓨터의 전체 메모리 어디든지 쓸 수 있도록 하는 것이 아니라 가상 메모리(virtual memory)로써 일부만 떼어서 제공해줌으로써, 다른 프로세스의 메모리 또는 운영체제 자체가 사용하고 있는 커널 메모리를 훔쳐볼 수 없도록 합니다. 이것을 운영체제의 중요한 보안 기제 중 하나인 프로세스 격리(process isolation)라고 부르며, 때문에 프로세스들이 서로 소통하기 위해서는 별도로 허용된 프로세스 간 통신 (Inter-Process Communication, IPC) 기법들을 사용해야 합니다.
  • CPU 자원 관리: 메모리는 주소로서 프로세스에게 제공되지만, CPU 연산의 경우 코어 단위로 프로세스에 제공됩니다. 프로세스는 스레드(thread)라는 단위로 코어를 하나씩 사용할 수가 있는데, 프로세스가 하나 시작되면 기본적으로 하나의 스레드를 가지고 시작하지만, 개발자는 프로그램이 더 많은 스레드를 사용하도록 설계하여 다중 CPU 코어의 이점을 극대화할 수 있습니다.

프로세스는 운영체제가 메모리를 할당하는 작업단위라면, 스레드는 프로세스가 할당받은 메모리를 활용하는 실행단위이다.

하나의 프로그램 안에서 여러개의 프로세스를 활용하는 것을 멀티프로세싱(Multiprocessing), 하나의 프로세스 안에서 여러개의 스레드를 활용하는 것을 멀티스레딩(Multithreading)이라고 한다.

 

터미널

단축키 : Ctrl + Alt + t

터미널이란 컴퓨터에 정보를 입력하고 출력하는 소프트웨어 및 하드웨어로써의 장치

 

프로세스 관리와 시스템 콜

PID는 process ID 번호이고, TTY는 해당 프로세스가 붙어있는 teletype(터미널)이다. 위의 사진에서 사용자의 프로세스에서는 2번 터미널(tty2)에서 GUI 셸을 관리하는 프로그램인 Xorg가 돌아가고 있는 것을 확인할 수 있다. 또한 0번 가상 터미널(pts, pseudo teletype slave)에 우리가 방금 실행한 ps 명령어와, 해당 명령어를 실행한 셸 bash가 떠있다. TTY 칸에 ?가 표시된 프로세스들은 터미널에 부착되지 않은 프로세스들이다.

 

패키지 관리자

우분투 운영체제는 공식적으로 APT(Advanced Packaging Tool)라는 패키지 관리자(package manager) 를 제공한다.

패키지 관리자란 공인 저장소에서 프로그램과 라이브러리(다른 프로그램들이 참조하여 사용할 수 있는 코드)를 패키지 단위로 설치하고 관리할 수 있도록 하는 프로그램

 

우분투에는 APT말고도 Snap이라는 비교적 새로운 프로그램도 있으며, CentOS의 YUM(Yellowdog Updater Modified), Red Hat 계열의 RPM(Red Hat Package Manager) 등 각 리눅스 계열 운영체제는 다양한 기본 패키지 관리자를 제공하며, 운영체제 패키지 관리자 외에도 파이썬의 pip(Python Package Installer) 등 프로그래밍 언어상 제공되는 경우도 있다.

 

사용자와 권한

리눅스 기반 운영체제, 윈도우, 맥 OS 모두 공통적으로, 해당 사용자 계정에게 운영체제에 대한 모든 권한이 주어지지는 않는다. 보안 및 시스템 안정성을 위해 완전한 권한은 운영체제에 기본으로 설정된 최고 관리자(superuser) 계정만이 가지고 있으며, 윈도우에서는 이 계정을 Administrator이라고 부르고, 유닉스 계열 운영체제에서는 root라는 아이디를 가지고 있다.

 

sudo(Switch User Do) 명령어는 관리자 권한으로 실행하게 도와주며, 매번 확인해야 하는 것이 번거로울 수 있지만, 한 번 더 확인함으로써 실수를 방지할 기회를 준다는 것 외에도 모든 권한이 아닌 일부 권한만 허용할 수 있는 등 다양한 보안상의 이점이 있다.

 

사용자 그룹

사용자들이 여러 명 있을 때, 쉽게 묶어서 관리하는 개념이 바로 그룹(group)이다. 예를 들어 한 사용자가 sudo 명령어를 실행하기 위해서는, 동일한 이름(sudo)라는 이름의 그룹에 속해있어야 한다.

sudo 그룹(27번)에 june 사용자가 들어있는 것을 알 수 있다. 특이한 점은 직접 만든 적이 없음에도 사용자명과 동일한 이름의 그룹(june, 1000번)이 등록되어 있다는 사실이다. 이는 모든 사용자는 최소한 하나 이상의 그룹에 등록되어 있어야 하기 때문에 사용자가 생성될 때 자동으로 동일한 이름을 가진 그룹이 생성되기 때문이다.

 

접근 권한

chown 명령을 통해 소유 사용자를 변경할 수 있다.

 

디렉토리 내의 모든 파일들에 대해 적용하려면 -R 옵션(recursive)을 사용해야 함.

drwxr-xr-x : 해당 파일이 디렉토리이고(d), 소유자는 읽기(r) 쓰기(w) 실행(x)하는 모든 동작이 가능하지만, 소유 그룹 소속 사용자와 기타 사용자들은 읽고 실행하기만 가능하다는 것을 표시한다.

 

chmod 명령어를 통해 권한을 변경할 수 있다.

  • 사용자: 이진수 111 = 십진수 7
  • 그룹: 이진수 101 = 십진수 5
  • 기타 사용자: 이진수 101 = 십진수 5
  • 종합: 755

 

셸 편리한 기능

  • 터미널 에뮬레이터에서 무언가를 복사하거나 붙여넣을 때에는 Ctrl+Shift+C, Ctrl+Shift+V를 사용해야 합니다.
  • 위아래 화살표를 통해 이전에 실행한 명령들을 다시 입력할 수 있습니다.
  • history 명령을 통해 기존에 실행한 명령들을 표시할 수 있습니다. 여기서 나오는 번호를 참고하여 !번호를 실행하면 해당 번호의 명령이 다시 실행됩니다.
  • Ctrl+A, Ctrl+E를 통해 명령어의 앞, 뒤로 커서를 이동할 수 있습니다.
  • clear 명령어 또는 Ctrl+L을 통해 기존에 터미널에 출력되었던 내용을 깨끗이 지울 수 있습니다.
  • 실수로 Ctrl+z를 눌러 프로세스를 중지시켰다면, fg를 통해 다시 재개시킬 수 있습니다.
  • 실수로 vi 편집기에 처음 들어갔다면, Ctrl+C 또는 Esc를 누른 뒤 :q!를 입력하고 엔터를 눌러 편집기를 종료할 수 있습니다.
  • sudo apt install curl 및 curl parrot.live를 통해 춤추는 앵무새를 볼 수 있습니다.

 

#! /bin/bash는 스크립트 파일 맨 위에 작성하며, 이 스크립트 파일을 실행할 때 어떤 프로그램을 사용해야 할 지 알려준다.

 

셸에도 파이썬처럼 조건문과 연산자가 있다.

|| 를 써서 이전 명령이 false를 반환한 경우에만 다음 명령을 실행하거나, &&로 이전 명령이 true를 반환한 경우에만 명령을 실행하게끔 할 수 있다.

 

> 를 통해 명령어의 결과를 파일에 저장하는 것도 가능하다.

>>를 쓰면 명령어의 결과가 기존 파일 뒤에 추가된다.

 

 

 

[ 연습 문제 ]

더보기

1. 이름이 --all인 폴더를 만들어봅시다.

mkdir ./\--all

(지울때는) rm -r ./--all

 

2. titanic.csv에서 남성과 여성이 몇 명인지 세어봅시다. 우선 tail 을 통해 첫 줄을 제외한 나머지 줄을 출력하고, cut으로 성별이 들어있는 열만 추출한 다음, ④로 뭔가 쓱싹 한 다음에 uniq로 각각 세어봅시다.

tail -n +2 titanic.csv | cut -d"," -f6 | sort | uniq -c

 

3. titanic.csv에서 성이 Brown인 사람이 몇 명인지 세어봅시다. 성이 아닌 나머지 이름에 Brown이 들어가는 경우도 있으니 조심해야 합니다.

cat titanic.csv | cut -d"," -f4 | grep 'Brown' | wc -l