====== 권한 설정 & 고급 명령어 ====== **🎯 목표**: 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'' - 간단한 도움말 //💡 **실무 조언**: 명령어를 외우려 하지 말고, 필요할 때마다 찾아보면서 자연스럽게 익히세요. 실제 문제를 해결하면서 배우는 것이 가장 효과적입니다!//