입사 첫 달, 선배가 Nginx 설정을 바꾸라고 했습니다. SSH로 서버에 접속해 vim /etc/nginx/nginx.conf를 쳤습니다. 파일이 열렸습니다. 그런데 커서는 움직이는데 글자를 치면 알 수 없는 동작이 실행됩니다. 15분 동안 파일을 망가뜨리다가 결국 터미널을 강제 종료했습니다. 나중에 알고 보니 vim의 Normal 모드였습니다.
"vim을 못 나가서"가 검색어 밈이 된 데는 이유가 있습니다. vim은 직관에 반하지만, 어떤 서버에도 설치되어 있는 유일한 편집기입니다. 열고 → 수정하고 → 저장하고 → 나오는 4단계만 익히면 더 이상 겁낼 필요 없습니다.
텍스트 편집 기초 — vim과 nano
- 1nano를 열고 파일을 수정하고 저장·종료할 수 있다
- 2vim의 모드 시스템(Normal / Insert / Command)을 이해하고 텍스트를 입력할 수 있다
- 3vim에서 저장(:wq), 강제 종료(:q!), 실행 취소(u)를 사용할 수 있다
- 4자주 쓰는 vim 단축키(검색, 줄 삭제, 복사/붙여넣기)를 활용할 수 있다
- 5root 소유 설정 파일을 sudo로 안전하게 편집할 수 있다
vim --version | head -1VIM - Vi IMproved 버전 정보가 출력되면 준비 완료
nano --versionGNU nano 버전이 출력되면 준비 완료 (없으면 sudo apt install nano)
echo 'Hello Linux' > ~/practice.txt편집 실습에 사용할 파일입니다
nano — 처음이라면 nano부터

vim을 처음 접하면 열자마자 나가는 방법을 몰라서 강제 종료하는 경험을 한 번씩 합니다. 설정 파일을 빨리 수정해야 하는 상황에서 편집기 조작법에 시간을 쓰는 건 비효율적입니다. nano는 학습 비용 없이 바로 쓸 수 있는 편집기입니다. 화면 하단에 단축키가 항상 표시되어 외울 필요가 없고, 일반 텍스트 편집기처럼 바로 입력할 수 있습니다.
# 파일 열기 (없으면 새 파일 생성)
nano ~/practice.txt
# root 권한 필요한 파일
sudo nano /etc/hosts
nano 필수 단축키 (^는 Ctrl):
| 단축키 | 기능 |
|---|---|
Ctrl+O | 저장 (Write Out) |
Ctrl+X | 종료 (저장 여부 확인) |
Ctrl+K | 현재 줄 잘라내기 |
Ctrl+U | 붙여넣기 |
Ctrl+W | 검색 |
Ctrl+\ | 검색 후 치환 |
저장 후 종료 흐름: Ctrl+O → Enter → Ctrl+X
vim 모드 시스템 — 이것만 이해하면 됩니다
vim이 갑자기 서버에서 유일한 편집기일 때가 있습니다. Alpine 기반 Docker 컨테이너, 최소 설치 이미지, 구형 서버 — 이런 환경엔 nano가 없습니다. vim을 못 쓰면 파일을 열고 나서 종료도 못 하는 상황이 됩니다. vim이 다른 편집기와 가장 다른 점은 '모드'입니다. 이 개념만 이해하면 vim이 왜 그렇게 동작하는지 납득이 가고, 처음 보는 키 입력에도 당황하지 않게 됩니다.

vim은 Normal 모드로 시작합니다. 텍스트 입력 전에 반드시 Insert 모드로 전환해야 합니다.
시작
│
▼
Normal 모드 ←──── ESC ───── Insert 모드
│ │
│ i / a / o 누름 │ 텍스트 입력
└────────────────────────────────►
│
│ : 누름
▼
Command 모드 (:wq, :q!, :/)
처음에는 이 4가지만 기억하면 충분합니다:
| 상황 | 누를 키 |
|---|---|
| 텍스트 입력하고 싶다 | i (insert) |
| 입력 그만하고 명령 쓰고 싶다 | ESC |
| 저장하고 나가고 싶다 | ESC → :wq → Enter |
| 저장 없이 나가고 싶다 | ESC → :q! → Enter |
vim 자주 쓰는 단축키 — Normal 모드

처음에는 이동(hjkl)과 삭제(dd), 취소(u)만 알면 설정 파일 수정 수준은 문제없습니다. 검색과 치환은 반복 작업이 생길 때 익혀도 늦지 않습니다.
기본 이동
h j k l ← ↓ ↑ →
0 / $ 줄 맨 앞 / 맨 끝
gg / G 파일 맨 위 / 맨 아래
:42 42번 줄로 이동
편집
dd 현재 줄 삭제 (잘라내기)
yy 현재 줄 복사
p 붙여넣기 (커서 아래)
u 실행 취소 (undo)
Ctrl+R 다시 실행 (redo)
검색 & 치환
/단어 아래 방향으로 검색 (n으로 다음)
:%s/old/new/g 파일 전체 치환
nano를 열고 텍스트를 추가한 뒤 저장하고 종료하는 전체 흐름을 연습합니다.
# 실습 파일 열기
nano ~/practice.txt
파일이 열리면:
- 커서가 있는 위치에서 바로 타이핑합니다
- 새 줄에
Server: ubuntu-lab을 추가합니다 Ctrl+O→ Enter 로 저장합니다Ctrl+X로 종료합니다
# 저장됐는지 확인
cat ~/practice.txt
Hello Linux
Server: ubuntu-lab
nano ~/practice.txt- nano 화면 하단에 ^G Help ^O Write ^X Exit 같은 단축키 메뉴가 항상 표시됩니다
- Ctrl+O 후 파일명 확인 프롬프트가 나타나고 Enter 를 누르면 저장됩니다
- 저장 후 cat 으로 내용을 확인하면 방금 추가한 줄이 보입니다
vim을 열고 → Insert 모드 진입 → 텍스트 입력 → Normal 모드 복귀 → 저장 종료 흐름을 직접 경험합니다.
vim ~/practice.txt
파일이 열리면 (Normal 모드 상태):
G를 눌러 파일 맨 아래로 이동합니다o를 눌러 새 줄을 만들고 Insert 모드로 진입합니다Edited by vim을 입력합니다ESC를 눌러 Normal 모드로 복귀합니다:wq를 입력하고 Enter 를 눌러 저장 종료합니다
# 결과 확인
cat ~/practice.txt
Hello Linux
Server: ubuntu-lab
Edited by vim
vim ~/practice.txt- vim 하단에 -- INSERT -- 가 표시되면 Insert 모드입니다. 이 상태에서 텍스트 입력이 가능합니다
- ESC 를 누르면 -- INSERT -- 표시가 사라지고 Normal 모드로 돌아갑니다
- :wq 입력 후 Enter 를 누르면 파일이 저장되고 터미널로 돌아옵니다
- 실수했을 때는 ESC 후 u 를 눌러 되돌립니다. 여러 번 눌러도 됩니다
실무에서 가장 자주 편집하는 설정 파일 중 하나인 /etc/hosts에 항목을 추가합니다.
# 현재 내용 먼저 확인
cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 myserver
::1 localhost ip6-localhost
# nano로 열기 (sudo 필수 — root 소유 파일)
sudo nano /etc/hosts
파일 맨 아래에 다음 줄을 추가합니다:
192.168.1.10 db-server
Ctrl+O → Enter → Ctrl+X 로 저장 후 종료합니다.
# 추가됐는지 확인
grep db-server /etc/hosts
192.168.1.10 db-server
sudo nano /etc/hosts- sudo 없이 /etc/hosts 를 열면 저장할 때 권한 오류가 납니다 — 처음부터 sudo로 여는 습관을 들이세요
- grep db-server /etc/hosts 로 추가된 줄만 확인할 수 있습니다
- 실습 후 원상복구: sudo nano /etc/hosts 로 다시 열어 추가한 줄을 삭제합니다
상황: vim /etc/nginx/nginx.conf 로 파일을 열고 수정한 뒤 :wq 로 저장하려는데 위 오류가 납니다. 분명히 수정이 됐는데 저장이 안 됩니다.
원인: sudo 없이 root 소유 파일을 열었기 때문입니다. vim은 파일을 열 수는 있지만 쓰기 권한이 없어 저장을 거부합니다.
진단:
# 파일 소유자 확인
ls -la /etc/nginx/nginx.conf
-rw-r--r-- 1 root root 1490 Sep 15 10:23 /etc/nginx/nginx.conf
소유자가 root 이고 현재 사용자가 일반 사용자이면 쓰기 권한이 없습니다.
해결:
# 방법 1: 이미 수정한 내용 그대로 sudo로 저장 (닫지 않아도 됨)
# Normal 모드에서 실행:
:w !sudo tee %
# 비밀번호 입력 후 저장 완료 → :q! 로 종료
# 방법 2 (권장): 처음부터 sudo로 열기
# 현재 vim을 :q! 로 닫고 재실행
sudo vim /etc/nginx/nginx.conf
상황: vim을 열었는데 화면이 이상하거나, 키를 눌러도 반응이 없거나, ^M 같은 이상한 문자가 입력됩니다. 또는 vim 세션 안에서 완전히 멈춘 것 같습니다.
원인: 가장 흔한 원인 두 가지입니다. 첫째, Ctrl+S 를 눌러 터미널 출력이 일시 정지된 상태. 둘째, 현재 모드를 모르는 채로 키를 눌러 예상치 못한 동작이 실행된 상태.
진단:
# 터미널 입력이 아예 안 된다면 먼저 Ctrl+Q 시도
# (Ctrl+S = 터미널 출력 정지, Ctrl+Q = 재개)
# vim 화면에서 현재 모드 확인
# 하단에 -- INSERT -- 가 보이면 Insert 모드
# 아무 표시 없으면 Normal 모드
# : 로 시작하는 입력창이 보이면 Command 모드
해결:
# 1. ESC 를 2~3번 눌러 Normal 모드로 확실히 복귀
# 2. 수정 내용을 살리고 싶으면:
:wq
# 3. 수정 내용을 포기하고 나가고 싶으면:
:q!
# 4. 아무것도 안 된다면 터미널 자체를 새로 열고
# kill $(pgrep vim) 또는 killall vim
다음 모듈에서는 사용자와 그룹 관리 — useradd, usermod, sudo 권한 설정으로 서버 접근 제어를 다룹니다.