시나리오
입사 첫 달, 선배가 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 설치 확인
vim --version | head -1
VIM - Vi IMproved 버전 정보가 출력되면 준비 완료
nano 설치 확인
nano --version
GNU nano 버전이 출력되면 준비 완료 (없으면 sudo apt install nano)
실습 파일 생성
echo 'Hello Linux' > ~/practice.txt
편집 실습에 사용할 파일입니다
vim을 처음 접하면 열자마자 나가는 방법을 몰라서 강제 종료하는 경험을 한 번씩 합니다. 설정 파일을 빨리 수정해야 하는 상황에서 편집기 조작법에 시간을 쓰는 건 비효율적입니다. nano는 학습 비용 없이 바로 쓸 수 있는 편집기입니다. 화면 하단에 단축키가 항상 표시되어 외울 필요가 없고, 일반 텍스트 편집기처럼 바로 입력할 수 있습니다.
bash# 파일 열기 (없으면 새 파일 생성)
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를 열고 텍스트를 추가한 뒤 저장하고 종료하는 전체 흐름을 연습합니다.
bash# 실습 파일 열기
nano ~/practice.txt
파일이 열리면:
- 커서가 있는 위치에서 바로 타이핑합니다
- 새 줄에
Server: ubuntu-lab 을 추가합니다
Ctrl+O → Enter 로 저장합니다
Ctrl+X 로 종료합니다
bash# 저장됐는지 확인
cat ~/practice.txt
outputHello Linux
Server: ubuntu-lab
bashnano ~/practice.txt
Step 2. vim으로 파일 수정 — 4단계 흐름
vim을 열고 → Insert 모드 진입 → 텍스트 입력 → Normal 모드 복귀 → 저장 종료 흐름을 직접 경험합니다.
bashvim ~/practice.txt
파일이 열리면 (Normal 모드 상태):
G 를 눌러 파일 맨 아래로 이동합니다
o 를 눌러 새 줄을 만들고 Insert 모드로 진입합니다
Edited by vim 을 입력합니다
ESC 를 눌러 Normal 모드로 복귀합니다
:wq 를 입력하고 Enter 를 눌러 저장 종료합니다
bash# 결과 확인
cat ~/practice.txt
outputHello Linux
Server: ubuntu-lab
Edited by vim
bashvim ~/practice.txt
Step 3. /etc/hosts 에 호스트 항목 추가
실무에서 가장 자주 편집하는 설정 파일 중 하나인 /etc/hosts에 항목을 추가합니다.
bash# 현재 내용 먼저 확인
cat /etc/hosts
output127.0.0.1 localhost
127.0.1.1 myserver
::1 localhost ip6-localhost
bash# nano로 열기 (sudo 필수 — root 소유 파일)
sudo nano /etc/hosts
파일 맨 아래에 다음 줄을 추가합니다:
192.168.1.10 db-server
Ctrl+O → Enter → Ctrl+X 로 저장 후 종료합니다.
bash# 추가됐는지 확인
grep db-server /etc/hosts
output192.168.1.10 db-server
bashsudo nano /etc/hosts
트러블슈팅
E45: 'readonly' option is set (add ! to override)
상황: vim /etc/nginx/nginx.conf 로 파일을 열고 수정한 뒤 :wq 로 저장하려는데 위 오류가 납니다. 분명히 수정이 됐는데 저장이 안 됩니다.
원인: sudo 없이 root 소유 파일을 열었기 때문입니다. vim은 파일을 열 수는 있지만 쓰기 권한이 없어 저장을 거부합니다.
진단:
bash# 파일 소유자 확인
ls -la /etc/nginx/nginx.conf
output-rw-r--r-- 1 root root 1490 Sep 15 10:23 /etc/nginx/nginx.conf
소유자가 root 이고 현재 사용자가 일반 사용자이면 쓰기 권한이 없습니다.
해결:
bash# 방법 1: 이미 수정한 내용 그대로 sudo로 저장 (닫지 않아도 됨)
# Normal 모드에서 실행:
:w !sudo tee %
# 비밀번호 입력 후 저장 완료 → :q! 로 종료
# 방법 2 (권장): 처음부터 sudo로 열기
# 현재 vim을 :q! 로 닫고 재실행
sudo vim /etc/nginx/nginx.conf
트러블슈팅
Vim: Warning: Output is not to a terminal / 화면이 깨지거나 입력이 안 됨
상황: vim을 열었는데 화면이 이상하거나, 키를 눌러도 반응이 없거나, ^M 같은 이상한 문자가 입력됩니다. 또는 vim 세션 안에서 완전히 멈춘 것 같습니다.
원인: 가장 흔한 원인 두 가지입니다. 첫째, Ctrl+S 를 눌러 터미널 출력이 일시 정지된 상태. 둘째, 현재 모드를 모르는 채로 키를 눌러 예상치 못한 동작이 실행된 상태.
진단:
bash# 터미널 입력이 아예 안 된다면 먼저 Ctrl+Q 시도
# (Ctrl+S = 터미널 출력 정지, Ctrl+Q = 재개)
# vim 화면에서 현재 모드 확인
# 하단에 -- INSERT -- 가 보이면 Insert 모드
# 아무 표시 없으면 Normal 모드
# : 로 시작하는 입력창이 보이면 Command 모드
해결:
bash# 1. ESC 를 2~3번 눌러 Normal 모드로 확실히 복귀
# 2. 수정 내용을 살리고 싶으면:
:wq
# 3. 수정 내용을 포기하고 나가고 싶으면:
:q!
# 4. 아무것도 안 된다면 터미널 자체를 새로 열고
# kill $(pgrep vim) 또는 killall vim
다음 모듈에서는 사용자와 그룹 관리 — useradd, usermod, sudo 권한 설정으로 서버 접근 제어를 다룹니다.