coredot.today
Linux 터미널 입문: 마우스 없이 컴퓨터를 다루는 법
블로그로 돌아가기
Linux터미널CLIBash클라우드DevOpsDX

Linux 터미널 입문: 마우스 없이 컴퓨터를 다루는 법

클라우드 서버의 96%는 Linux다. GUI 없이 텍스트만으로 서버를 제어하는 터미널 사용법을, 역사부터 실전 명령어까지 완전히 풀어본다. DX 전문가로 가는 첫 번째 관문.

코어닷투데이2026-04-01100

들어가며: 왜 터미널을 배워야 하는가

처음 터미널 화면을 마주한 한국 대학생의 호기심 어린 표정

취업 준비 중인 26살 민수는 클라우드 엔지니어 채용 공고를 보고 있다. "AWS EC2 운영 경험", "Linux 서버 관리 능력", "셸 스크립트 작성 가능자 우대". 공고마다 빠지지 않는 키워드가 있다 — Linux.

민수는 윈도우와 맥만 써 봤다. 파일을 옮기려면 드래그 앤 드롭, 프로그램을 설치하려면 .exe나 .dmg를 더블클릭하면 됐다. 그런데 클라우드 세계에서는 사정이 다르다. AWS, Azure, GCP — 어느 클라우드를 쓰든 서버에 접속하면 마주하는 건 까만 화면과 깜빡이는 커서뿐이다.

96.3% 클라우드 서버의 OS 비율 Linux 기반 (2025 W3Techs)
100% AWS EC2 AMI 중 Linux Amazon Linux, Ubuntu, RHEL 등
Top 500 세계 슈퍼컴퓨터 OS 전부 Linux (2025 기준)

마우스가 없는 세계. 그래픽 인터페이스 없이 텍스트 명령어만으로 파일을 만들고, 서버를 설정하고, 프로그램을 실행하는 세계. 이 글은 그 세계로 들어가는 첫 번째 문이다.

GUI(Graphical User Interface)에 익숙한 세대에게 터미널은 낯설다. 하지만 이것만 기억하자 — 클라우드의 언어는 터미널이다. DX(Digital Transformation) 전문가가 되려면, 이 언어를 먼저 배워야 한다.


1. 역사: Unix에서 Linux까지, 운영체제의 계보

모든 것의 시작 — Unix (1969)

1969년, 미국 벨 연구소(Bell Labs)의 켄 톰프슨(Ken Thompson)데니스 리치(Dennis Ritchie)가 Unix를 만들었다.

1991년 헬싱키에서 코딩하는 젊은 리누스 토르발스와 펭귄 마스코트 당시 컴퓨터는 냉장고만 한 크기였고, 한 대에 수억 원이었다. 여러 사람이 하나의 컴퓨터를 동시에 사용해야 했기 때문에, "다중 사용자, 다중 작업"을 지원하는 운영체제가 필요했다.

Unix의 철학은 단순했다:

원칙 1 하나의 프로그램은 하나의 일만 잘 한다 — 작고 전문화된 도구들의 조합
원칙 2 프로그램의 출력은 다른 프로그램의 입력이 된다 — 파이프(|)로 연결
원칙 3 모든 것은 파일이다 — 디바이스, 프로세스, 네트워크까지 파일로 다룬다
원칙 4 텍스트를 만능 인터페이스로 사용한다 — 바이너리 대신 사람이 읽을 수 있는 텍스트

50년이 지난 지금도 이 철학은 살아 있다. 터미널에서 ls | grep .txt | wc -l 같은 명령어를 쓸 때, 우리는 1969년의 Unix 철학을 그대로 실천하고 있는 것이다.

Unix에서 갈라진 가지들

Unix는 상업용 라이센스였다. AT&T(벨 연구소의 모회사)가 소유권을 가지고 있었기 때문에 자유롭게 쓸 수 없었다. 이 문제를 해결하기 위해 여러 프로젝트가 생겨났다.

1969
Unix 탄생
벨 연구소의 켄 톰프슨과 데니스 리치가 PDP-7에서 개발. 최초의 다중 사용자 운영체제.
1977
BSD(Berkeley Software Distribution)
UC 버클리에서 Unix를 기반으로 개발. 이후 FreeBSD, OpenBSD, NetBSD로 분화. macOS의 조상이기도 하다.
1983
GNU 프로젝트 시작
리처드 스톨먼이 "자유 소프트웨어" 운동을 시작. Unix 호환 도구들을 무료로 만들기 시작한다. (GNU = "GNU's Not Unix")
1991
Linux 커널 탄생
핀란드 헬싱키대 학생 리누스 토르발스가 "취미 프로젝트"로 커널을 공개. GNU 도구 + Linux 커널 = 완전한 무료 운영체제의 탄생.
2004~
Ubuntu, CentOS 등장
일반인도 쓸 수 있는 Linux 배포판들이 등장. 클라우드 시대가 시작되면서 서버 OS의 표준이 된다.
2026
현재
Linux는 클라우드, 스마트폰(Android), IoT, 슈퍼컴퓨터, 자동차 인포테인먼트까지 — 세계에서 가장 널리 쓰이는 OS가 되었다.

리누스 토르발스 — 21살 대학생의 "취미 프로젝트"

1991년 8월 25일, 헬싱키 대학교의 21살 컴퓨터공학과 학생 리누스 토르발스(Linus Torvalds)는 Usenet 뉴스그룹에 이런 글을 올렸다:

comp.os.minix — 1991.08.25

"저는 386/486 AT 클론용 무료 운영체제를 만들고 있습니다. (취미일 뿐이고, GNU처럼 크고 전문적인 것은 아닐 겁니다)"

— Linus Torvalds

"취미일 뿐"이라던 그 프로젝트가 오늘날 전 세계 클라우드 인프라의 96%, 스마트폰의 72%(Android), 세계 Top 500 슈퍼컴퓨터의 100%를 움직이고 있다. 리누스가 만든 것은 커널(Kernel) — 운영체제의 핵심 엔진이다. 여기에 GNU 프로젝트의 도구들(컴파일러, 셸, 유틸리티)이 합쳐져 우리가 아는 "Linux"가 완성되었다.

💡
Linux vs GNU/Linux: 엄밀히 말하면 "Linux"는 커널의 이름이다. 우리가 쓰는 운영체제 전체는 GNU/Linux가 정확한 명칭이다. 하지만 관례적으로 그냥 "Linux"라고 부른다. 리처드 스톨먼은 이 명칭 문제에 대해 오늘날까지도 강력히 항의하고 있다.

2. 셸, 터미널, 콘솔: 헷갈리는 용어 정리

터미널을 배우기 전에 자주 혼동되는 세 가지 용어를 정리하자.

터미널, 셸, 커널의 관계를 호두에 비유한 그림

용어비유실체
터미널 (Terminal)전화기사용자 입력을 받고 출력을 보여주는 프로그램. macOS의 Terminal.app, Windows의 Windows Terminal, iTerm2 등
셸 (Shell)교환원사용자의 명령어를 해석하고 운영체제에 전달하는 인터프리터. Bash, Zsh, Fish 등
콘솔 (Console)공중전화 부스물리적 입출력 장치. 서버실의 모니터+키보드 조합. 요즘은 거의 "터미널"과 같은 의미로 쓰인다

정리하면: 터미널(창)을 열면 그 안에서 (Bash 등)이 실행되고, 셸이 사용자의 명령어를 해석해서 OS에 전달한다.

주요 셸 비교

특징기본 탑재추천 대상
Bash가장 보편적. 스크립팅 표준. 거의 모든 Linux에 설치됨대부분의 Linux 배포판입문자, 서버 관리자
ZshBash 호환 + 자동완성 강화, 테마(Oh My Zsh), 플러그인 생태계macOS (Catalina 이후)개발자, macOS 사용자
Fish설정 없이 자동완성, 구문 하이라이팅 기본 제공. Bash 비호환별도 설치 필요편의성 중시 사용자
Sh (POSIX)최소한의 기능. 이식성 최고. 임베디드 환경에서 사용모든 Unix 계열임베디드, 최소 환경
💡
입문자 추천: Bash부터 시작하자. 클라우드 서버에서 가장 많이 만나는 셸이 Bash다. Bash를 익힌 후 Zsh로 넘어가면 자연스럽다 — Zsh는 Bash의 거의 모든 문법을 그대로 지원한다.

3. 프롬프트 읽기: 까만 화면이 알려주는 정보

터미널을 열면 가장 먼저 보이는 것이 프롬프트(Prompt)다. 이것은 "지금 명령어를 입력해도 됩니다"라는 신호이자, 현재 상태를 요약한 정보다.

터미널 프롬프트 구조

minsoo@ubuntu-server:~/projects$

사용자명 @ 호스트명(컴퓨터 이름) : 현재 위치(디렉토리) $ = 일반 사용자 / # = root(관리자)

$가 보이면 일반 사용자, #이 보이면 root(최고 관리자)다. root로 작업할 때는 시스템을 망가뜨릴 수 있으니 항상 주의가 필요하다.

~는 홈 디렉토리의 줄임말이다. /home/minsoo~로 표시한다.


4. 필수 명령어 20선: 이것만 알면 서버를 다룰 수 있다

친근한 로봇이 학생에게 파일 시스템 명령어를 가르치는 모습

4.1 위치와 이동

가장 기본적인 세 가지 명령어부터 시작하자.

위치 확인과 이동

$ pwd

/home/minsoo/projects

$ ls

README.md app.py config/ data/ requirements.txt

$ ls -la

total 24

drwxr-xr-x 4 minsoo minsoo 4096 Apr 1 09:30 .

drwxr-xr-x 8 minsoo minsoo 4096 Mar 31 15:00 ..

-rw-r--r-- 1 minsoo minsoo 342 Apr 1 09:30 README.md

-rwxr-xr-x 1 minsoo minsoo 1205 Apr 1 09:15 app.py

drwxr-xr-x 2 minsoo minsoo 4096 Mar 30 12:00 config

$ cd config

$ cd .. # 상위 디렉토리로 이동

$ cd ~ # 홈 디렉토리로 이동

$ cd / # 루트 디렉토리로 이동

명령어역할비유
pwd현재 위치 출력 (Print Working Directory)"내가 지금 어디에 있지?"
ls현재 디렉토리의 파일/폴더 목록"이 방에 뭐가 있지?"
ls -la숨김 파일 포함 상세 목록 (권한, 크기, 날짜)"이 방의 모든 것을 자세히 보여줘"
cd디렉토리 이동 (Change Directory)"다른 방으로 가자"

4.2 파일과 디렉토리 조작

파일/디렉토리 생성, 복사, 이동, 삭제

# 디렉토리 생성

$ mkdir my-project

$ mkdir -p my-project/src/components # 중간 경로까지 한번에 생성

# 빈 파일 생성

$ touch index.html

# 파일 복사

$ cp index.html backup.html

$ cp -r config/ config-backup/ # 디렉토리 복사 (-r: recursive)

# 파일 이동 / 이름 변경

$ mv backup.html archive/ # 이동

$ mv old-name.txt new-name.txt # 이름 변경

# 파일 삭제

$ rm temp.txt

$ rm -r old-directory/ # 디렉토리 삭제

$ rm -rf unwanted/ # 강제 삭제 (확인 없이) ⚠️ 주의!

⚠️
rm -rf를 조심하라: rm -rf /는 시스템의 모든 파일을 삭제한다. root 권한으로 실행하면 운영체제까지 사라진다. 현대 Linux는 이를 방지하는 안전장치(--preserve-root)가 있지만, 여전히 rm -rf는 가장 위험한 명령어다. 삭제 전에 항상 경로를 두 번 확인하자.

4.3 파일 내용 보기

파일 내용 확인

$ cat README.md # 파일 전체 출력

$ head -20 app.py # 처음 20줄만

$ tail -50 server.log # 마지막 50줄만

$ tail -f server.log # 실시간 로그 모니터링 (follow)

$ less large-file.txt # 페이지 단위로 스크롤 (q로 종료)

tail -f는 서버 운영자가 가장 많이 쓰는 명령어 중 하나다. 서버 로그 파일을 실시간으로 모니터링할 때 사용한다. 에러가 발생하면 즉시 화면에 나타난다.

4.4 검색의 왕 — grep과 find

grep — 파일 내용에서 텍스트 검색

$ grep "error" server.log # server.log에서 "error" 포함 줄 찾기

$ grep -i "error" server.log # 대소문자 무시 (-i)

$ grep -r "TODO" ./src/ # src 디렉토리 전체에서 재귀 검색 (-r)

$ grep -rn "import" ./src/ # 줄 번호까지 표시 (-n)

$ grep -c "ERROR" server.log # 매칭 줄 수만 출력 (-c)

find — 파일 이름/속성으로 검색

$ find . -name "*.py" # 현재 디렉토리 하위 모든 .py 파일

$ find /var/log -name "*.log" -mtime -7 # 최근 7일 내 수정된 .log 파일

$ find . -type d -name "node_modules" # node_modules 디렉토리 찾기

$ find . -size +100M # 100MB 초과 파일 찾기

4.5 파이프(|)와 리다이렉트(>, >>)

Unix 철학의 핵심 — 프로그램의 출력을 다른 프로그램의 입력으로 연결하는 기능이다.

명령어 A의 출력
| (파이프)
명령어 B의 입력
파이프(|) 활용 예제

# 로그에서 에러만 추출해서 줄 수 세기

$ cat server.log | grep "ERROR" | wc -l

47

# 현재 실행 중인 프로세스에서 nginx 찾기

$ ps aux | grep nginx

# 디스크 사용량을 크기순으로 정렬

$ du -sh * | sort -rh | head -10

리다이렉트(>, >>) — 출력을 파일로 저장

$ echo "Hello World" > hello.txt # 새 파일 생성 (덮어쓰기)

$ echo "Another line" >> hello.txt # 기존 파일에 추가 (append)

$ grep "ERROR" server.log > errors.txt # 에러 로그만 별도 파일로

$ ls -la > file-list.txt # 파일 목록을 파일로 저장

기호이름동작
|파이프왼쪽 명령의 출력 → 오른쪽 명령의 입력
>리다이렉트 (덮어쓰기)출력을 파일로 저장. 기존 내용 삭제
>>리다이렉트 (추가)출력을 파일 끝에 추가
<입력 리다이렉트파일 내용을 명령의 입력으로 전달
2>에러 리다이렉트에러 메시지만 파일로 저장

4.6 명령어 요약 치트시트

분류명령어설명
위치/이동pwd현재 디렉토리 경로 출력
ls [-la]파일/디렉토리 목록
cd [경로]디렉토리 이동
tree디렉토리 트리 구조 표시
파일 조작touch [파일]빈 파일 생성
mkdir [-p] [디렉토리]디렉토리 생성
cp [-r] [원본] [대상]파일/디렉토리 복사
mv [원본] [대상]이동 또는 이름 변경
rm [-rf] [대상]삭제 (주의!)
파일 보기cat [파일]전체 내용 출력
head [-n] [파일]처음 n줄 출력
tail [-f] [파일]마지막 줄 출력 / 실시간 모니터링
less [파일]페이지 단위로 보기
검색grep [패턴] [파일]파일 내용에서 텍스트 검색
find [경로] [조건]파일 이름/속성으로 검색
조합|파이프 — 출력을 다음 명령의 입력으로
> / >>출력을 파일로 저장 (덮어쓰기/추가)
wc [-l]줄 수 / 단어 수 / 바이트 수 세기

5. 파일 시스템 계층 구조: Linux의 집 구조

리눅스 파일 시스템을 아파트 건물 층수에 비유한 일러스트

윈도우는 C:\, D:\ 같은 드라이브 문자를 쓴다. Linux는 다르다. 모든 것이 루트(/)라는 하나의 뿌리에서 시작하는 트리 구조다.

Linux 파일 시스템 계층 구조 (FHS)
/ 루트 디렉토리 모든 것의 시작점
/home 사용자 홈 개인 파일, 설정
/etc 시스템 설정 설정 파일 모음
/var 가변 데이터 로그, 캐시, 메일
/tmp 임시 파일 재부팅 시 삭제
/usr 사용자 프로그램 bin, lib, share
/opt 추가 소프트웨어 서드파티 앱
/bin 필수 바이너리 ls, cp, mv 등
/dev 디바이스 파일 하드웨어 인터페이스

주요 디렉토리 상세 설명

경로역할비유실제 예시
/루트 디렉토리. 모든 파일의 최상위아파트 건물 전체모든 경로의 시작점
/home사용자별 개인 공간각자의 방/home/minsoo, /home/jiyoung
/etc시스템 설정 파일 (Editable Text Configuration)관리사무소 서류함/etc/nginx/nginx.conf, /etc/hosts
/var가변 데이터 — 로그, DB, 캐시우편함 + 쓰레기통/var/log/syslog, /var/www/html
/tmp임시 파일 (재부팅 시 삭제됨)화이트보드설치 과정의 임시 파일
/usr사용자 프로그램, 라이브러리공용 시설 (도서관, 체육관)/usr/bin/python3, /usr/lib/
/opt서드파티 소프트웨어 설치건물 내 입주 상가/opt/google/chrome, /opt/containerd
/bin필수 명령어 바이너리비상구, 소화기ls, cp, mv, cat, grep
/sbin시스템 관리용 바이너리관리실 전용 도구mount, reboot, iptables
/dev장치 파일콘센트, 수도꼭지/dev/sda (디스크), /dev/null (블랙홀)
💡
/dev/null의 마법: /dev/null은 "블랙홀" 파일이다. 여기에 무엇을 보내든 사라진다. 불필요한 출력을 버릴 때 command > /dev/null 2>&1처럼 사용한다. 에러 메시지까지 모두 조용히 처리할 수 있다.

6. 패키지 관리: 소프트웨어 설치의 기술

윈도우에서는 크롬을 설치하려면 구글 사이트에 가서 .exe를 다운로드한다. Linux에서는 패키지 매니저라는 중앙 관리 시스템을 통해 한 줄의 명령어로 소프트웨어를 설치, 업데이트, 삭제한다.

스마트폰의 앱스토어를 생각하면 된다. apt install nginx는 앱스토어에서 "설치" 버튼을 누르는 것과 같다.

배포판별 패키지 매니저

패키지 매니저배포판설치 명령패키지 형식
aptUbuntu, Debiansudo apt install nginx.deb
yum / dnfCentOS, RHEL, Fedora, Amazon Linuxsudo yum install nginx.rpm
pacmanArch Linuxsudo pacman -S nginx.pkg.tar.zst
brewmacOS (비공식 Linux도 지원)brew install nginx소스 빌드 또는 bottle

apt 실전 명령어 (Ubuntu/Debian)

Ubuntu는 클라우드에서 가장 많이 쓰이는 Linux 배포판이므로, apt를 중심으로 살펴보자.

apt 패키지 관리 필수 명령어

# 패키지 목록 업데이트 (설치 전 항상 실행)

$ sudo apt update

# 패키지 설치

$ sudo apt install nginx

# 설치된 모든 패키지 업그레이드

$ sudo apt upgrade

# 패키지 삭제

$ sudo apt remove nginx

# 패키지 검색

$ apt search "web server"

# 패키지 정보 확인

$ apt show nginx

💡
sudo란? "Super User DO"의 약자. 관리자(root) 권한으로 명령어를 실행한다. 소프트웨어 설치, 시스템 설정 변경 등은 일반 사용자 권한으로 할 수 없기 때문에 sudo를 앞에 붙인다. 비밀번호를 입력하면 일시적으로 관리자 권한을 획득한다.

7. 프로세스 관리: 프로그램의 생사여탈

"프로세스"란 실행 중인 프로그램이다. 크롬 브라우저를 더블클릭하면 "크롬이라는 프로세스"가 생성된다. 서버에서 Nginx를 실행하면 "Nginx 프로세스"가 만들어진다.

터미널에서는 이 프로세스들을 직접 관찰하고, 제어하고, 종료할 수 있다.

프로세스 확인

프로세스 확인 명령어

# 현재 실행 중인 모든 프로세스

$ ps aux

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

root 1 0.0 0.1 168940 11788 ? Ss Mar31 0:05 /sbin/init

www-data 1234 0.2 0.5 45316 21892 ? S 09:15 0:12 nginx: worker

minsoo 5678 1.3 2.1 389012 87432 ? Sl 10:00 0:45 node server.js

# 특정 프로세스만 필터링

$ ps aux | grep nginx

# 실시간 모니터링 (CPU, 메모리 사용량)

$ top # 기본 모니터 (q로 종료)

$ htop # 향상된 버전 (색상, 마우스 지원)

프로세스 종료

프로세스 종료 (kill)

$ kill 5678 # PID 5678 프로세스에 종료 요청 (SIGTERM)

$ kill -9 5678 # 강제 종료 (SIGKILL) — 최후의 수단

$ killall nginx # 이름으로 모든 nginx 프로세스 종료

kill은 기본적으로 "정중한 종료 요청(SIGTERM)"을 보낸다. 프로세스가 이를 무시하면 kill -9로 "강제 퇴장(SIGKILL)"시킨다. 가능하면 항상 일반 kill을 먼저 시도하자 — 정중한 종료는 프로세스가 데이터를 저장하고 깔끔하게 마무리할 시간을 준다.

systemctl — 서비스 관리

현대 Linux(systemd 기반)에서는 systemctl로 서비스(백그라운드 프로세스)를 관리한다.

systemctl 서비스 관리

$ sudo systemctl start nginx # 서비스 시작

$ sudo systemctl stop nginx # 서비스 중지

$ sudo systemctl restart nginx # 재시작

$ sudo systemctl status nginx # 상태 확인

$ sudo systemctl enable nginx # 부팅 시 자동 시작 설정

$ sudo systemctl disable nginx # 자동 시작 해제

start 서비스를 시작한다. 이미 실행 중이면 에러.
status 서비스의 현재 상태(실행 중/중지됨), PID, 최근 로그를 보여준다.
restart 설정 파일을 수정한 후 반영하려면 restart. stop → start를 한 번에.
enable 서버가 재부팅되어도 자동으로 시작되게 설정. 프로덕션 필수.

8. 사용자와 권한: rwx의 세계

Linux는 다중 사용자 시스템이다. 한 서버에 여러 사람이 접속해서 작업한다. 당연히 "누가 무엇을 할 수 있는가"를 제어하는 권한 시스템이 필수다.

chmod 권한을 아파트 현관문 자물쇠에 비유한 일러스트 — 소유자, 그룹, 기타 사용자

rwx 권한을 신호등에 비유한 세 캐릭터

권한 읽는 법

ls -la를 실행하면 왼쪽에 -rwxr-xr-- 같은 문자열이 보인다. 이것이 파일 권한(Permission)이다.

파일 권한 구조 분석

-rwxr-xr--

타입   소유자(User)   그룹(Group)   기타(Others)

타입: - = 일반 파일, d = 디렉토리, l = 심볼릭 링크

rwx의 의미

카페에 비유해 보자. 카페의 레시피 노트가 있다.

권한문자숫자카페 비유
읽기 (Read)r4레시피를 읽을 수 있다
쓰기 (Write)w2레시피를 수정/추가할 수 있다
실행 (Execute)x1레시피대로 커피를 만들 수 있다

숫자로 표현하면: r(4) + w(2) + x(1) = 7. 그래서 chmod 755는 이런 뜻이다:

7 (rwx) 소유자 — 읽기(4) + 쓰기(2) + 실행(1) = 모든 권한
5 (r-x) 그룹 — 읽기(4) + 실행(1) = 읽고 실행은 가능, 수정은 불가
5 (r-x) 기타 — 읽기(4) + 실행(1) = 마찬가지로 읽고 실행만

chmod와 chown 실전

권한 변경 (chmod) & 소유자 변경 (chown)

# 숫자 방식

$ chmod 755 deploy.sh # rwxr-xr-x (스크립트 실행 가능하게)

$ chmod 644 config.yaml # rw-r--r-- (설정 파일: 소유자만 수정)

$ chmod 600 .env # rw------- (비밀 파일: 소유자만 접근)

# 기호 방식

$ chmod +x script.sh # 모든 사용자에게 실행 권한 추가

$ chmod u+w file.txt # 소유자(user)에게 쓰기 권한 추가

$ chmod go-w file.txt # 그룹(g)과 기타(o)의 쓰기 권한 제거

# 소유자 변경

$ sudo chown minsoo:dev deploy.sh # 소유자=minsoo, 그룹=dev

$ sudo chown -R www-data:www-data /var/www/ # 재귀적으로 변경

자주 쓰는 권한 숫자

자주 사용하는 chmod 숫자
777
rwxrwxrwx ⚠️
755
rwxr-xr-x
700
rwx------
644
rw-r--r--
600
rw-------
400
r--------
⚠️
chmod 777은 절대 금지: 모든 사용자에게 모든 권한을 부여한다. "집 열쇠를 모든 사람에게 나눠주는 것"과 같다. 특히 웹 서버 파일에 777을 설정하면 해킹의 문을 활짝 여는 것이다. 프로덕션 서버에서는 최소 권한 원칙(Principle of Least Privilege)을 지키자.

9. 실전 연습: 터미널로 웹 서버 올리기

지금까지 배운 것을 종합해서, EC2 인스턴스에 Nginx 웹 서버를 설치하고 "Hello, World!" 페이지를 띄우는 실전 시나리오를 따라해 보자.

터미널로 웹 서버를 성공적으로 띄운 개발자의 환호

Step 1: EC2에 SSH 접속

SSH로 서버 접속

# 키 파일 권한 설정 (AWS에서 다운받은 .pem 파일)

$ chmod 400 my-server-key.pem

# SSH 접속

$ ssh -i my-server-key.pem ubuntu@3.35.xxx.xxx

Welcome to Ubuntu 24.04 LTS

ubuntu@ip-172-31-12-34:~$

chmod 400으로 키 파일을 "소유자만 읽기 가능"으로 설정한다. SSH는 키 파일의 권한이 너무 열려 있으면 접속을 거부한다 — 보안을 위해서다.

Step 2: Nginx 설치

Nginx 웹 서버 설치

# 패키지 목록 업데이트

$ sudo apt update

Hit:1 http://ap-northeast-2.ec2.archive.ubuntu.com/ubuntu noble InRelease

Reading package lists... Done

# Nginx 설치

$ sudo apt install nginx -y

Setting up nginx (1.24.0-2ubuntu7) ...

# 설치 확인

$ nginx -v

nginx version: nginx/1.24.0 (Ubuntu)

Step 3: 서비스 시작 및 확인

Nginx 서비스 관리

# Nginx 시작

$ sudo systemctl start nginx

# 상태 확인

$ sudo systemctl status nginx

● nginx.service - A high performance web server

Active: active (running) since Tue 2026-04-01 10:00:00 KST

# 부팅 시 자동 시작 설정

$ sudo systemctl enable nginx

# 80번 포트 리스닝 확인

$ sudo ss -tlnp | grep :80

LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1234,fd=6))

Step 4: 커스텀 페이지 만들기

Hello World 페이지 작성

# Nginx 기본 웹 루트 확인

$ ls /var/www/html/

index.nginx-debian.html

# 기존 파일 백업

$ sudo cp /var/www/html/index.nginx-debian.html /var/www/html/index.backup

# 새 페이지 작성 (nano 에디터 사용)

$ sudo nano /var/www/html/index.html

nano 에디터가 열리면 다음 내용을 입력한다:

hljs language-html
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>내 첫 번째 서버</title>
    <style>
        body {
            font-family: -apple-system, sans-serif;
            display: flex;
            justify-content: center;
            align-items: center;
            min-height: 100vh;
            background: #0f172a;
            color: #e2e8f0;
        }
        h1 { font-size: 3rem; }
    </style>
</head>
<body>
    <h1>Hello, World! 🚀</h1>
</body>
</html>

Ctrl + O로 저장, Ctrl + X로 nano를 종료한다.

Step 5: 확인

결과 확인

# 서버 내부에서 확인

$ curl localhost

<!DOCTYPE html>

<html lang="ko">

...

# 접속 로그 실시간 확인

$ sudo tail -f /var/log/nginx/access.log

브라우저에서 EC2의 퍼블릭 IP 주소(http://3.35.xxx.xxx)를 입력하면, 방금 만든 페이지가 보인다.

전체 과정 요약

SSH 접속 ssh -i key.pem ubuntu@IP — 터미널에서 원격 서버로 연결
패키지 업데이트 sudo apt update — 소프트웨어 목록 최신화
Nginx 설치 sudo apt install nginx — 웹 서버 설치
서비스 시작 sudo systemctl start nginx + enable — 실행 및 자동시작 설정
페이지 작성 nano /var/www/html/index.html — HTML 파일 편집
확인 curl localhost + 브라우저 접속 — 동작 테스트
축하한다! 방금 마우스를 한 번도 클릭하지 않고, 오직 텍스트 명령어만으로 클라우드 서버에 웹사이트를 배포했다. 이것이 클라우드 엔지니어의 일상이다.

10. 더 알면 좋은 것들: 터미널 생산성 팁

키보드 단축키

터미널 고수와 초보의 가장 큰 차이는 단축키 사용 여부다.

단축키기능빈도
Tab자동 완성 — 파일명, 디렉토리명, 명령어매 줄마다
Ctrl + C현재 실행 중인 명령 중단매우 자주
Ctrl + R명령어 히스토리 검색 (이전에 쓴 명령어 찾기)자주
Ctrl + L화면 지우기 (clear와 동일)자주
Ctrl + A커서를 줄 맨 앞으로가끔
Ctrl + E커서를 줄 맨 뒤로가끔
Ctrl + D현재 셸 종료 (exit와 동일)가끔
↑ / ↓이전/다음 명령어 탐색매우 자주

알아두면 편한 추가 명령어

생산성 향상 명령어

$ history # 이전에 실행한 명령어 전체 목록

$ !! # 직전 명령어 재실행

$ sudo !! # 직전 명령어를 sudo로 재실행 (권한 부족 시 유용)

$ which python3 # 명령어의 실제 위치 확인

$ whoami # 현재 로그인한 사용자명

$ df -h # 디스크 사용량 확인 (human-readable)

$ free -h # 메모리 사용량 확인

$ uptime # 서버 가동 시간

$ man ls # ls의 매뉴얼 페이지 (모든 명령어에 사용 가능)

💡
sudo !!은 마법이다: 명령어를 실행했는데 "Permission denied"가 뜨면, sudo !!를 치면 된다. 직전 명령어를 sudo 권한으로 다시 실행한다. 긴 명령어를 다시 타이핑할 필요가 없다.

터미널 텍스트 에디터

서버에서 파일을 편집해야 할 때 사용하는 에디터들이다.

에디터난이도특징추천
nano쉬움하단에 단축키 안내 표시. 직관적입문자 추천
vim어려움모드 기반(입력/명령). 학습곡선 높지만 숙련 시 최강 효율중급 이상
emacs어려움확장성 최강. "운영체제 안의 운영체제"라 불림특수 목적
⚠️
Vim에서 나오는 법: 처음 Vim을 열면 나오는 법을 몰라 당황하는 경우가 많다. Esc를 누른 뒤 :q!를 입력하면 저장 없이 종료된다. :wq는 저장 후 종료. "How to exit Vim"은 Stack Overflow에서 수백만 조회수를 기록한 전설의 질문이다.

마치며: 클라우드로 가는 첫 번째 관문

이 글에서 다룬 내용을 정리하면:

50+년 Unix/Linux의 역사 1969 Unix → 1991 Linux → 현재
20+ 필수 터미널 명령어 ls, cd, grep, find, chmod 등
10 주요 디렉토리 /, /home, /etc, /var, /tmp 등
1 실전 배포 경험 Nginx 웹 서버 설치까지

돌아가서 민수의 이야기를 떠올려 보자. 채용 공고에 적혀 있던 "Linux 서버 관리 능력"은 결국 이런 것이다 — 터미널을 열고, 명령어를 입력하고, 서버를 제어하는 능력. 거창한 것이 아니라 ls, cd, grep, chmod 같은 기본 명령어의 조합이다.

물론 이 글에서 다룬 것은 시작에 불과하다. 이 다음에는 이런 주제들이 기다리고 있다:

  • 셸 스크립트: 반복 작업을 자동화하는 .sh 파일 작성법
  • SSH와 SCP: 원격 서버 접속과 파일 전송
  • Docker: 컨테이너로 애플리케이션 패키징
  • CI/CD: GitHub Actions와 터미널 명령어를 결합한 자동 배포
  • Vim 마스터: 터미널 에디터의 정석

터미널은 처음에는 불편하다. 마우스가 그립고, GUI가 그립다. 하지만 어느 순간 마우스보다 키보드가 빠르다는 것을 체감하게 된다. Ctrl + R로 과거 명령어를 순식간에 찾아 실행하고, 파이프로 여러 명령어를 연결해 복잡한 작업을 한 줄로 끝내는 순간 — 그때 터미널의 진가를 알게 된다.

클라우드의 언어는 터미널이다. 오늘 터미널을 열고 ls를 쳐 보자. DX 전문가로 가는 여정의 첫 번째 명령어다.


참고 자료

  • Linus Torvalds, "Linux: a free unix-386 kernel" (comp.os.minix, 1991)
  • Brian W. Kernighan & Rob Pike, The Unix Programming Environment (Prentice Hall, 1984)
  • W3Techs, "Usage statistics of Linux for websites" (2025)
  • Linux Foundation, The Linux Kernel Report (2025)
  • Filesystem Hierarchy Standard (FHS) 3.0 Specification
  • Ubuntu Server Guide — https://ubuntu.com/server/docs
  • GNU Project — https://www.gnu.org/gnu/gnu-history.html