1. Linux란?
Linux는 전 세계 서버와 클라우드 인프라를 지탱하는 가장 강력한 오픈소스 운영체제 커널입니다. AWS, GCP, Azure의 대부분 인스턴스, Docker 컨테이너, Android 모두 Linux 기반입니다.
| 배포판 | 패키지 매니저 | 주요 용도 |
|---|---|---|
| Ubuntu / Debian | apt | 서버, 개발환경, 클라우드 |
| RHEL / CentOS Stream | dnf / yum | 엔터프라이즈 서버 |
| Alpine | apk | Docker 컨테이너 (초경량) |
| Arch Linux | pacman | 개발자 데스크톱 |
2. 파일 시스템 구조
| 경로 | 설명 |
|---|---|
/ | 루트 — 모든 파일 시스템의 최상위 |
/etc | 시스템·서비스 설정 파일 |
/var/log | 로그 파일 |
/home | 사용자 홈 디렉토리 |
/usr/bin | 일반 사용자 실행 파일 |
/proc | 프로세스 정보 (가상 파일 시스템) |
/tmp | 임시 파일 (재부팅 시 삭제) |
3. 기본 명령어
# ── 탐색 ──────────────────────────────────────────
pwd # 현재 경로
ls -lah # 상세 목록 (숨김 파일 포함, 사람 읽기 좋은 크기)
cd /var/log # 디렉토리 이동
cd - # 이전 디렉토리로
cd ~ # 홈 디렉토리로
# ── 파일/디렉토리 ──────────────────────────────────
mkdir -p app/src # 중간 디렉토리 포함 생성
touch file.txt # 빈 파일 생성 / 타임스탬프 갱신
cp -r src/ dst/ # 재귀 복사
mv old.txt new.txt
rm -rf dir/ # 디렉토리 강제 삭제 (주의!)
ln -s /etc/nginx/nginx.conf ./nginx.conf # 심볼릭 링크
# ── 텍스트 보기 ────────────────────────────────────
cat file.txt
less file.txt # 페이지 단위로 보기 (q로 종료)
head -20 file # 앞 20줄
tail -50 file # 뒤 50줄
tail -f /var/log/syslog # 실시간 스트리밍
# ── 도움말 ────────────────────────────────────────
man ls # 매뉴얼 페이지
ls --help
tldr ls # 간단한 예제 중심 도움말 (tldr 설치 필요)bash
4. 파일 조작
# ── 텍스트 처리 ───────────────────────────────────
echo "Hello" > file.txt # 덮어쓰기
echo "World" >> file.txt # 추가
# sed: 스트림 편집기
sed 's/old/new/g' file.txt # old를 new로 전체 치환 (출력만)
sed -i 's/localhost/0.0.0.0/g' app.conf # 원본 파일 직접 수정
# awk: 열 기반 처리
awk '{print $1, $3}' log.txt # 1번째, 3번째 열 추출
awk -F':' '{print $1}' /etc/passwd # ':' 구분자로 첫 열(사용자명)
awk '{sum+=$NF} END{print sum}' nums.txt # 마지막 열 합계
# sort / uniq
sort -k2 -nr data.txt # 2번 열 기준 숫자 역순 정렬
cat access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -10
# → 접속 IP 순위
# tr: 문자 변환
echo "hello world" | tr 'a-z' 'A-Z' # 대문자 변환
echo "a:b:c" | tr ':' '\n' # 구분자를 줄바꿈으로
# wc: 단어/줄 수 세기
wc -l file.txt # 줄 수
wc -w file.txt # 단어 수bash
5. 검색과 필터
# ── grep ──────────────────────────────────────────
grep "ERROR" /var/log/app.log # 패턴 검색
grep -r "TODO" ./src/ --include="*.py" # 재귀 + 파일 필터
grep -n "Exception" app.log # 줄 번호 표시
grep -v "DEBUG" app.log # 패턴 제외
grep -E "^[0-9]{4}" file.txt # 확장 정규식
grep -c "WARN" app.log # 일치 줄 수 세기
# ── find ──────────────────────────────────────────
find /var/log -name "*.log" -mtime +7 # 7일 넘은 .log
find /app -name "*.py" -size +1M # 1MB 초과 .py
find /tmp -type f -delete # 파일만 삭제
find . -name "*.sh" -exec chmod +x {} \; # 권한 일괄 변경
# ── du / df ───────────────────────────────────────
df -h # 파일 시스템 사용량
du -sh /var/log/* | sort -hr # 디렉토리 크기 내림차순
# ── ripgrep (rg) — grep보다 10배 빠름 ─────────────
rg "TODO" ./src --type py # Python 파일에서 TODO 검색bash
6. 파일 권한
# ── 권한 구조: [유형][소유자][그룹][기타] ─────────
# -rwxr-xr--
# │ │ │ └── 기타(other): r-- = 읽기만
# │ │ └────── 그룹(group): r-x = 읽기+실행
# │ └────────── 소유자(user): rwx = 읽기+쓰기+실행
# └───────────── 파일 유형: -=파일 d=디렉토리 l=링크
# chmod: 권한 변경
chmod 755 script.sh # rwxr-xr-x (8진수)
chmod +x script.sh # 실행 권한 추가 (기호)
chmod -w file.txt # 쓰기 권한 제거
chmod o-r secret.txt # 기타 사용자 읽기 제거
chmod -R 755 /var/www/ # 재귀 적용
# chown: 소유자 변경
sudo chown user:group file.txt
sudo chown -R www-data:www-data /var/www/
# setuid / setgid / sticky bit
chmod u+s /usr/bin/passwd # setuid: 소유자 권한으로 실행
chmod +t /tmp # sticky: 자신의 파일만 삭제 가능
# 권한 확인
stat -c "%a %n" file.txt # 8진수 권한 표시
ls -l file.txtbash
7. 프로세스 관리
# ── 모니터링 ──────────────────────────────────────
top # 실시간 모니터링 (q 종료)
htop # 컬러 대화형 모니터링
ps aux # 전체 프로세스 스냅샷
ps aux | grep nginx # 특정 프로세스 찾기
pstree # 프로세스 트리
# ── 포트 & 소켓 ────────────────────────────────────
ss -tlnp # TCP 리스닝 포트 + PID
lsof -i :8080 # 8080 포트 사용 프로세스
lsof -p 1234 # PID 1234가 열고 있는 파일
# ── 시그널 ────────────────────────────────────────
kill 1234 # SIGTERM (정상 종료 요청)
kill -9 1234 # SIGKILL (강제 종료 — 최후 수단)
kill -HUP $(pidof nginx) # 설정 재로드 (Nginx)
killall nginx # 이름으로 종료
# ── 백그라운드 / 세션 ────────────────────────────
./long-task & # 백그라운드 실행
nohup ./server > out.log 2>&1 & # 터미널 종료 후에도 실행
jobs # 현재 셸의 백그라운드 작업
fg %1 # 1번 작업 포그라운드로
# tmux (세션 유지)
tmux new -s work # 새 세션 생성
tmux attach -t work # 세션 재접속
# Ctrl+b d → 세션 분리 (백그라운드 유지)
# ── systemd ────────────────────────────────────────
systemctl status nginx
systemctl start|stop|restart|reload nginx
systemctl enable nginx # 부팅 시 자동 시작
systemctl disable nginx
journalctl -u nginx -f --since "1 hour ago" # 로그 스트리밍bash
8. 패키지 관리
# ── Ubuntu / Debian (apt) ────────────────────────
sudo apt update # 패키지 목록 갱신
sudo apt upgrade -y # 전체 업그레이드
sudo apt install -y nginx # 설치
sudo apt remove nginx # 제거 (설정 파일 유지)
sudo apt purge nginx # 완전 제거 (설정까지)
sudo apt autoremove # 미사용 의존성 정리
apt search "keyword" # 패키지 검색
apt show nginx # 패키지 정보
# ── RHEL / Rocky / CentOS (dnf) ──────────────────
sudo dnf update -y
sudo dnf install -y httpd
sudo dnf remove httpd
sudo dnf search keyword
# ── Snap / Flatpak (앱 계층) ──────────────────────
sudo snap install code --classic # VS Codebash
9. 네트워크
# ── 연결 확인 ─────────────────────────────────────
ping -c 4 google.com
traceroute google.com
curl -v https://httpbin.org/get # HTTP 요청
curl -o /dev/null -s -w "%{http_code}\n" https://example.com
wget -q -O output.html https://example.com
# ── 네트워크 정보 ──────────────────────────────────
ip addr # IP 주소 목록 (ifconfig 대체)
ip route # 라우팅 테이블
ss -tlnp # TCP 포트 목록
nmap -sV 192.168.1.1 # 포트 스캔 (설치 필요)
# ── SSH ───────────────────────────────────────────
ssh user@192.168.1.10 # 원격 접속
ssh -i ~/.ssh/key.pem ubuntu@host # 키 파일 지정
scp file.txt user@host:/tmp/ # 파일 전송
rsync -avz ./src/ user@host:/app/ # 효율적 동기화
# ── 방화벽 (UFW — Ubuntu) ──────────────────────────
sudo ufw enable
sudo ufw allow 22/tcp
sudo ufw allow 80,443/tcp
sudo ufw deny 3306
sudo ufw status verbose
# ── tcpdump / 트래픽 분석 ──────────────────────────
sudo tcpdump -i eth0 port 80 -w capture.pcap
sudo tcpdump -r capture.pcap -n # 파일 분석bash
10. 셸 스크립트
#!/bin/bash
# 안전한 스크립트 설정
set -euo pipefail # 에러 즉시 종료, 미정의 변수 오류, 파이프 에러 전파
# ── 변수와 기본값 ──────────────────────────────────
NAME="${1:-world}" # 첫 번째 인자, 없으면 "world"
ENV="${ENV:-production}" # 환경변수, 없으면 기본값
readonly LOG_DIR="/var/log/myapp"
# ── 함수 ──────────────────────────────────────────
log() { echo "[$(date '+%F %T')] INFO $*"; }
error(){ echo "[$(date '+%F %T')] ERROR $*" >&2; }
check_root() {
[[ $EUID -eq 0 ]] || { error "root 권한 필요"; exit 1; }
}
# ── 조건문 ────────────────────────────────────────
if [[ -f "/etc/nginx/nginx.conf" ]]; then
log "Nginx 설정 존재"
elif [[ -d "/etc/apache2" ]]; then
log "Apache 설정 존재"
else
error "웹서버 설정 없음"
exit 1
fi
# ── 반복문 ────────────────────────────────────────
for file in /etc/*.conf; do
[[ -f "$file" ]] || continue
log "처리 중: $file"
done
servers=("web1" "web2" "web3")
for srv in "${servers[@]}"; do
ssh "$srv" 'sudo systemctl reload nginx' && log "$srv reload 성공"
done
# ── 배열 & 문자열 ──────────────────────────────────
files=(*.log)
log "로그 파일 수: ${#files[@]}"
url="https://api.example.com/v1/users"
domain="${url#*://}" # 프로토콜 제거
path="${domain#*/}" # 도메인 제거 → v1/users
# ── 배포 스크립트 실전 예시 ────────────────────────
deploy() {
local app_dir="/var/www/app"
local backup_dir="/var/backups/app"
log "배포 시작..."
cp -r "$app_dir" "$backup_dir/$(date +%Y%m%d_%H%M%S)"
git -C "$app_dir" pull origin main || { error "git pull 실패"; exit 1; }
pushd "$app_dir" > /dev/null
npm ci --production
npm run build
popd > /dev/null
systemctl reload nginx
log "배포 완료"
}
deploy "$@"bash
~/.bashrc 생산성 설정
추천 도구:
alias ll='ls -lah'alias gs='git status'alias dc='docker compose'alias k='kubectl'추천 도구:
fzf(퍼지 검색), bat(cat 대체), exa(ls 대체), ripgrep(grep 대체)