### : 시스템 관리
```
프로그램 설치 → apt (Advanced Package Tool)
사용자 관리 → 권한 분리 (보안)
환경변수 → 프로그램 설정값 자동 로드
```
### : 자동화
```
반복 작업 → 스크립트 작성 → 자동 실행
한 번 만들면 → 계속 재사용
```
---
# — 패키지 관리, 사용자/그룹, 환경변수
## 핵심 개념
### 패키지
- Linux에서 **프로그램을 설치/제거**할 때 사용
- Ubuntu는 `apt` (Advanced Package Tool, 고급 패키지 도구) 명령어로 관리
### 사용자 & 그룹
- 여러 명이 같은 컴퓨터를 사용
- 누가 뭘 할 수 있는지 권한 분리
### 환경변수
- 프로그램이 사용하는 **설정값들**
- `$PATH`, `$HOME` 등이 대표적
---
## 실습
### Q: 프로그램을 어떻게 설치해?
**A:** `apt` (Advanced Package Tool, 고급 패키지 도구) 명령어를 사용해요.
**주요 명령어:**
| 명령어 | 의미 |
|--------|------|
| `sudo apt update` | 패키지 목록 최신화 (update = 갱신) |
| `sudo apt install <name>` | 패키지 설치 (install = 설치) |
| `sudo apt remove <name>` | 패키지 제거 (설정 유지) |
| `sudo apt purge <name>` | 패키지 + 설정 모두 제거 (purge = 완전 제거) |
| `sudo apt search <name>` | 패키지 검색 (search = 검색) |
| `apt list --installed` | 설치된 패키지 목록 |
**실습 결과:**
```bash
# 1️⃣ 패키지 목록 최신화
sudo apt update
# 2️⃣ git 설치
sudo apt install git
# 3️⃣ 설치 확인
git --version
# git version 2.34.1
```
---
### Q: sudo가 뭐야?
**A:** `sudo` (Super User DO, 최고 권한자로 실행) = 관리자 권한으로 실행
```
일반 사용자가 할 수 없는 일들
├─ 패키지 설치 (시스템 수정)
├─ 다른 사용자 추가
├─ 시스템 파일 수정
└─ 포트 1024 이하 사용
↓
sudo 붙이면 → 관리자 권한으로 실행 ✅
```
```bash
apt install git # ❌ Permission denied (권한 거부)
sudo apt install git # ✅ 작동
```
---
### Q: 새 사용자를 어떻게 추가해?
**A:** `useradd` (user add, 사용자 추가) 명령어 사용 (root 권한 필요)
**실습 결과:**
```bash
# 1️⃣ 'dev' 사용자 추가
sudo useradd -m -s /bin/bash dev
# │ │
# │ └─ -s (shell, 셸): 기본 셸을 bash로 지정
# └─ -m (make home, 홈 생성): 홈 디렉토리 자동 생성
# 2️⃣ 비밀번호 설정 (passwd = password)
sudo passwd dev
# New password: ← 비번 입력
# Retype new password: ← 다시 입력
# 3️⃣ sudo 그룹에 추가 (관리자 권한)
sudo usermod -aG sudo dev
# │
# └─ -aG (append to Group, 그룹에 추가): 기존 그룹 유지하면서 추가
# 4️⃣ dev 사용자로 전환 (su = Switch User, 사용자 전환)
su - dev
```
---
### Q: `/etc/passwd`와 `/etc/shadow`가 뭐야?
**A:** 사용자 정보를 저장하는 파일들이에요.
**`/etc/passwd` (공개 정보):**
```bash
cat /etc/passwd
# cat = concatenate (연결, 출력)
```
```
root:x:0:0:root:/root:/bin/bash
xxxxx :x:1000:1000::/home/ xxxxx :/bin/bash
│ │ │ │ │ │ │
│ │ │ │ │ │ └─ 기본 셸 (bash)
│ │ │ │ │ └─ 홈 디렉토리
│ │ │ │ └─ 설명 (comment, 주석)
│ │ │ └─ 그룹 ID (GID = Group ID)
│ │ └─ 사용자 ID (UID = User ID)
│ └─ x = 비번은 /etc/shadow에 저장됨
└─ 사용자명
```
**`/etc/shadow` (비밀번호, root만 볼 수 있음):**
```bash
sudo cat /etc/shadow
```
```
xxxxx :$6$abcd1234$xyz...:18...:0:99999:7:::
│
└─ 비밀번호 해시 (hash, 암호화된 값)
```
**중요:** 비밀번호는 **해시(hash, 단방향 암호화)**되어 저장되므로 원본을 복구할 수 없어요!
```
입력한 비밀번호 → 해싱 → 저장된 해시와 비교 → 일치하면 로그인
↑
원본은 아무도 모름! 🔐
```
---
### Q: 비밀번호는 어떻게 변경해?
**A:** `passwd` (password, 비밀번호) 명령어 사용
```bash
# 내 비밀번호 변경
passwd
# 다른 사용자 비밀번호 변경 (관리자)
sudo passwd dev
```
**취소:** `Ctrl + C` (Cancel, 취소)
---
### Q: 시스템 사용자와 일반 사용자의 차이?
**A:** UID(User ID, 사용자 ID)로 구분돼요.
| 항목 | 시스템 사용자 | 일반 사용자 (너) |
|------|-------|-------|
| UID (User ID) | 1, 2, 3... (1000 미만) | **1000 이상** |
| 셸 | `/usr/sbin/nologin` (로그인 불가) | `/bin/bash` |
| 홈 디렉토리 | 없거나 시스템 폴더 | `/home/사용자명/` |
| 역할 | 서비스 실행 | 실제 사람이 사용 |
```
daemon, www-data, systemd-* → 시스템 사용자 (서비스용)
xxxxx , dev → 일반 사용자 (사람이 로그인)
```
---
### Q: `$PATH`가 뭐야?
**A:** "명령어를 어디서 찾을지" 정해주는 환경변수 (PATH = 경로)
```bash
echo $PATH
# /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/snap/bin
```
**의미:** 콜론(`:`)으로 구분된 경로들을 **순서대로** 검색
**실제 동작:**
```bash
git --version
```
```
1. /usr/local/sbin에서 git 찾기? → 없음
2. /usr/local/bin에서 찾기? → 없음
3. /usr/sbin에서 찾기? → 없음
4. /usr/bin에서 찾기? → 있다! ✅
→ /usr/bin/git 실행
```
---
### Q: `which`와 `find` 차이는?
**A:** 찾는 대상과 범위가 달라요.
| 도구 | 찾는 것 | 범위 |
|------|---------|------|
| `which` (어디?) | **명령어** (실행파일만) | **PATH 안에서만** |
| `find` (찾기) | **모든 파일** | **전체 파일시스템** |
**실습:**
```bash
# which: 명령어 위치 찾기
which python3 # /usr/bin/python3
which git # /usr/bin/git
which test.txt # (아무것도 안 나옴 - 일반 파일이라서)
# find: 파일 검색
find . -name "*.txt" # 현재 폴더에서 .txt 찾기
find ~ -name "*.txt" # 홈 폴더에서 찾기
find / -name "*.txt" # 전체 시스템에서 찾기
```
**`.`, `~`, `/` 의미:**
| 기호 | 의미 |
|------|------|
| `.` | 현재 디렉토리 (current directory) |
| `~` | 홈 디렉토리 (home directory) |
| `/` | 루트 디렉토리 (root, 최상위 폴더) |
---
### Q: `~/.bashrc`가 뭐야?
**A:** bash가 시작될 때 자동으로 실행되는 **설정 파일**
```
. = 숨겨진 파일 (점으로 시작)
bash = Bourne Again SHell (셸의 일종, 명령어 해석기)
rc = run command (실행할 설정들)
```
**실행 시점:**
```
터미널 열기
↓
bash (Bourne Again SHell) 시작
↓
~/.bashrc 자동 실행
↓
설정 적용 ✅
```
**들어가는 내용:**
```bash
# 1. alias (별칭, 명령어 단축)
alias ll='ls -lah'
alias rm='trash-put'
# 2. 환경변수 (export = 내보내기/공유)
export PATH="/usr/local/bin:$PATH"
export EDITOR="nano"
# 3. 함수
my_function() {
echo "안녕!"
}
```
---
### Q: `~/.bashrc`와 `~/.profile` 차이?
**A:** 실행 시점이 달라요.
| 파일 | 언제 | 몇 번 | 용도 |
|------|------|-----|------|
| `~/.bashrc` | 터미널 열 때마다 | 매번 | alias, 함수, 자주 쓰는 설정 |
| `~/.profile` | 로그인할 때 | 1번 | 로그인 환경 설정 |
```
~/.profile = 게임 시작할 때 한 번 설정
~/.bashrc = 게임 켤 때마다 확인
```
---
### Q: alias가 뭐야?
**A:** `alias` (별칭) = 명령어 단축! 자주 쓰는 명령어를 짧은 이름으로 만들 수 있어요.
```bash
alias ll='ls -lah'
│ │
│ └─ 실제 명령어 (ls = list, -l = long, -a = all, -h = human-readable)
└─ 단축 이름
```
**의미:** "지금부터 `ll`이라고 치면 `ls -lah`를 실행해"
**자주 쓰는 alias들:**
```bash
alias ll='ls -lah' # ls long all human-readable (상세 목록)
alias la='ls -A' # ls All (숨겨진 파일도 보기)
alias rm='trash-put' # rm을 안전하게 (휴지통으로 이동)
alias grep='grep --color=auto' # 색칠된 grep (Global Regular Expression Print)
alias mkdir='mkdir -p' # mkdir parents (부모 디렉토리도 자동 생성)
alias ..='cd ..' # cd = change directory (상위 디렉토리로)
```
**실습:**
```bash
# 1️⃣ ~/.bashrc에 추가
echo "alias ll='ls -lah'" >> ~/.bashrc
# 2️⃣ 적용 (source = 읽어서 적용)
source ~/.bashrc
# 3️⃣ 확인
alias ll # alias ll='ls -lah' 출력
ll # ls -lah 실행됨
```
---
## 핵심 정리
### 패키지 관리
```bash
sudo apt update # 목록 최신화
sudo apt install <name> # 설치
sudo apt remove <name> # 제거
```
### 사용자 관리
```bash
sudo useradd -m -s /bin/bash 사용자명 # user add
sudo passwd 사용자명 # password
sudo usermod -aG sudo 사용자명 # user modify
```
### 환경변수
```bash
echo $PATH # 명령어 검색 경로
export VAR="value" # 환경변수 설정 (export = 내보내기)
```
### 명령어 위치 찾기
```bash
which python3 # 명령어 위치 (PATH에서)
find . -name "*.txt" # 파일 검색 (지정 폴더)
```
### 설정 파일
```bash
nano ~/.bashrc # bash (Bourne Again SHell) 설정 편집
source ~/.bashrc # 변경사항 적용
```
---
---
# — 셸 스크립트 기초
## 핵심 개념
### 셸 스크립트 = bash 명령어 모음
- 여러 명령어를 **파일에 저장**해서 한 번에 실행
- **반복 작업 자동화**의 핵심
- Docker, CI/CD (Continuous Integration / Continuous Deployment, 지속적 통합/지속적 배포) 등 어디서든 쓰임
---
## 실습
### Q: 셸 스크립트가 뭐야?
**A:** bash (Bourne Again SHell) 명령어들을 파일에 저장해서 한 번에 실행하는 거예요.
**기본 구조:**
```bash
#!/bin/bash # ← Shebang (이 파일은 bash 스크립트야!)
echo "안녕하세요!" # ← bash 명령어들 (echo = 출력)
ls -la # ls = list, -l = long, -a = all
date # 현재 날짜/시간 출력
```
---
### Q: `#!/bin/bash`이 뭐야?
**A:** **Shebang** (Sharp + Bang, `#!`의 별칭) — "이 파일을 bash로 실행해"라고 알려주는 표식
```bash
#!/bin/bash ← bash (Bourne Again SHell) 스크립트
#!/usr/bin/python3 ← Python 스크립트
#!/usr/bin/env node ← Node.js 스크립트
```
**없으면?** 시스템이 어떤 언어인지 몰라서 오류 발생
---
### Q: 스크립트는 어떻게 실행해?
**A:** 3단계로!
**실습 결과:**
```bash
# 1단계: 스크립트 파일 만들기 (nano = 텍스트 에디터)
nano hello.sh
```
내용 입력:
```bash
#!/bin/bash
echo "안녕하세요!" # echo = 출력
echo "현재 시간은:"
date # 현재 날짜/시간
echo "현재 사용자:"
whoami # who am I (나는 누구?)
```
```bash
# 2단계: 실행 권한 주기 (chmod = Change Mode, 권한 변경)
chmod +x hello.sh
# │
# └─ +x (add execute, 실행 권한 추가)
# 3단계: 실행하기
./hello.sh
# │
# └─ ./ = 현재 폴더(.)에서 실행
```
**결과:**
```
안녕하세요!
현재 시간은:
Wed Apr 29 16:48:29 KST 2026
↑
KST = Korea Standard Time (한국 표준시)
현재 사용자:
xxxxx
```
---
### Q: 변수는 어떻게 써?
**A:** 변수 선언 후 `$` 붙여서 사용
**규칙:**
```bash
# 선언 (= 앞뒤 공백 없음! 중요!)
NAME=" xxxxx "
AGE=25
# 사용 ($ 붙이기)
echo $NAME # xxxxx
echo "이름: $NAME" # 이름: xxxxx
```
**실습 결과:**
```bash
nano user_info.sh
```
```bash
#!/bin/bash
# 변수 선언
NAME=" xxxxx "
AGE=25
ROLE="developer"
# 변수 사용
echo "=== 사용자 정보 ==="
echo "이름: $NAME"
echo "나이: $AGE"
echo "직책: $ROLE"
echo "환영합니다, $NAME!"
```
```bash
chmod +x user_info.sh
./user_info.sh
```
**결과:**
```
=== 사용자 정보 ===
이름: xxxxx
나이: 25
직책: developer
환영합니다, xxxxx !
```
---
### Q: 따옴표 차이가 뭐야?
**A:** 셋 다 다르게 동작해요!
| 따옴표 | 의미 | 예시 |
|--------|------|------|
| `"..."` (큰따옴표, double quote) | **변수 치환됨** | `"$NAME"` → ` xxxxx ` |
| `'...'` (작은따옴표, single quote) | **그대로 출력** | `'$NAME'` → `$NAME` |
| `$(...)` (명령어 치환, command substitution) | **명령어 실행** | `$(date)` → 현재 시간 |
**예시:**
```bash
NAME=" xxxxx "
echo "이름은 $NAME 입니다" # 이름은 xxxxx 입니다 ✅
echo '이름은 $NAME 입니다' # 이름은 $NAME 입니다 (그대로!)
echo "현재 시간: $(date)" # 현재 시간: Wed Apr 29 ...
```
---
### Q: 조건문은 어떻게 써?
**A:** `if [ 조건 ]; then ... fi` 구조 (fi = if를 거꾸로 쓴 것, 끝맺음)
**기본 문법:**
```bash
if [ 조건 ]; then # if = 만약
# 참이면 실행
else # else = 그 외에는
# 거짓이면 실행
fi # fi = if의 종료
```
**중요:** `[`와 `]` 양쪽에 **공백 필수!**
```bash
if [$AGE -ge 18]; then ❌ 공백 없으면 에러
if [ $AGE -ge 18 ]; then ✅ 공백 있어야 함
```
**비교 연산자:**
| 연산자 | 풀네임 | 의미 |
|--------|--------|------|
| `-eq` | equal | = (같음) |
| `-ne` | not equal | ≠ (다름) |
| `-lt` | less than | < (작음) |
| `-le` | less than or equal | ≤ (작거나 같음) |
| `-gt` | greater than | > (큼) |
| `-ge` | greater than or equal | ≥ (크거나 같음) |
**실습 결과:**
```bash
nano age_check.sh
```
```bash
#!/bin/bash
AGE=25
if [ $AGE -ge 18 ]; then
echo "성인입니다"
else
echo "미성년자입니다"
fi
```
```bash
./age_check.sh
# 성인입니다
```
---
### Q: 반복문은 어떻게 써?
**A:** `for 변수 in 리스트; do ... done` 구조 (for = ~를 위해, do = 실행, done = 완료)
**실습 1: 리스트 반복**
```bash
nano loop1.sh
```
```bash
#!/bin/bash
for name in alice bob charlie; do
echo "안녕하세요, $name!"
done
```
**결과:**
```
안녕하세요, alice!
안녕하세요, bob!
안녕하세요, charlie!
```
**실습 2: 숫자 반복**
```bash
nano loop2.sh
```
```bash
#!/bin/bash
for i in {1..5}; do # i = index (반복 변수)
echo "반복 $i번"
done
```
**결과:**
```
반복 1번
반복 2번
반복 3번
반복 4번
반복 5번
```
---
### Q: 함수는 어떻게 만들어?
**A:** `함수이름() { ... }` 구조
**기본 구조:**
```bash
함수이름() {
# 함수 내용
}
# 호출
함수이름
```
**주의: 끝낼 때 `}`로!**
```bash
# if/for는 키워드로 끝남
if [ ... ]; then ... fi # fi (if 끝)
for ... do ... done # done (반복 끝)
# 함수는 중괄호로 끝남 (C 언어 같이)
함수이름() { ... } # } (블록 끝)
```
**실습 결과:**
```bash
nano greet.sh
```
```bash
#!/bin/bash
# 함수 정의 (greet = 인사하다)
greet() {
echo "=========="
echo "안녕하세요!"
echo "=========="
}
# 함수 호출
greet
greet
greet
```
**결과:**
```
==========
안녕하세요!
==========
==========
안녕하세요!
==========
==========
안녕하세요!
==========
```
---
### Q: 함수에 값을 넘길 수 있어?
**A:** `$1`, `$2`로 받으면 돼요! (위치 매개변수, positional parameters)
**인자 변수:**
```bash
함수이름 값1 값2 값3
$1 = 첫 번째 값
$2 = 두 번째 값
$3 = 세 번째 값
$@ = 모든 값 (at sign, 모든 인자)
$# = 값의 개수 (sharp, 개수)
```
**실습 결과:**
```bash
nano print_box.sh
```
```bash
#!/bin/bash
print_box() { # print_box = 박스 출력
echo "=========="
echo "$1" # 첫 번째 인자 (argument)
echo "=========="
}
# 호출하면서 값 전달
print_box "안녕하세요"
print_box "환영합니다"
print_box "감사합니다"
```
**결과:**
```
==========
안녕하세요
==========
==========
환영합니다
==========
==========
감사합니다
==========
```
---
### Q: 명령어가 성공했는지 어떻게 알아?
**A:** **`$?`** 변수를 보면 돼요! (exit status, 종료 상태)
**규칙:**
```bash
$? = 0 → 성공 ✅
$? ≠ 0 → 실패 ❌
```
**자주 보는 종료 코드 (Exit Code):**
| 코드 | 의미 |
|------|------|
| `0` | 성공 (Success) |
| `1` | 일반 에러 (General Error) |
| `2` | 사용법 에러 (Misuse, 파일 없음 등) |
| `127` | 명령어를 찾을 수 없음 (Command Not Found) |
**실습 결과:**
```bash
nano check_exit.sh
```
```bash
#!/bin/bash
ls /home
echo "ls /home 결과: $?"
ls /nonexistent
echo "ls /nonexistent 결과: $?"
```
**결과:**
```
dev xxxxx
ls /home 결과: 0 ← 성공!
ls: cannot access '/nonexistent': No such file or directory
ls /nonexistent 결과: 2 ← 실패! (파일 없음)
```
---
## 실전 예시
### 예시 1: 디스크 사용량 알림
```bash
#!/bin/bash
# df = disk free, awk = 텍스트 처리, tr = translate
USAGE=$(df / | awk 'NR==2 {print $5}' | tr -d '%')
if [ $USAGE -gt 80 ]; then
echo "⚠️ 디스크 사용량이 ${USAGE}%입니다!"
else
echo "✅ 디스크 상태 정상 (${USAGE}%)"
fi
```
### 예시 2: 백업 스크립트
```bash
#!/bin/bash
BACKUP_DIR="/home/ xxxxx /backup"
DATE=$(date +%Y%m%d) # YYYYMMDD 형식
mkdir -p $BACKUP_DIR # mkdir parents (부모 폴더까지)
# tar = tape archive (압축), -c = create, -z = gzip, -f = file
tar -czf $BACKUP_DIR/backup_$DATE.tar.gz ~/Documents
echo "백업 완료: backup_$DATE.tar.gz"
```
### 예시 3: 사용자 환영 메시지
```bash
#!/bin/bash
greet() {
echo "=================="
echo " 안녕하세요, $1!"
echo " 오늘은 $(date +%Y-%m-%d)"
echo "=================="
}
greet " xxxxx "
```
---
## 핵심 정리
### 기본 구조
```bash
#!/bin/bash # Shebang (#!)
chmod +x script.sh # chmod = Change Mode (실행 권한)
./script.sh # 실행
```
### 변수
```bash
NAME="value" # 선언 (공백 없음!)
echo $NAME # 사용 ($ 붙이기)
```
### 따옴표
```bash
"..." → 변수 치환 (double quote, 큰따옴표)
'...' → 그대로 (single quote, 작은따옴표)
$(...) → 명령어 실행 (command substitution)
```
### 조건문
```bash
if [ $AGE -ge 18 ]; then # if = 만약, ge = greater or equal
echo "성인"
else # else = 그 외
echo "미성년"
fi # fi = if 종료
```
### 반복문
```bash
for i in {1..5}; do # for = 반복, do = 실행
echo $i
done # done = 완료
```
### 함수
```bash
my_func() { # 함수 정의
echo "$1" # 첫 번째 인자 ($1 = first argument)
}
my_func "Hello" # 함수 호출
```
### 종료 코드
```bash
명령어 실행
echo $? # exit status (0 = 성공, 0 아니면 실패)
```
---
## 통합 정리
### : 시스템 관리
- ✅ `apt` (Advanced Package Tool)로 패키지 설치/제거
- ✅ 사용자 추가, 권한 관리 (`useradd`, `usermod`, `passwd`)
- ✅ `/etc/passwd`, `/etc/shadow` 이해
- ✅ `$PATH` 환경변수 이해
- ✅ `which` (명령어 위치) vs `find` (파일 검색)
- ✅ `~/.bashrc` (bash run command)로 alias, 환경변수 설정
### : 자동화
- ✅ Shebang(`#!`)으로 스크립트 시작
- ✅ 변수, 따옴표 차이 이해
- ✅ 조건문(`if`), 반복문(`for`) 활용
- ✅ 함수와 인자 (`$1`, `$2`)
- ✅ 종료 코드(`$?`, exit status)로 성공/실패 판단
### 통합 개념
```
: 환경 만들기 (사용자, 패키지, 환경변수)
↓
그 환경에서 자동화 (스크립트)
↓
실무에서 매일 쓰는 시스템 관리 능력!
```
---
## 📖 줄임말 사전
| 줄임말 | 풀네임 | 의미 |
|-------|--------|------|
| `apt` | Advanced Package Tool | 고급 패키지 도구 |
| `sudo` | Super User DO | 최고 권한자로 실행 |
| `bash` | Bourne Again SHell | 셸의 일종 (명령어 해석기) |
| `useradd` | user add | 사용자 추가 |
| `usermod` | user modify | 사용자 수정 |
| `passwd` | password | 비밀번호 |
| `groupadd` | group add | 그룹 추가 |
| `chmod` | Change Mode | 권한 변경 |
| `chown` | Change Owner | 소유자 변경 |
| `UID` | User ID | 사용자 ID |
| `GID` | Group ID | 그룹 ID |
| `PATH` | Path | (명령어) 경로 |
| `rc` | Run Commands | 실행할 설정들 |
| `ls` | list | 목록 보기 |
| `cd` | change directory | 디렉토리 이동 |
| `pwd` | print working directory | 현재 위치 출력 |
| `cp` | copy | 복사 |
| `mv` | move | 이동/이름 변경 |
| `rm` | remove | 삭제 |
| `mkdir` | make directory | 디렉토리 생성 |
| `cat` | concatenate | 연결/출력 |
| `grep` | Global Regular Expression Print | 패턴 검색 |
| `wc` | word count | 단어/줄 수 세기 |
| `ps` | process status | 프로세스 상태 |
| `df` | disk free | 디스크 여유 공간 |
| `du` | disk usage | 디스크 사용량 |
| `tar` | tape archive | 압축/묶음 |
| `CI/CD` | Continuous Integration / Continuous Deployment | 지속적 통합/배포 |
| `KST` | Korea Standard Time | 한국 표준시 |
| `WSL` | Windows Subsystem for Linux | Windows에서 Linux 실행 환경 |
---
'리눅스' 카테고리의 다른 글
| Linux 입문: 텍스트 처리부터 프로세스 관리까지 (0) | 2026.04.28 |
|---|---|
| WSL2로 시작하는 Linux 기초 — 파일시스템부터 권한까지 (0) | 2026.04.28 |