====== 권한 설정 & 고급 명령어 ======
**🎯 목표**: Linux 시스템을 더 깊이 이해하고 실무에서 필요한 고급 기능들을 마스터하기
**⏰ 예상 시간**: 2-3시간
**📋 준비물**:
- 기본 명령어에 익숙한 상태 ([[wiki:it:linux:basic_commands|기본 명령어 가이드]] 완료)
- 터미널 접근 권한
===== 🔐 1단계: 파일 권한 시스템 이해하기 =====
Linux에서 가장 중요한 개념 중 하나가 바로 **권한(Permission)**입니다.
마치 집의 열쇠처럼, 누가 어떤 파일을 읽고, 쓰고, 실행할 수 있는지를 결정해요.
==== 권한 읽는 방법 ====
ls -l
결과를 보면 이런 형태로 나타납니다:
-rw-r--r-- 1 user group 1234 Jan 15 10:30 파일.txt
drwxr-xr-x 2 user group 4096 Jan 15 10:30 폴더
**권한 부분 해석** (맨 앞 10글자):
- **첫 번째 글자**: 파일 타입
- ''-'' = 일반 파일
- ''d'' = 디렉토리(폴더)
- ''l'' = 심볼릭 링크
- **나머지 9글자**: 권한 (3글자씩 3그룹)
- **처음 3글자**: 소유자(Owner) 권한
- **다음 3글자**: 그룹(Group) 권한
- **마지막 3글자**: 기타(Others) 권한
**각 권한의 의미**:
- ''r'' (read): 읽기 권한
- ''w'' (write): 쓰기 권한
- ''x'' (execute): 실행 권한
- ''-'': 권한 없음
**🔍 권한 시스템 상세 설명**:
**1. 파일 타입별 권한 의미**:
- **일반 파일 (-)**:
- ''r'': 파일 내용 읽기 가능
- ''w'': 파일 내용 수정/삭제 가능
- ''x'': 파일을 프로그램으로 실행 가능
- **디렉토리 (d)**:
- ''r'': 디렉토리 내용 목록 보기 가능 (ls 명령어)
- ''w'': 디렉토리 내 파일 생성/삭제/이름변경 가능
- ''x'': 디렉토리로 이동 가능 (cd 명령어)
**2. 사용자 그룹별 권한**:
- **소유자 (Owner)**: 파일을 만든 사용자
- **그룹 (Group)**: 파일이 속한 그룹의 멤버들
- **기타 (Others)**: 소유자와 그룹에 속하지 않은 모든 사용자
**3. 권한 조합 예시**:
- ''rwx'': 읽기 + 쓰기 + 실행 (모든 권한)
- ''rw-'': 읽기 + 쓰기 (실행 불가)
- ''r-x'': 읽기 + 실행 (쓰기 불가)
- ''r--'': 읽기만 가능
- ''---'': 권한 없음
**🔍 예시 해석**:
-rw-r--r-- → 소유자는 읽기+쓰기, 그룹과 기타는 읽기만 가능
drwxr-xr-x → 소유자는 모든 권한, 그룹과 기타는 읽기+실행만 가능
==== chmod - 권한 변경하기 ====
**의미**: "Change Mode" (모드 변경)
**🔍 chmod 명령어 상세 설명**:
**1. 기본 문법**:
chmod [옵션] 권한 파일명
**2. 권한 표현 방식**:
- **숫자 방식**: 8진수로 권한 표현 (가장 많이 사용)
- **문자 방식**: r, w, x 문자로 권한 표현
**3. 숫자 계산법 상세**:
- **읽기(r) = 4**: 파일 내용을 볼 수 있음
- **쓰기(w) = 2**: 파일을 수정할 수 있음
- **실행(x) = 1**: 파일을 실행할 수 있음
- **권한 조합**: 각 권한을 더해서 표현
- ''7'' = 4+2+1 = rwx (모든 권한)
- ''6'' = 4+2+0 = rw- (읽기+쓰기)
- ''5'' = 4+0+1 = r-x (읽기+실행)
- ''4'' = 4+0+0 = r-- (읽기만)
- ''3'' = 0+2+1 = -wx (쓰기+실행)
- ''2'' = 0+2+0 = -w- (쓰기만)
- ''1'' = 0+0+1 = --x (실행만)
- ''0'' = 0+0+0 = --- (권한 없음)
**📊 숫자 방식** (가장 많이 사용):
# 숫자로 권한 설정
chmod 755 파일.txt # rwxr-xr-x
chmod 644 파일.txt # rw-r--r--
chmod 600 파일.txt # rw-------
**🎯 자주 사용하는 권한**:
chmod 755 스크립트.sh # 실행 파일 (소유자 모든 권한, 다른 사용자는 읽기+실행)
chmod 644 문서.txt # 일반 파일 (소유자 읽기+쓰기, 다른 사용자는 읽기만)
chmod 600 비밀.txt # 개인 파일 (소유자만 읽기+쓰기)
chmod 700 개인폴더/ # 개인 폴더 (소유자만 접근)
**📝 문자 방식**:
# 소유자에게 실행 권한 추가
chmod u+x 파일.txt
# 그룹에서 쓰기 권한 제거
chmod g-w 파일.txt
# 모든 사용자에게 읽기 권한 추가
chmod a+r 파일.txt
# 여러 권한 한 번에 설정
chmod u+rwx,g+rx,o+r 파일.txt
**4. 문자 방식 상세 설명**:
- **u**: user (소유자)
- **g**: group (그룹)
- **o**: others (기타 사용자)
- **a**: all (모든 사용자)
- **+**: 권한 추가
- **-**: 권한 제거
- **=**: 권한 설정 (기존 권한 무시하고 새로 설정)
**5. 재귀적 권한 변경**:
# 폴더와 하위 모든 파일에 권한 적용
chmod -R 755 폴더명/
# 특정 파일 타입만 권한 변경
find . -name "*.sh" -exec chmod +x {} \;
**💡 실습해보기**:
# 1. 테스트 파일 만들기
echo "echo 'Hello World!'" > test.sh
# 2. 현재 권한 확인
ls -l test.sh
# 3. 실행 권한 추가
chmod +x test.sh
# 4. 권한 변경 확인
ls -l test.sh
# 5. 스크립트 실행
./test.sh
==== chown - 소유자 변경하기 ====
**의미**: "Change Owner" (소유자 변경)
# 파일 소유자 변경 (root 권한 필요)
sudo chown 새소유자 파일.txt
# 파일 소유자와 그룹 동시 변경
sudo chown 새소유자:새그룹 파일.txt
# 폴더와 하위 모든 파일 소유자 변경
sudo chown -R 새소유자:새그룹 폴더/
**⚠️ 주의**: ''chown''은 보통 관리자 권한이 필요해서 ''sudo''를 함께 사용합니다.
===== 📊 2단계: 시스템 모니터링 =====
==== ps - 실행 중인 프로세스 보기 ====
**의미**: "Process Status" (프로세스 상태)
**🔍 ps 명령어 상세 설명**:
**1. 기본 문법**:
ps [옵션]
**2. 주요 옵션들**:
- **a**: 모든 사용자의 프로세스 표시
- **u**: 사용자 정보 포함 (CPU, 메모리 사용률 등)
- **x**: 터미널에 연결되지 않은 프로세스도 표시
- **f**: 프로세스 트리 형태로 표시
- **e**: 모든 프로세스 표시 (a와 유사)
- **l**: 긴 형태로 표시
**3. 자주 사용하는 조합**:
# 현재 터미널의 프로세스만 보기
ps
# 모든 프로세스 자세히 보기
ps aux
# 특정 프로세스 찾기
ps aux | grep 프로세스명
# 프로세스 트리 형태로 보기
ps auxf
# 특정 사용자의 프로세스만 보기
ps -u 사용자명
# 프로세스 ID로 특정 프로세스 보기
ps -p PID번호
**결과 해석**:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 225868 9876 ? Ss 10:30 0:01 /sbin/init
**4. 각 필드 상세 설명**:
- **USER**: 프로세스를 실행한 사용자
- **PID**: 프로세스 ID (고유 번호, 프로세스 종료 시 사용)
- **%CPU**: CPU 사용률 (전체 CPU 대비)
- **%MEM**: 메모리 사용률 (전체 메모리 대비)
- **VSZ**: 가상 메모리 크기 (KB)
- **RSS**: 실제 물리 메모리 사용량 (KB)
- **TTY**: 터미널 장치 (''?''는 터미널 없음)
- **STAT**: 프로세스 상태
- ''S'': Sleeping (대기 중)
- ''R'': Running (실행 중)
- ''Z'': Zombie (좀비 프로세스)
- ''D'': Uninterruptible sleep (중단 불가능한 대기)
- **START**: 프로세스 시작 시간
- **TIME**: CPU 사용 시간
- **COMMAND**: 실행 중인 명령어
**5. 프로세스 상태 코드 상세**:
- **첫 번째 문자**: 프로세스 상태
- ''S'': 대기 중 (interruptible sleep)
- ''R'': 실행 중 또는 실행 대기 중
- ''D'': 디스크 I/O 대기 (uninterruptible sleep)
- ''Z'': 좀비 프로세스 (종료되었지만 부모가 회수하지 않음)
- ''T'': 정지됨 (stopped)
- ''X'': 죽은 프로세스 (dead)
- **두 번째 문자**: 추가 정보
- ''<'': 높은 우선순위
- ''N'': 낮은 우선순위
- ''L'': 메모리 페이지가 잠겨있음
- ''s'': 세션 리더
- ''l'': 멀티스레드
- ''+'': 포그라운드 프로세스 그룹
==== top - 실시간 시스템 상태 보기 ====
**의미**: 시스템 리소스 사용량을 실시간으로 보여줘요
**🔍 top 명령어 상세 설명**:
**1. 기본 문법**:
top [옵션]
**2. 주요 옵션들**:
- **-d 초**: 업데이트 간격 설정 (기본 3초)
- **-n 횟수**: 지정된 횟수만 실행 후 종료
- **-p PID**: 특정 프로세스만 모니터링
- **-u 사용자**: 특정 사용자의 프로세스만 모니터링
- **-b**: 배치 모드 (파이프라인에서 사용)
**3. 기본 사용법**:
# 실시간 시스템 모니터링
top
# 더 예쁜 버전 (설치 필요)
htop
# 1초마다 업데이트
top -d 1
# 특정 프로세스만 모니터링
top -p 1234
# 10번만 실행 후 종료
top -n 10
**4. 화면 구성**:
- **상단**: 시스템 전체 정보 (부하, 프로세스 수, CPU/메모리 사용률)
- **중간**: 프로세스 목록 (CPU 사용률 순 정렬)
- **하단**: 키보드 단축키 도움말
**5. 조작법 상세**:
- **q**: 종료
- **k**: 프로세스 종료 (PID 입력 후 시그널 선택)
- **r**: 프로세스 우선순위 변경 (renice)
- **M**: 메모리 사용량 순 정렬
- **P**: CPU 사용량 순 정렬
- **T**: 실행 시간 순 정렬
- **1**: CPU 코어별 사용량 보기
- **c**: 명령어 전체 경로 표시/숨김
- **m**: 메모리 정보 표시/숨김
- **t**: 프로세스/CPU 정보 표시/숨김
- **i**: 유휴 프로세스 표시/숨김
- **z**: 색상 표시/숨김
- **W**: 현재 설정을 ~/.toprc에 저장
- **h**: 도움말
**6. 상단 정보 해석**:
top - 14:30:15 up 2:45, 2 users, load average: 0.52, 0.58, 0.59
Tasks: 123 total, 1 running, 122 sleeping, 0 stopped, 0 zombie
%Cpu(s): 5.2 us, 2.1 sy, 0.0 ni, 92.7 id, 0.0 wa, 0.0 hi, 0.0 si
MiB Mem : 8192.0 total, 2048.0 free, 3072.0 used, 3072.0 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 4096.0 avail Mem
- **load average**: 시스템 부하 (1분, 5분, 15분 평균)
- **Tasks**: 프로세스 상태별 개수
- **%Cpu(s)**: CPU 사용률 세부 정보
- ''us'': 사용자 프로세스
- ''sy'': 시스템 프로세스
- ''ni'': nice 값이 변경된 프로세스
- ''id'': 유휴 상태
- ''wa'': I/O 대기
- ''hi'': 하드웨어 인터럽트
- ''si'': 소프트웨어 인터럽트
- **Mem**: 메모리 사용량
- **Swap**: 스왑 메모리 사용량
==== df - 디스크 사용량 확인 ====
**의미**: "Disk Free" (디스크 여유 공간)
**🔍 df 명령어 상세 설명**:
**1. 기본 문법**:
df [옵션] [파일시스템]
**2. 주요 옵션들**:
- **-h**: 사람이 읽기 쉬운 형태로 표시 (KB, MB, GB)
- **-i**: inode 정보 표시 (파일 개수 제한 확인)
- **-T**: 파일시스템 타입 표시
- **-a**: 모든 파일시스템 표시 (가상 파일시스템 포함)
- **-x**: 특정 파일시스템 타입 제외
**3. 기본 사용법**:
# 디스크 사용량 보기
df
# 사람이 읽기 쉬운 형태로 보기
df -h
# 특정 폴더의 디스크 사용량
df -h /home
# inode 사용량 확인
df -i
# 파일시스템 타입과 함께 표시
df -hT
**4. 결과 해석**:
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 20G 8.5G 11G 45% /
/dev/sda2 100G 45G 50G 48% /home
- **Filesystem**: 디바이스 이름 또는 마운트 포인트
- **Size**: 전체 크기
- **Used**: 사용된 공간
- **Avail**: 사용 가능한 공간
- **Use%**: 사용률
- **Mounted on**: 마운트 포인트
**5. 실무 활용**:
- **디스크 공간 부족 확인**: Use%가 90% 이상이면 주의
- **파일시스템별 사용량 파악**: 각 파티션별 사용량 확인
- **inode 부족 확인**: 파일은 적지만 inode가 부족한 경우
==== du - 폴더별 사용량 확인 ====
**의미**: "Disk Usage" (디스크 사용량)
**🔍 du 명령어 상세 설명**:
**1. 기본 문법**:
du [옵션] [경로]
**2. 주요 옵션들**:
- **-h**: 사람이 읽기 쉬운 형태로 표시
- **-s**: 요약 정보만 표시 (summary)
- **-a**: 모든 파일 표시 (all)
- **--max-depth=N**: 지정된 깊이까지만 표시
- **-c**: 총합 표시 (total)
- **-S**: 하위 디렉토리 크기 제외 (separate)
**3. 기본 사용법**:
# 현재 폴더의 사용량
du -h
# 현재 폴더 총 사용량만 보기
du -sh
# 하위 폴더별 사용량 보기
du -h --max-depth=1
# 큰 폴더 찾기 (상위 10개)
du -h | sort -hr | head -10
# 특정 폴더의 사용량
du -sh /home/user
# 모든 파일과 폴더 표시
du -ah | head -20
**4. 결과 해석**:
4.0K ./폴더1
8.0K ./폴더2
12K .
- **첫 번째 열**: 사용량 (기본 단위 KB)
- **두 번째 열**: 경로
- **마지막 행**: 총합 (현재 디렉토리 기준)
**5. 실무 활용 팁**:
- **큰 파일/폴더 찾기**: `du -h | sort -hr | head -10`
- **특정 크기 이상 찾기**: `find . -size +100M -exec du -h {} +`
- **오래된 파일 정리**: ''find . -mtime +30 -exec du -h {} +''
- **백업 전 용량 확인**: ''du -sh /backup/source/''
**💡 실습해보기**:
# 1. 시스템 상태 한 번에 확인
echo "=== 디스크 사용량 ==="
df -h
echo "=== 메모리 사용량 ==="
free -h
echo "=== 현재 폴더 사용량 ==="
du -sh .
echo "=== 실행 중인 프로세스 개수 ==="
ps aux | wc -l
===== 🌐 3단계: 네트워크 도구 =====
==== wget - 파일 다운로드 ====
**의미**: "Web Get" (웹에서 가져오기)
**🔍 wget 명령어 상세 설명**:
**1. 기본 문법**:
wget [옵션] URL
**2. 주요 옵션들**:
- **-O 파일명**: 다른 이름으로 저장
- **-c**: 이어받기 (중단된 다운로드 재개)
- **-b**: 백그라운드에서 다운로드
- **-q**: 조용한 모드 (진행률 표시 안함)
- **-r**: 재귀적 다운로드 (링크 따라가기)
- **-np**: 상위 디렉토리로 이동하지 않음
- **-w 초**: 다운로드 간 대기 시간
- **-U 문자열**: User-Agent 설정
**3. 기본 사용법**:
# 파일 다운로드
wget https://example.com/file.txt
# 다른 이름으로 저장
wget -O 새이름.txt https://example.com/file.txt
# 이어받기 (중단된 다운로드 재개)
wget -c https://example.com/bigfile.zip
# 백그라운드에서 다운로드
wget -b https://example.com/file.txt
# 조용한 다운로드
wget -q https://example.com/file.txt
# 전체 웹사이트 다운로드 (주의!)
wget -r -np https://example.com/
**4. 실무 활용**:
- **대용량 파일 다운로드**: ''-c'' 옵션으로 중단 시 재개 가능
- **백그라운드 다운로드**: ''-b'' 옵션으로 터미널 차단 방지
- **웹사이트 백업**: ''-r'' 옵션으로 전체 사이트 다운로드
- **정기 다운로드**: 스크립트에서 자동화
==== curl - HTTP 요청 보내기 ====
**의미**: "Client URL" (클라이언트 URL)
**🔍 curl 명령어 상세 설명**:
**1. 기본 문법**:
curl [옵션] URL
**2. 주요 옵션들**:
- **-O**: 원본 파일명으로 저장
- **-o 파일명**: 지정한 파일명으로 저장
- **-X 메서드**: HTTP 메서드 지정 (GET, POST, PUT 등)
- **-d 데이터**: POST 데이터 전송
- **-H 헤더**: HTTP 헤더 추가
- **-I**: 헤더 정보만 가져오기
- **-s**: 조용한 모드 (진행률 표시 안함)
- **-k**: SSL 인증서 검증 무시
- **-L**: 리다이렉트 따라가기
**3. 기본 사용법**:
# 웹페이지 내용 보기
curl https://example.com
# 파일 다운로드
curl -O https://example.com/file.txt
# POST 요청 보내기
curl -X POST -d "data=value" https://api.example.com
# 헤더 정보 포함해서 보기
curl -I https://example.com
# JSON 데이터 전송
curl -X POST -H "Content-Type: application/json" \
-d '{"name":"test","value":123}' \
https://api.example.com/data
# 쿠키와 함께 요청
curl -b "session=abc123" https://example.com
**4. HTTP 메서드별 사용법**:
- **GET**: 기본 메서드, 데이터 조회
- **POST**: 데이터 전송, 새 리소스 생성
- **PUT**: 리소스 전체 교체
- **PATCH**: 리소스 부분 수정
- **DELETE**: 리소스 삭제
**5. 실무 활용**:
- **API 테스트**: REST API 엔드포인트 테스트
- **웹 스크래핑**: 간단한 웹 데이터 수집
- **파일 다운로드**: 프로그래밍 방식 다운로드
- **서버 상태 확인**: 헬스체크, 모니터링
==== ping - 네트워크 연결 확인 ====
**의미**: 네트워크 연결 상태와 응답 시간을 확인하는 도구
**🔍 ping 명령어 상세 설명**:
**1. 기본 문법**:
ping [옵션] 호스트명/IP주소
**2. 주요 옵션들**:
- **-c 횟수**: 지정된 횟수만 ping 보내기
- **-i 간격**: ping 간격 설정 (초 단위)
- **-s 크기**: 패킷 크기 설정 (바이트)
- **-t TTL**: TTL 값 설정
- **-W 초**: 응답 대기 시간 설정
**3. 기본 사용법**:
# 구글 서버 연결 확인
ping google.com
# 4번만 ping 보내기
ping -c 4 google.com
# 빠른 ping (간격 줄이기)
ping -i 0.5 google.com
# 큰 패킷으로 ping
ping -s 1024 google.com
# 응답 시간 제한
ping -W 5 google.com
**4. 결과 해석**:
PING google.com (142.250.191.78) 56(84) bytes of data.
64 bytes from 142.250.191.78: icmp_seq=1 time=15.2 ms
64 bytes from 142.250.191.78: icmp_seq=2 time=14.8 ms
64 bytes from 142.250.191.78: icmp_seq=3 time=15.1 ms
64 bytes from 142.250.191.78: icmp_seq=4 time=14.9 ms
--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 14.800/15.000/15.200/0.158 ms
- **icmp_seq**: 패킷 순서 번호
- **time**: 응답 시간 (밀리초)
- **packet loss**: 패킷 손실률
- **rtt**: Round Trip Time (왕복 시간)
- **min**: 최소 응답 시간
- **avg**: 평균 응답 시간
- **max**: 최대 응답 시간
- **mdev**: 평균 편차
**5. 실무 활용**:
- **네트워크 연결 확인**: 기본적인 연결 상태 점검
- **응답 시간 측정**: 서버 성능 및 네트워크 품질 확인
- **패킷 손실 확인**: 네트워크 안정성 검증
- **DNS 해석 확인**: 도메인 이름이 IP로 변환되는지 확인
**💡 실습해보기**:
# 1. 네트워크 상태 확인
ping -c 3 google.com
# 2. 간단한 웹페이지 가져오기
curl -s https://httpbin.org/ip
# 3. 파일 다운로드 (작은 파일)
wget -q https://httpbin.org/robots.txt && cat robots.txt
===== 📦 4단계: 압축 파일 다루기 =====
==== tar - 압축 파일 만들고 풀기 ====
**의미**: "Tape Archive" (테이프 아카이브)
**🔍 tar 명령어 상세 설명**:
**1. 기본 문법**:
tar [옵션] [파일명] [대상]
**2. 주요 옵션들**:
- **c**: create (압축 파일 생성)
- **x**: extract (압축 파일 해제)
- **t**: list (압축 파일 내용 보기)
- **f**: file (파일명 지정)
- **v**: verbose (자세한 출력)
- **z**: gzip 압축/해제
- **j**: bzip2 압축/해제
- **J**: xz 압축/해제
- **C**: 디렉토리 변경 후 작업
- **r**: 기존 압축 파일에 추가
- **u**: 업데이트 (새로운 파일만 추가)
**3. 압축 방식별 사용법**:
# gzip 압축 (가장 일반적)
tar -czf 압축파일.tar.gz 폴더명/
# bzip2 압축 (더 높은 압축률)
tar -cjf 압축파일.tar.bz2 폴더명/
# xz 압축 (최고 압축률, 느림)
tar -cJf 압축파일.tar.xz 폴더명/
# 압축 없이 tar만 생성
tar -cf 압축파일.tar 폴더명/
**4. 압축 해제**:
# tar.gz 파일 압축 풀기
tar -xzf 압축파일.tar.gz
# tar.bz2 파일 압축 풀기
tar -xjf 압축파일.tar.bz2
# tar.xz 파일 압축 풀기
tar -xJf 압축파일.tar.xz
# 특정 디렉토리에 압축 풀기
tar -xzf 압축파일.tar.gz -C /target/directory/
# 압축 풀 때 내용 확인하며 풀기
tar -xzf 압축파일.tar.gz -v
**5. 압축 파일 내용 확인**:
# 압축 파일 내용만 보기 (풀지 않고)
tar -tzf 압축파일.tar.gz
# 특정 파일만 압축 해제
tar -xzf 압축파일.tar.gz 파일명
# 압축 파일에 파일 추가
tar -rf 압축파일.tar 새파일.txt
**6. 실무 활용 팁**:
- **백업**: 중요한 데이터를 압축하여 저장
- **전송**: 네트워크 전송 시 용량 절약
- **아카이브**: 오래된 파일들을 압축하여 보관
- **배포**: 소프트웨어 배포 시 압축 파일 사용
==== zip/unzip - ZIP 파일 다루기 ====
**의미**: Windows와 호환되는 압축 형식
**🔍 zip/unzip 명령어 상세 설명**:
**1. zip 기본 문법**:
zip [옵션] 압축파일.zip [파일/폴더]
**2. zip 주요 옵션들**:
- **-r**: 재귀적 압축 (하위 폴더 포함)
- **-q**: 조용한 모드
- **-9**: 최대 압축률
- **-0**: 압축 없이 저장
- **-e**: 암호 설정
- **-u**: 업데이트 (변경된 파일만)
- **-d**: 압축 파일에서 파일 삭제
**3. zip 사용법**:
# ZIP 파일 만들기
zip -r 압축파일.zip 폴더명/
# 암호 설정
zip -e -r 보안압축.zip 폴더명/
# 최대 압축률
zip -9 -r 최대압축.zip 폴더명/
# 특정 파일만 압축
zip 압축파일.zip file1.txt file2.txt
# 압축 파일에 파일 추가
zip 압축파일.zip 새파일.txt
**4. unzip 기본 문법**:
unzip [옵션] 압축파일.zip
**5. unzip 주요 옵션들**:
- **-d 디렉토리**: 특정 디렉토리에 압축 해제
- **-l**: 내용만 보기 (압축 해제 안함)
- **-q**: 조용한 모드
- **-o**: 덮어쓰기 (기존 파일 덮어씀)
- **-n**: 덮어쓰기 안함 (기존 파일 보존)
**6. unzip 사용법**:
# ZIP 파일 풀기
unzip 압축파일.zip
# 특정 폴더에 풀기
unzip 압축파일.zip -d 대상폴더/
# ZIP 파일 내용 보기
unzip -l 압축파일.zip
# 덮어쓰기하며 압축 해제
unzip -o 압축파일.zip
# 암호가 있는 파일 압축 해제
unzip -P 비밀번호 압축파일.zip
**💡 실습해보기**:
# 1. 테스트 폴더 구조 만들기
mkdir -p 테스트/문서 테스트/이미지
echo "중요한 문서" > 테스트/문서/계획서.txt
echo "이미지 파일" > 테스트/이미지/사진.jpg
# 2. tar.gz로 압축
tar -czf 테스트백업.tar.gz 테스트/
# 3. 원본 삭제
rm -rf 테스트/
# 4. 압축 파일에서 복원
tar -xzf 테스트백업.tar.gz
# 5. 복원 확인
find 테스트/ -type f
===== 🔧 5단계: 고급 텍스트 처리 =====
==== awk - 텍스트 데이터 처리 ====
**의미**: 강력한 텍스트 처리 도구
**🔍 awk 명령어 상세 설명**:
**1. 기본 문법**:
awk [옵션] '패턴 {액션}' 파일명
**2. 주요 옵션들**:
- **-F 구분자**: 필드 구분자 설정 (기본: 공백)
- **-v 변수=값**: 변수 설정
- **-f 스크립트파일**: awk 스크립트 파일 실행
**3. 기본 개념**:
- **$0**: 전체 행
- **$1, $2, ...**: 1번째, 2번째 필드
- **NF**: 필드 개수
- **NR**: 행 번호
- **FS**: 필드 구분자
- **OFS**: 출력 필드 구분자
**4. 기본 사용법**:
# 특정 열만 출력 (공백으로 구분)
ps aux | awk '{print $1, $2, $11}' # 사용자, PID, 명령어만
# 조건에 맞는 행만 출력
ps aux | awk '$3 > 5.0 {print $0}' # CPU 사용률 5% 이상
# 계산하기
ls -l | awk '{sum += $5} END {print "총 크기:", sum}'
# CSV 파일 처리 (쉼표 구분)
awk -F',' '{print $1, $3}' data.csv
# 특정 패턴이 있는 행만 출력
awk '/error/ {print}' log.txt
# 행 번호와 함께 출력
awk '{print NR, $0}' file.txt
**5. 고급 사용법**:
# BEGIN, END 블록 사용
awk 'BEGIN {sum=0} {sum+=$1} END {print "총합:", sum}' numbers.txt
# 조건문 사용
awk '{if ($1 > 100) print "큰값:", $1; else print "작은값:", $1}' data.txt
# 배열 사용
awk '{count[$1]++} END {for (i in count) print i, count[i]}' log.txt
# 함수 사용
awk '{print length($0), $0}' file.txt # 각 행의 길이와 내용
**6. 실무 활용**:
- **로그 분석**: 특정 패턴이나 에러 찾기
- **데이터 변환**: CSV, TSV 파일 처리
- **통계 계산**: 합계, 평균, 개수 계산
- **텍스트 정제**: 불필요한 데이터 제거
==== sed - 텍스트 편집 ====
**의미**: "Stream Editor" (스트림 편집기)
**🔍 sed 명령어 상세 설명**:
**1. 기본 문법**:
sed [옵션] '명령어' 파일명
**2. 주요 옵션들**:
- **-i**: 파일 직접 수정
- **-n**: 자동 출력 억제
- **-e**: 여러 명령어 실행
- **-f**: 스크립트 파일 실행
**3. 기본 명령어들**:
- **s/패턴/치환/g**: 문자열 치환
- **d**: 행 삭제
- **p**: 행 출력
- **a\**: 행 뒤에 추가
- **i\**: 행 앞에 추가
- **c\**: 행 교체
**4. 기본 사용법**:
# 특정 문자열 바꾸기
sed 's/찾을문자/바꿀문자/g' 파일.txt
# 특정 줄 삭제
sed '3d' 파일.txt # 3번째 줄 삭제
# 특정 줄만 출력
sed -n '1,5p' 파일.txt # 1~5번째 줄만 출력
# 파일 직접 수정
sed -i 's/old/new/g' 파일.txt
# 여러 명령어 실행
sed -e 's/old/new/g' -e 's/bad/good/g' 파일.txt
# 특정 패턴이 있는 행만 출력
sed -n '/pattern/p' 파일.txt
**5. 고급 사용법**:
# 조건부 치환 (특정 줄에서만)
sed '1,10s/old/new/g' 파일.txt # 1~10번째 줄에서만
# 정규표현식 사용
sed 's/[0-9]*/숫자/g' 파일.txt # 모든 숫자를 '숫자'로 변경
# 행 추가
sed '3a\새로운 줄' 파일.txt # 3번째 줄 뒤에 추가
sed '3i\새로운 줄' 파일.txt # 3번째 줄 앞에 추가
# 행 교체
sed '3c\교체된 줄' 파일.txt # 3번째 줄을 교체
# 여러 파일 처리
sed -i 's/old/new/g' *.txt
**6. 실무 활용**:
- **로그 파일 정리**: 불필요한 정보 제거
- **설정 파일 수정**: 자동화된 설정 변경
- **데이터 정제**: 형식 통일, 오타 수정
- **배치 처리**: 여러 파일 동시 처리
==== sort - 정렬하기 ====
**의미**: 텍스트 데이터를 정렬하는 도구
**🔍 sort 명령어 상세 설명**:
**1. 기본 문법**:
sort [옵션] 파일명
**2. 주요 옵션들**:
- **-n**: 숫자로 정렬
- **-r**: 역순 정렬
- **-u**: 중복 제거
- **-k N**: N번째 필드로 정렬
- **-t 구분자**: 필드 구분자 설정
- **-f**: 대소문자 구분 없음
- **-M**: 월 이름으로 정렬
- **-h**: 사람이 읽기 쉬운 크기로 정렬
**3. 기본 사용법**:
# 파일 내용 정렬
sort 파일.txt
# 숫자로 정렬
sort -n 숫자파일.txt
# 역순 정렬
sort -r 파일.txt
# 중복 제거하며 정렬
sort -u 파일.txt
# 특정 열로 정렬
sort -k 2 파일.txt # 2번째 열로 정렬
# 여러 열로 정렬
sort -k 1,1 -k 2,2n 파일.txt # 1열로 정렬 후 2열로 숫자 정렬
**4. 고급 사용법**:
# 쉼표로 구분된 파일 정렬
sort -t',' -k2,2n data.csv
# 파일 크기로 정렬 (ls -lh 결과)
ls -lh | sort -k5,5hr
# 날짜로 정렬
sort -M 날짜파일.txt
# 사람이 읽기 쉬운 크기로 정렬
du -h | sort -h
# 특정 패턴 제외하고 정렬
sort 파일.txt | grep -v "제외할패턴"
**5. 실무 활용**:
- **로그 분석**: 시간순, 우선순위별 정렬
- **데이터 분석**: 통계 데이터 정렬
- **파일 관리**: 크기, 날짜별 정렬
- **중복 제거**: 유니크한 데이터 추출
**💡 실습해보기**:
# 1. 테스트 데이터 만들기
echo -e "사과 100\n바나나 200\n오렌지 50\n포도 150" > 과일.txt
# 2. 다양한 방식으로 정렬
echo "=== 이름순 정렬 ==="
sort 과일.txt
echo "=== 가격순 정렬 ==="
sort -k 2 -n 과일.txt
echo "=== 가격 높은 순 ==="
sort -k 2 -nr 과일.txt
# 3. 텍스트 처리
echo "=== 과일 이름만 출력 ==="
awk '{print $1}' 과일.txt
echo "=== 총 가격 계산 ==="
awk '{sum += $2} END {print "총합:", sum}' 과일.txt
===== ⚡ 6단계: 프로세스 관리 =====
==== kill - 프로세스 종료 ====
**의미**: 실행 중인 프로세스를 종료하는 명령어
**🔍 kill 명령어 상세 설명**:
**1. 기본 문법**:
kill [옵션] PID
**2. 주요 옵션들**:
- **-l**: 사용 가능한 시그널 목록 표시
- **-s 시그널**: 특정 시그널 지정
- **-n 시그널번호**: 시그널 번호로 지정
**3. 시그널 종류**:
- **TERM (15)**: 정상 종료 (기본값)
- **KILL (9)**: 강제 종료
- **HUP (1)**: 재시작 (SIGHUP)
- **INT (2)**: 인터럽트 (Ctrl+C)
- **STOP (19)**: 일시 정지
- **CONT (18)**: 재개
**4. 기본 사용법**:
# 프로세스 ID로 종료
kill 1234
# 강제 종료
kill -9 1234
# 시그널 이름으로 종료
kill -TERM 1234
# 시그널 번호로 종료
kill -15 1234
# 프로세스 이름으로 종료
killall 프로세스명
# 특정 프로세스 찾아서 종료
pkill -f "프로세스명"
# 특정 사용자의 프로세스 종료
pkill -u 사용자명
**5. 프로세스 찾기**:
# 프로세스 ID 찾기
pgrep 프로세스명
# 프로세스 정보 확인
ps -p PID번호
# 특정 포트 사용 프로세스 찾기
lsof -i :포트번호
# 프로세스 트리 보기
pstree PID번호
**6. 실무 활용**:
- **응답 없는 프로그램 종료**: kill -9 사용
- **서비스 재시작**: kill -HUP으로 설정 파일 재로드
- **배치 작업 관리**: 여러 프로세스 동시 종료
- **시스템 정리**: 좀비 프로세스 제거
==== nohup - 백그라운드 실행 ====
**의미**: "No Hang Up" (터미널 종료되어도 계속 실행)
**🔍 nohup 명령어 상세 설명**:
**1. 기본 문법**:
nohup 명령어 [옵션] &
**2. 주요 특징**:
- **터미널 독립**: 터미널을 닫아도 프로세스 계속 실행
- **시그널 무시**: SIGHUP 시그널 무시
- **출력 리다이렉션**: 기본적으로 nohup.out 파일로 출력
**3. 기본 사용법**:
# 백그라운드에서 실행
nohup 명령어 &
# 출력을 파일로 저장
nohup python script.py > output.log 2>&1 &
# 출력을 /dev/null로 버리기
nohup 명령어 > /dev/null 2>&1 &
# 특정 파일로 출력 저장
nohup 명령어 > myoutput.log 2>&1 &
**4. 백그라운드 작업 관리**:
# 실행 중인 백그라운드 작업 확인
jobs
# 백그라운드 작업을 포그라운드로 가져오기
fg %1
# 백그라운드 작업 일시 정지
bg %1
# 백그라운드 작업 종료
kill %1
# 모든 백그라운드 작업 확인
ps aux | grep -v grep | grep "nohup"
**5. 고급 사용법**:
# 여러 명령어를 백그라운드에서 실행
nohup bash -c "command1 && command2 && command3" &
# 특정 시간에 실행
nohup at 명령어 &
# 로그 로테이션과 함께 실행
nohup 명령어 | tee -a logfile.log &
# 환경 변수 설정과 함께 실행
nohup env VAR=value 명령어 &
**6. 실무 활용**:
- **장시간 실행 작업**: 데이터 처리, 백업 등
- **서버 관리**: 원격 서버에서 작업 실행
- **배치 작업**: 정기적으로 실행되는 작업
- **로그 수집**: 지속적인 모니터링 작업
===== 🎯 실전 시나리오 =====
==== 시나리오 1: 서버 로그 분석 ====
# 1. 가상 로그 파일 만들기
cat > access.log << EOF
192.168.1.1 - - [15/Jan/2024:10:30:00] "GET /index.html HTTP/1.1" 200 1234
192.168.1.2 - - [15/Jan/2024:10:30:01] "GET /about.html HTTP/1.1" 404 567
192.168.1.3 - - [15/Jan/2024:10:30:02] "POST /login HTTP/1.1" 500 890
192.168.1.1 - - [15/Jan/2024:10:30:03] "GET /admin.html HTTP/1.1" 403 234
192.168.1.4 - - [15/Jan/2024:10:30:04] "GET /index.html HTTP/1.1" 200 1234
EOF
# 2. 로그 분석하기
echo "=== 전체 요청 수 ==="
wc -l access.log
echo "=== 에러 로그 수 ==="
grep -c -i error access.log
echo "=== 경고 로그 수 ==="
grep -c -i warning access.log
echo "=== 최근 10개 에러:"
grep -i error access.log | tail -10
echo "=== 가장 많이 요청된 페이지 ==="
awk '{print $7}' access.log | sort | uniq -c | sort -nr
echo "=== IP별 요청 수 ==="
awk '{print $1}' access.log | sort | uniq -c | sort -nr
echo "=== 에러율 계산 ==="
total=$(wc -l < access.log)
errors=$(grep -c -i error access.log)
echo "총 요청: $total, 에러: $errors, 에러율: $(echo "scale=2; $errors*100/$total" | bc)%"
==== 시나리오 2: 디스크 공간 부족 해결 ====
**상황**: 디스크 공간이 부족해서 큰 파일들을 찾아 정리해야 해요.
# 1. 디스크 사용량 확인
df -h
# 2. 큰 폴더 찾기
echo "=== 큰 폴더 Top 10 ==="
du -h / 2>/dev/null | sort -hr | head -10
# 3. 큰 파일 찾기 (100MB 이상)
echo "=== 큰 파일 찾기 ==="
find / -size +100M -type f 2>/dev/null | head -10
# 4. 오래된 로그 파일 찾기 (30일 이상)
echo "=== 오래된 로그 파일 ==="
find /var/log -name "*.log" -mtime +30 2>/dev/null
# 5. 임시 파일 정리
echo "=== 임시 파일 정리 ==="
find /tmp -type f -mtime +7 2>/dev/null | wc -l
==== 시나리오 3: 시스템 성능 모니터링 ====
**상황**: 시스템이 느려졌어요. 원인을 찾아보세요.
# 1. 시스템 부하 확인
echo "=== 시스템 부하 ==="
uptime
# 2. 메모리 사용량 확인
echo "=== 메모리 사용량 ==="
free -h
# 3. CPU 사용률 높은 프로세스
echo "=== CPU 사용률 Top 5 ==="
ps aux --sort=-%cpu | head -6
# 4. 메모리 사용량 높은 프로세스
echo "=== 메모리 사용량 Top 5 ==="
ps aux --sort=-%mem | head -6
# 5. 디스크 I/O 확인
echo "=== 디스크 사용량 ==="
df -h
# 6. 네트워크 연결 확인
echo "=== 네트워크 연결 수 ==="
netstat -an | grep ESTABLISHED | wc -l
===== 💡 고급 팁 모음 =====
**🚀 효율성 향상**:
1. **파이프라인 활용**: 명령어들을 연결해서 강력한 기능 만들기
# 가장 큰 파일 5개 찾기
find . -type f -exec ls -lh {} + | sort -k5 -hr | head -5
# 프로세스 메모리 사용량 순위
ps aux | sort -k4 -nr | head -10
# 로그에서 IP 주소 추출하고 중복 제거
grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' access.log | sort | uniq -c | sort -nr
2. **별칭(Alias) 만들기**: 자주 사용하는 명령어 단축키 만들기
# ~/.bashrc 파일에 추가
alias ll=''ls -la''
alias la=''ls -la''
alias l=''ls -l''
alias h=''history''
alias df=''df -h''
alias du=''du -h''
alias ps=''ps aux''
alias top=''htop''
3. **환경 변수 활용**: 자주 사용하는 경로 저장
export WORK_DIR="/home/user/projects"
export LOG_DIR="/var/log/myapp"
# 사용법
cd $WORK_DIR
tail -f $LOG_DIR/error.log
**⚡ 문제 해결 원리**:
1. **로그 파일 위치**: 문제가 생기면 여기를 확인하세요
- ''/var/log/syslog'' - 시스템 전체 로그
- ''/var/log/auth.log'' - 인증 관련 로그
- ''/var/log/kern.log'' - 커널 로그
2. **시스템 상태 확인 명령어**:
# 한 번에 시스템 상태 확인
echo "=== 시스템 정보 ==="
uname -a
echo "=== 부팅 시간 ==="
uptime
echo "=== 디스크 ==="
df -h
echo "=== 메모리 ==="
free -h
echo "=== CPU 사용률 ==="
top -bn1 | head -20
3. **네트워크 문제 해결**:
# 네트워크 연결 확인 단계별
ping -c 3 8.8.8.8 # 인터넷 연결
ping -c 3 google.com # DNS 해석
curl -I https://google.com # HTTP 연결
===== 🏆 마스터 도전 과제 =====
**🎯 과제 1: 시스템 모니터링 스크립트 만들기**
#!/bin/bash
# system_monitor.sh
echo "========== 시스템 모니터링 보고서 =========="
echo "날짜: $(date)"
echo ""
echo "1. 시스템 부하"
uptime
echo ""
echo "2. 디스크 사용량"
df -h
echo ""
echo "3. 메모리 사용량"
free -h
echo ""
echo "4. CPU 사용률 Top 5"
ps aux --sort=-%cpu | head -6
echo ""
echo "5. 메모리 사용률 Top 5"
ps aux --sort=-%mem | head -6
echo ""
echo "========== 보고서 끝 =========="
**실행하기**:
chmod +x system_monitor.sh
./system_monitor.sh
**🎯 과제 2: 로그 분석 자동화**
#!/bin/bash
# log_analyzer.sh
LOG_FILE="/var/log/syslog"
REPORT_FILE="log_report_$(date +%Y%m%d).txt"
echo "로그 분석 보고서 - $(date)" > $REPORT_FILE
echo "===========================================" >> $REPORT_FILE
echo "1. 총 로그 라인 수: $(wc -l < $LOG_FILE)" >> $REPORT_FILE
echo "2. 에러 로그 수: $(grep -c -i error $LOG_FILE)" >> $REPORT_FILE
echo "3. 경고 로그 수: $(grep -c -i warning $LOG_FILE)" >> $REPORT_FILE
echo "4. 최근 10개 에러:" >> $REPORT_FILE
grep -i error $LOG_FILE | tail -10 >> $REPORT_FILE
echo "로그 분석 완료: $REPORT_FILE"
**🎯 과제 3: 백업 자동화**
#!/bin/bash
# backup_script.sh
BACKUP_DIR="/backup"
SOURCE_DIR="/home/user/important"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="backup_$DATE.tar.gz"
# 백업 디렉토리 생성
mkdir -p $BACKUP_DIR
# 백업 실행
tar -czf $BACKUP_DIR/$BACKUP_FILE $SOURCE_DIR
# 결과 확인
if [ $? -eq 0 ]; then
echo "백업 성공: $BACKUP_DIR/$BACKUP_FILE"
ls -lh $BACKUP_DIR/$BACKUP_FILE
else
echo "백업 실패!"
fi
# 7일 이상 된 백업 파일 삭제
find $BACKUP_DIR -name "backup_*.tar.gz" -mtime +7 -delete
echo "오래된 백업 파일 정리 완료"
===== 🎉 축하합니다! =====
Linux 고급 명령어를 모두 마스터했습니다! 🎊
**이제 할 수 있는 것들**:
- ✅ 파일 권한을 자유자재로 설정하기
- ✅ 시스템 리소스 모니터링하기
- ✅ 네트워크 문제 진단하기
- ✅ 압축 파일 다루기
- ✅ 고급 텍스트 처리하기
- ✅ 프로세스 관리하기
- ✅ 실무 문제 해결하기
**다음 단계**: 이제 쉘 스크립트를 배워서 이 모든 것을 자동화해보세요!
**👉 [[wiki:it:linux:shell_scripting|🤖 쉘 스크립트로 업무 자동화]]**
===== 📚 참고자료 =====
- **Linux 명령어 레퍼런스**: https://linux.die.net/man/
- **시스템 관리 가이드**: https://www.tldp.org/LDP/sag/html/
- **정규표현식 연습**: https://regexr.com/
- **쉘 스크립트 가이드**: https://www.shellscript.sh/
**💬 도움이 필요하면**:
- ''man 명령어'' - 명령어 매뉴얼
- ''info 명령어'' - 더 자세한 정보
- ''명령어 --help'' - 간단한 도움말
//💡 **실무 조언**: 명령어를 외우려 하지 말고, 필요할 때마다 찾아보면서 자연스럽게 익히세요. 실제 문제를 해결하면서 배우는 것이 가장 효과적입니다!//