Spaces:
Running
Running
| [ | |
| { | |
| "id": "linux-lab-31", | |
| "title": "๋ก๊ทธ ๋ง์ง๋ง 20์ค ํ์ธ", | |
| "task_description": "`/var/log/syslog` ํ์ผ์ ๋ง์ง๋ง 20์ค์ ํ์ธํ์ธ์.", | |
| "expected_command": "tail -n 20 /var/log/syslog", | |
| "grading_conditions": [ | |
| "tail", | |
| "-n", | |
| "20", | |
| "/var/log/syslog" | |
| ], | |
| "hint": "tail์ -n ์ต์ ์ผ๋ก ์ถ๋ ฅํ ์ค ์๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.", | |
| "explanation": "`tail -n 20 /var/log/syslog`๋ ํ์ผ์ ๋ง์ง๋ง 20์ค์ ์ถ๋ ฅํฉ๋๋ค.", | |
| "difficulty": "easy" | |
| }, | |
| { | |
| "id": "linux-lab-32", | |
| "title": "๋ก๊ทธ ํ์ผ ์ค์๊ฐ ์ถ์ ", | |
| "task_description": "`/var/log/syslog` ํ์ผ์ ์ถ๊ฐ๋๋ ๋ด์ฉ์ ์ค์๊ฐ์ผ๋ก ์ถ์ ํ์ธ์.", | |
| "expected_command": "tail -f /var/log/syslog", | |
| "grading_conditions": [ | |
| "tail", | |
| "-f", | |
| "/var/log/syslog" | |
| ], | |
| "hint": "`-f` ์ต์ ์ follow์ ์ฝ์๋ก ํ์ผ ๋์ ์ค์๊ฐ์ผ๋ก ์ถ์ ํฉ๋๋ค.", | |
| "explanation": "`tail -f /var/log/syslog`๋ ํ์ผ์ ์ถ๊ฐ๋๋ ๋ด์ฉ์ ์ค์๊ฐ์ผ๋ก ๊ณ์ ์ถ๋ ฅํฉ๋๋ค.", | |
| "difficulty": "easy" | |
| }, | |
| { | |
| "id": "linux-lab-33", | |
| "title": "ํ์ผ ์์ 10์ค ํ์ธ", | |
| "task_description": "`/etc/passwd` ํ์ผ์ ์ฒ์ 10์ค์ ํ์ธํ์ธ์.", | |
| "expected_command": "head /etc/passwd", | |
| "grading_conditions": [ | |
| "head", | |
| "/etc/passwd" | |
| ], | |
| "hint": "head๋ ๊ธฐ๋ณธ์ผ๋ก ์ฒ์ 10์ค์ ์ถ๋ ฅํฉ๋๋ค.", | |
| "explanation": "`head /etc/passwd`๋ ํ์ผ์ ์ฒ์ 10์ค์ ์ถ๋ ฅํฉ๋๋ค. `-n`์ผ๋ก ์ค ์๋ฅผ ์ง์ ํ ์๋ ์์ต๋๋ค.", | |
| "difficulty": "easy" | |
| }, | |
| { | |
| "id": "linux-lab-34", | |
| "title": "sed๋ก ํ ์คํธ ๊ต์ฒด", | |
| "task_description": "`config.txt`์์ `old_value`๋ฅผ `new_value`๋ก ๋ชจ๋ ๊ต์ฒดํด ์ถ๋ ฅํ์ธ์.", | |
| "expected_command": "sed 's/old_value/new_value/g' config.txt", | |
| "grading_conditions": [ | |
| "sed", | |
| "old_value", | |
| "new_value", | |
| "config.txt" | |
| ], | |
| "hint": "`s/ํจํด/๊ต์ฒด/g` ํํ๋ก ๊ต์ฒด ๋ช ๋ น์ ์์ฑํฉ๋๋ค. `g`๋ ํ ์ค์์ ๋ชจ๋ ๊ต์ฒดํฉ๋๋ค.", | |
| "explanation": "`sed 's/old_value/new_value/g' config.txt`๋ ํ์ผ์์ old_value๋ฅผ ๋ชจ๋ new_value๋ก ๊ต์ฒดํด ์ถ๋ ฅํฉ๋๋ค.", | |
| "difficulty": "medium" | |
| }, | |
| { | |
| "id": "linux-lab-35", | |
| "title": "sed ์ธํ๋ ์ด์ค ์์ ", | |
| "task_description": "`nginx.conf`์์ `localhost`๋ฅผ `127.0.0.1`๋ก ์ง์ ์์ ํ์ธ์.", | |
| "expected_command": "sed -i 's/localhost/127.0.0.1/g' nginx.conf", | |
| "grading_conditions": [ | |
| "sed", | |
| "-i", | |
| "localhost", | |
| "127.0.0.1", | |
| "nginx.conf" | |
| ], | |
| "hint": "`-i` ์ต์ ์ ํ์ค ์ถ๋ ฅ ๋์ ํ์ผ์ ์ง์ ์์ ํฉ๋๋ค.", | |
| "explanation": "`sed -i 's/localhost/127.0.0.1/g' nginx.conf`๋ nginx.conf ํ์ผ์ ์ง์ ์์ ํฉ๋๋ค.", | |
| "difficulty": "medium" | |
| }, | |
| { | |
| "id": "linux-lab-36", | |
| "title": "cut์ผ๋ก ์ฌ์ฉ์ ์ด๋ฆ ์ถ์ถ", | |
| "task_description": "`/etc/passwd`์์ ์ฝ๋ก (`:`) ๊ตฌ๋ถ์์ ์ฒซ ๋ฒ์งธ ํ๋(์ฌ์ฉ์ ์ด๋ฆ)๋ง ์ถ์ถํ์ธ์.", | |
| "expected_command": "cut -d':' -f1 /etc/passwd", | |
| "grading_conditions": [ | |
| "cut", | |
| "-d", | |
| "-f1", | |
| "/etc/passwd" | |
| ], | |
| "hint": "`-d`๋ก ๊ตฌ๋ถ์๋ฅผ, `-f`๋ก ์ถ๋ ฅํ ํ๋๋ฅผ ์ง์ ํฉ๋๋ค.", | |
| "explanation": "`cut -d':' -f1 /etc/passwd`๋ ์ฝ๋ก ๊ตฌ๋ถ์์์ ์ฒซ ๋ฒ์งธ ํ๋(์ฌ์ฉ์ ์ด๋ฆ)๋ฅผ ์ถ์ถํฉ๋๋ค.", | |
| "difficulty": "medium" | |
| }, | |
| { | |
| "id": "linux-lab-37", | |
| "title": "sort์ uniq์ผ๋ก ์ค๋ณต ์ ๊ฑฐ", | |
| "task_description": "`access.log`์์ ์ค๋ณต ์ค์ ์ ๊ฑฐํ๊ณ ์ํ๋ฒณ ์์ผ๋ก ์ ๋ ฌํด ์ถ๋ ฅํ์ธ์.", | |
| "expected_command": "sort access.log | uniq", | |
| "grading_conditions": [ | |
| "sort", | |
| "access.log", | |
| "uniq" | |
| ], | |
| "hint": "`uniq`์ ์ฐ์๋ ์ค๋ณต๋ง ์ ๊ฑฐํ๋ฏ๋ก ๋จผ์ `sort`๊ฐ ํ์ํฉ๋๋ค.", | |
| "explanation": "`sort access.log | uniq`์ ํ์ผ์ ์ ๋ ฌํ ๋ค ์ค๋ณต ์ค์ ์ ๊ฑฐํฉ๋๋ค.", | |
| "difficulty": "medium" | |
| }, | |
| { | |
| "id": "linux-lab-38", | |
| "title": "wc๋ก ์ค ์ ์ธ๊ธฐ", | |
| "task_description": "`/var/log/auth.log` ํ์ผ์ ์ค ์๋ฅผ ์ธ์ธ์.", | |
| "expected_command": "wc -l /var/log/auth.log", | |
| "grading_conditions": [ | |
| "wc", | |
| "-l", | |
| "/var/log/auth.log" | |
| ], | |
| "hint": "`wc -l`์ ์ค ์, `-w`๋ ๋จ์ด ์, `-c`๋ ๋ฐ์ดํธ ์๋ฅผ ์ ๋๋ค.", | |
| "explanation": "`wc -l /var/log/auth.log`๋ ํ์ผ์ ์ค ์๋ฅผ ์ถ๋ ฅํฉ๋๋ค.", | |
| "difficulty": "easy" | |
| }, | |
| { | |
| "id": "linux-lab-39", | |
| "title": "awk๋ก ๋ ๋ฒ์งธ ํ๋ ์ถ๋ ฅ", | |
| "task_description": "`access.log`์ ๊ฐ ์ค์์ ๋ ๋ฒ์งธ ํ๋๋ฅผ ์ถ๋ ฅํ์ธ์.", | |
| "expected_command": "awk '{print $2}' access.log", | |
| "grading_conditions": [ | |
| "awk", | |
| "$2", | |
| "access.log" | |
| ], | |
| "hint": "awk์์ `$1`, `$2`๋ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋ ๊ฐ ํ๋๋ฅผ ์๋ฏธํฉ๋๋ค.", | |
| "explanation": "`awk '{print $2}' access.log`๋ ๊ฐ ์ค์ ๋ ๋ฒ์งธ ํ๋๋ฅผ ์ถ๋ ฅํฉ๋๋ค.", | |
| "difficulty": "medium" | |
| }, | |
| { | |
| "id": "linux-lab-40", | |
| "title": "์ฌ๋ณผ๋ฆญ ๋งํฌ ์์ฑ", | |
| "task_description": "`/etc/nginx/nginx.conf`๋ฅผ ๊ฐ๋ฆฌํค๋ ์ฌ๋ณผ๋ฆญ ๋งํฌ `~/nginx.conf`๋ฅผ ๋ง๋์ธ์.", | |
| "expected_command": "ln -s /etc/nginx/nginx.conf ~/nginx.conf", | |
| "grading_conditions": [ | |
| "ln", | |
| "-s", | |
| "/etc/nginx/nginx.conf", | |
| "nginx.conf" | |
| ], | |
| "hint": "`ln -s ์๋ณธ ๋งํฌ์ด๋ฆ` ํํ๋ก ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ๋ง๋ญ๋๋ค.", | |
| "explanation": "`ln -s /etc/nginx/nginx.conf ~/nginx.conf`๋ ํ ๋๋ ํฐ๋ฆฌ์ nginx.conf ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ๋ง๋ญ๋๋ค.", | |
| "difficulty": "medium" | |
| }, | |
| { | |
| "id": "linux-lab-41", | |
| "title": "๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ๋ชฉ๋ก ํ์ธ", | |
| "task_description": "ํ์ฌ ์์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ๋ชฉ๋ก์ ํ์ธํ์ธ์.", | |
| "expected_command": "jobs", | |
| "grading_conditions": [ | |
| "jobs" | |
| ], | |
| "hint": "`jobs` ๋ช ๋ น์ผ๋ก ํ์ฌ ์์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ๋ชฉ๋ก์ ๋ณผ ์ ์์ต๋๋ค.", | |
| "explanation": "`jobs`๋ ํ์ฌ ์์์ `&`๋ก ์คํ๋๊ฑฐ๋ Ctrl+Z๋ก ์ ์ง๋ ์์ ๋ชฉ๋ก์ ๋ณด์ฌ์ค๋๋ค.", | |
| "difficulty": "easy" | |
| }, | |
| { | |
| "id": "linux-lab-42", | |
| "title": "nohup ๋ฐฑ๊ทธ๋ผ์ด๋ ์คํ", | |
| "task_description": "`long_process.sh` ์คํฌ๋ฆฝํธ๋ฅผ ํฐ๋ฏธ๋์ด ๋ซํ๋ ๊ณ์ ์คํ๋๋๋ก ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์คํํ์ธ์.", | |
| "expected_command": "nohup ./long_process.sh &", | |
| "grading_conditions": [ | |
| "nohup", | |
| "long_process.sh", | |
| "&" | |
| ], | |
| "hint": "`nohup`์ HUP ์๊ทธ๋์ ๋ฌด์ํด ํฐ๋ฏธ๋ ์ข ๋ฃ ํ์๋ ๊ณ์ ์คํ๋๊ฒ ํฉ๋๋ค.", | |
| "explanation": "`nohup ./long_process.sh &`๋ ํฐ๋ฏธ๋์ด ๋ซํ๋ ๊ณ์ ์คํ๋ฉ๋๋ค. ์ถ๋ ฅ์ ๊ธฐ๋ณธ์ ์ผ๋ก nohup.out์ ์ ์ฅ๋ฉ๋๋ค.", | |
| "difficulty": "medium" | |
| }, | |
| { | |
| "id": "linux-lab-43", | |
| "title": "๊ถํ ๋ณด์กด ํ์ผ ๋ฐฑ์ ", | |
| "task_description": "`/etc/passwd` ํ์ผ์ ๊ถํยท์์ ์ยทํ์์คํฌํ๋ฅผ ๋ณด์กดํด `/tmp/passwd.bak`์ผ๋ก ๋ณต์ฌํ์ธ์.", | |
| "expected_command": "cp -a /etc/passwd /tmp/passwd.bak", | |
| "grading_conditions": [ | |
| "cp", | |
| "-a", | |
| "/etc/passwd", | |
| "/tmp/passwd.bak" | |
| ], | |
| "hint": "์ผ๋ฐ `cp`๋ ์์ฑ์ ๋ณด์กดํ์ง ์์ต๋๋ค. ๋ฐฑ์ ์์๋ `-a` ์ต์ ์ ์ฌ์ฉํ์ธ์.", | |
| "explanation": "`cp -a`๋ `-dR --preserve=all`์ ๋จ์ถ์ผ๋ก ์ฌ๋ณผ๋ฆญ ๋งํฌยท๊ถํยท์์ ์ยทํ์์คํฌํ๋ฅผ ๋ชจ๋ ๋ณด์กดํฉ๋๋ค.", | |
| "difficulty": "easy" | |
| }, | |
| { | |
| "id": "linux-lab-44", | |
| "title": "๋๋ ํฐ๋ฆฌ ์ฌ๊ท ์ญ์ ์ ํ์ธ", | |
| "task_description": "`/tmp/testdir` ๋๋ ํฐ๋ฆฌ๋ฅผ ์ญ์ ์ ๊ฐ ํ์ผ์ ํ์ธํ๋ฉด์ ์ ๊ฑฐํ์ธ์.", | |
| "expected_command": "rm -ri /tmp/testdir", | |
| "grading_conditions": [ | |
| "rm", | |
| "-r", | |
| "-i", | |
| "/tmp/testdir" | |
| ], | |
| "hint": "`-r`์ ์ฌ๊ท ์ญ์ , `-i`๋ ๊ฐ ํ์ผ๋ง๋ค ํ์ธ์ ์์ฒญํฉ๋๋ค.", | |
| "explanation": "์ค์ ๋ฐ์ดํฐ๊ฐ ์๋ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ญ์ ํ ๋๋ `-i`๋ก ํ ํ์ผ์ฉ ํ์ธํ๋ ์ต๊ด์ด ์ฌ๊ณ ๋ฅผ ๋ฐฉ์งํฉ๋๋ค.", | |
| "difficulty": "easy" | |
| }, | |
| { | |
| "id": "linux-lab-45", | |
| "title": "MBR ํํฐ์ ์์ฑ (fdisk)", | |
| "task_description": "`/dev/sdb`์ fdisk๋ฅผ ์ฌ์ฉํด 20GB ์ฃผ ํํฐ์ ์ ์์ฑํ๊ณ ์ ์ฅํ์ธ์. (์ธํฐ๋ํฐ๋ธ: n โ p โ 1 โ Enter โ +20G โ w)", | |
| "expected_command": "fdisk /dev/sdb", | |
| "grading_conditions": [ | |
| "fdisk", | |
| "/dev/sdb" | |
| ], | |
| "hint": "fdisk ์ธํฐ๋ํฐ๋ธ ๋ชจ๋์์ `n`(์ ํํฐ์ ), `p`(์ฃผ), `1`(๋ฒํธ), Enter(๊ธฐ๋ณธ ์์), `+20G`(ํฌ๊ธฐ), `w`(์ ์ฅ) ์์๋ก ์ ๋ ฅํฉ๋๋ค.", | |
| "explanation": "fdisk๋ MBR ๋ฐฉ์์ผ๋ก ์ต๋ 2TB ๋์คํฌ์ ์ ํฉํฉ๋๋ค. ๋ณ๊ฒฝ ์ฌํญ์ `w`๋ฅผ ์ ๋ ฅํด์ผ ์ค์ ๋์คํฌ์ ๊ธฐ๋ก๋ฉ๋๋ค.", | |
| "difficulty": "medium" | |
| }, | |
| { | |
| "id": "linux-lab-46", | |
| "title": "ext4 ํ์ผ์์คํ ์์ฑ", | |
| "task_description": "`/dev/sdb1` ํํฐ์ ์ ext4 ํ์ผ์์คํ ์ ์์ฑํ์ธ์.", | |
| "expected_command": "mkfs.ext4 /dev/sdb1", | |
| "grading_conditions": [ | |
| "mkfs.ext4", | |
| "/dev/sdb1" | |
| ], | |
| "hint": "`mkfs.ext4` ๋๋ `mkfs -t ext4`๋ฅผ ์ฌ์ฉํฉ๋๋ค.", | |
| "explanation": "ํํฐ์ ์์ฑ ํ ํ์ผ์์คํ ์ ๋ง๋ค์ด์ผ ์ค์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค. ํฌ๋งทํ๋ฉด ๊ธฐ์กด ๋ฐ์ดํฐ๊ฐ ์ญ์ ๋๋ฏ๋ก ๋์ ๋๋ฐ์ด์ค๋ฅผ ๋ฐ๋์ ํ์ธํ์ธ์.", | |
| "difficulty": "easy" | |
| }, | |
| { | |
| "id": "linux-lab-47", | |
| "title": "ํ์ผ์์คํ UUID ํ์ธ", | |
| "task_description": "`/dev/sdb1`์ UUID๋ฅผ ํ์ธํ์ธ์.", | |
| "expected_command": "blkid /dev/sdb1", | |
| "grading_conditions": [ | |
| "blkid", | |
| "/dev/sdb1" | |
| ], | |
| "hint": "`blkid`๋ ๋ธ๋ก ๋๋ฐ์ด์ค์ UUID์ ํ์ผ์์คํ ์ ํ์ ์ถ๋ ฅํฉ๋๋ค.", | |
| "explanation": "fstab์ ์ฅ์น๋ช ๋์ UUID๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ถํ ์ ๋๋ฐ์ด์ค ์์๊ฐ ๋ฐ๋์ด๋ ์ฌ๋ฐ๋ฅธ ํํฐ์ ์ด ๋ง์ดํธ๋ฉ๋๋ค.", | |
| "difficulty": "easy" | |
| }, | |
| { | |
| "id": "linux-lab-48", | |
| "title": "๊ทธ๋ฃน ์์ฑ ๋ฐ ์ฌ์ฉ์ ์ถ๊ฐ", | |
| "task_description": "`devteam` ๊ทธ๋ฃน์ ๋ง๋ค๊ณ `alice`๋ฅผ ๊ธฐ์กด ๊ทธ๋ฃน์ ์ ์งํ ์ฑ ์ถ๊ฐํ์ธ์.", | |
| "expected_command": "groupadd devteam && usermod -aG devteam alice", | |
| "grading_conditions": [ | |
| "groupadd devteam", | |
| "usermod", | |
| "-aG", | |
| "devteam", | |
| "alice" | |
| ], | |
| "hint": "๊ทธ๋ฃน ์์ฑ์ `groupadd`, ์ฌ์ฉ์๋ฅผ ๋ณด์กฐ ๊ทธ๋ฃน์ ์ถ๊ฐํ ๋๋ `-aG`(append)๋ฅผ ๋ฐ๋์ ์ฌ์ฉํ์ธ์.", | |
| "explanation": "`-a` ์์ด `-G`๋ง ์ฐ๋ฉด alice์ ๊ธฐ์กด ๋ณด์กฐ ๊ทธ๋ฃน์ด ๋ชจ๋ devteam์ผ๋ก ๊ต์ฒด๋ฉ๋๋ค. `-aG`๊ฐ ์์ ํฉ๋๋ค.", | |
| "difficulty": "easy" | |
| }, | |
| { | |
| "id": "linux-lab-49", | |
| "title": "์ฒซ ๋ก๊ทธ์ธ ์ ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ ๊ฐ์ ", | |
| "task_description": "์ ์ฌ์ฉ์ `bob`์ด ์ฒซ ๋ก๊ทธ์ธ ์ ๋ฐ๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ณ๊ฒฝํ๋๋ก ์ค์ ํ์ธ์.", | |
| "expected_command": "chage -d 0 bob", | |
| "grading_conditions": [ | |
| "chage", | |
| "-d 0", | |
| "bob" | |
| ], | |
| "hint": "`chage -d 0`์ ๋ง์ง๋ง ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ์ผ์ ์ํฌํฌ๋ก ์ค์ ํด ์ฆ์ ๋ณ๊ฒฝ์ ์๊ตฌํฉ๋๋ค.", | |
| "explanation": "๋ค์ ๋ก๊ทธ์ธ ์ PAM์ด ๋น๋ฐ๋ฒํธ ๋ง๋ฃ๋ฅผ ๊ฐ์งํ๊ณ ์ ๋น๋ฐ๋ฒํธ ์ ๋ ฅ์ ์๊ตฌํฉ๋๋ค. ์ ๊ท ๊ณ์ ๋ฐ๊ธ ์ ํ์ค ๋ณด์ ์ ์ฐจ์ ๋๋ค.", | |
| "difficulty": "easy" | |
| }, | |
| { | |
| "id": "linux-lab-50", | |
| "title": "systemd ์๋น์ค ํ์ผ ์์ฑ ๋ฐ ํ์ฑํ", | |
| "task_description": "`/usr/local/bin/myapp`์ ์คํํ๋ `myapp.service`๋ฅผ ๋ง๋ค๊ณ ๋ถํ ์ ์๋ ์์ํ๋๋ก ํ์ฑํํ์ธ์.", | |
| "expected_command": "systemctl daemon-reload && systemctl enable --now myapp", | |
| "grading_conditions": [ | |
| "systemctl daemon-reload", | |
| "systemctl enable", | |
| "myapp" | |
| ], | |
| "hint": "์ ๋ ํ์ผ์ `/etc/systemd/system/myapp.service`์ ์์ฑํ ๋ค daemon-reload โ enable --now ์์๋ก ์คํํฉ๋๋ค.", | |
| "explanation": "`daemon-reload`๋ ๋ณ๊ฒฝ๋ ์ ๋ ํ์ผ์ systemd๊ฐ ์ธ์ํ๊ฒ ํฉ๋๋ค. `enable --now`๋ ๋ถํ ์ ์๋ ์์ ๋ฑ๋ก๊ณผ ์ฆ์ ์คํ์ ํ ๋ฒ์ ์ฒ๋ฆฌํฉ๋๋ค.", | |
| "difficulty": "medium" | |
| }, | |
| { | |
| "id": "linux-lab-51", | |
| "title": "์ผํ์ฑ ์์ ์์ฝ (at)", | |
| "task_description": "2์๊ฐ ํ์ `/usr/local/bin/backup.sh`๋ฅผ ํ ๋ฒ ์คํํ๋๋ก ์์ฝํ์ธ์.", | |
| "expected_command": "echo '/usr/local/bin/backup.sh' | at now + 2 hours", | |
| "grading_conditions": [ | |
| "at", | |
| "now + 2 hours" | |
| ], | |
| "hint": "`echo '๋ช ๋ น' | at now + 2 hours` ํ์์ ์ฌ์ฉํฉ๋๋ค. `at` ๋ช ๋ น ํ Ctrl+D๋ก๋ ์ ๋ ฅํ ์ ์์ต๋๋ค.", | |
| "explanation": "`at`์ ์ผํ์ฑ ์ค์ผ์ค๋ง ๋๊ตฌ์ ๋๋ค. ๋ฐ๋ณต ์คํ์ด ํ์ํ๋ฉด cron์ ์ฌ์ฉํ์ธ์. ์์ฝ ๋ชฉ๋ก์ `atq`๋ก ํ์ธํฉ๋๋ค.", | |
| "difficulty": "easy" | |
| }, | |
| { | |
| "id": "linux-lab-52", | |
| "title": "Docker ์ปจํ ์ด๋ ์คํ ๋ฐ ํ์ธ", | |
| "task_description": "nginx ์ด๋ฏธ์ง๋ฅผ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์คํํ๊ณ ํธ์คํธ ํฌํธ 8080์ ์ปจํ ์ด๋ ํฌํธ 80์ ์ฐ๊ฒฐํ ๋ค, ์คํ ์ค์ธ ์ปจํ ์ด๋๋ฅผ ํ์ธํ์ธ์.", | |
| "expected_command": "docker run -d -p 8080:80 nginx && docker ps", | |
| "grading_conditions": [ | |
| "docker run", | |
| "-d", | |
| "-p 8080:80", | |
| "nginx", | |
| "docker ps" | |
| ], | |
| "hint": "`-d`๋ ๋ฐฑ๊ทธ๋ผ์ด๋(detach), `-p ํธ์คํธ:์ปจํ ์ด๋`๋ก ํฌํธ๋ฅผ ๋งคํํฉ๋๋ค.", | |
| "explanation": "์ปจํ ์ด๋๊ฐ ์คํ ์ค์ด๋ฉด `docker ps`์์ ํ์ธ๋ฉ๋๋ค. ์ค์ง๋ ์ปจํ ์ด๋๊น์ง ๋ณด๋ ค๋ฉด `docker ps -a`๋ฅผ ์ฌ์ฉํฉ๋๋ค.", | |
| "difficulty": "easy" | |
| }, | |
| { | |
| "id": "linux-lab-53", | |
| "title": "[์๋๋ฆฌ์ค] ์ ๊ท ๋์คํฌ ์ ์ฒด ์ค์ (ํํฐ์ โํฌ๋งทโ๋ง์ดํธโfstab)", | |
| "task_description": "์ ๊ท ๋์คํฌ `/dev/sdb`์ ํํฐ์ ์ ๋ง๋ค๊ณ ext4๋ก ํฌ๋งทํ ๋ค `/data`์ ์๊ตฌ ๋ง์ดํธํ๋ ์ ์ฒด ์ ์ฐจ๋ฅผ ์์ฑํ์ธ์.\n\n๋จ๊ณ:\n1. `/dev/sdb`์ ๋จ์ผ ์ฃผ ํํฐ์ ์์ฑ (fdisk)\n2. `/dev/sdb1`์ ext4 ํ์ผ์์คํ ์์ฑ\n3. `/data` ๋ง์ดํธ ํฌ์ธํธ ์์ฑ\n4. `/dev/sdb1`์ `/data`์ ๋ง์ดํธ\n5. `/etc/fstab`์ UUID ๊ธฐ๋ฐ์ผ๋ก ๋ฑ๋ก ํ `mount -a`๋ก ๊ฒ์ฆ\n\n์ด ๋จ๊ณ ์ค `blkid /dev/sdb1`์ ๋ชฉ์ ์ ์์ ํ์ธ์.", | |
| "expected_command": "fdisk /dev/sdb && mkfs.ext4 /dev/sdb1 && mkdir /data && mount /dev/sdb1 /data && blkid /dev/sdb1", | |
| "grading_conditions": [ | |
| "fdisk /dev/sdb", | |
| "mkfs.ext4 /dev/sdb1", | |
| "mkdir /data", | |
| "mount /dev/sdb1 /data", | |
| "blkid /dev/sdb1" | |
| ], | |
| "hint": "์์๊ฐ ์ค์ํฉ๋๋ค: fdisk โ mkfs โ mkdir โ mount โ blkid(UUID ํ์ธ) โ fstab ๋ฑ๋ก โ mount -a", | |
| "explanation": "์ด ํ๋ฆ์ LFCS ์ค๊ธฐ์์ ๊ฐ์ฅ ์์ฃผ ๋์ค๋ ๋ณตํฉ ์คํ ๋ฆฌ์ง ์๋๋ฆฌ์ค์ ๋๋ค. fstab์ UUID๋ฅผ ์ฐ๋ ์ด์ ๋ ์ฌ๋ถํ ์ ๋๋ฐ์ด์ค ์์๊ฐ ๋ฐ๋์ด๋ ์ฌ๋ฐ๋ฅธ ํํฐ์ ์ด ๋ง์ดํธ๋๋๋ก ๋ณด์ฅํ๊ธฐ ์ํด์์ ๋๋ค.", | |
| "difficulty": "hard" | |
| }, | |
| { | |
| "id": "linux-lab-54", | |
| "title": "[์๋๋ฆฌ์ค] LVM ๋ณผ๋ฅจ ํ์ฅ (PVโVG ํ์ฅโLV ํ์ฅโFS ํ์ฅ)", | |
| "task_description": "๊ธฐ์กด VG `vg_data`์ ์ PV `/dev/sdc`๋ฅผ ์ถ๊ฐํ๊ณ , LV `lv_app`์ 10GB ๋๋ฆฐ ๋ค ext4 ํ์ผ์์คํ ๊น์ง ํ์ฅํ์ธ์.\n\n๋จ๊ณ:\n1. `/dev/sdc`๋ฅผ PV๋ก ์ด๊ธฐํ\n2. `/dev/sdc`๋ฅผ `vg_data`์ ์ถ๊ฐ\n3. `lv_app`์ 10GB ์ฆ๊ฐ\n4. ext4 ํ์ผ์์คํ ํ์ฅ (๋ฌด์ค๋จ)", | |
| "expected_command": "pvcreate /dev/sdc && vgextend vg_data /dev/sdc && lvextend -L +10G /dev/vg_data/lv_app && resize2fs /dev/vg_data/lv_app", | |
| "grading_conditions": [ | |
| "pvcreate /dev/sdc", | |
| "vgextend vg_data /dev/sdc", | |
| "lvextend", | |
| "+10G", | |
| "/dev/vg_data/lv_app", | |
| "resize2fs" | |
| ], | |
| "hint": "LVM ํ์ฅ ์์: pvcreate โ vgextend โ lvextend โ resize2fs. `lvextend -r` ์ต์ ์ผ๋ก resize2fs๋ฅผ ํตํฉํ ์๋ ์์ต๋๋ค.", | |
| "explanation": "LVM์ ๊ฐ์ ์ ์๋น์ค ์ค๋จ ์์ด ๋ณผ๋ฅจ์ ํ์ฅํ ์ ์๋ค๋ ์ ์ ๋๋ค. `lvextend -r`์ LV ํ์ฅ๊ณผ ํ์ผ์์คํ ํ์ฅ์ ํ ๋ฒ์ ์ฒ๋ฆฌํฉ๋๋ค.", | |
| "difficulty": "hard" | |
| }, | |
| { | |
| "id": "linux-lab-55", | |
| "title": "[์๋๋ฆฌ์ค] ํ ๊ณต์ ๋๋ ํฐ๋ฆฌ ๋ณด์ ์ค์ (๊ทธ๋ฃน+SGID+ACL)", | |
| "task_description": "๊ฐ๋ฐํ ๊ณต์ ๋๋ ํฐ๋ฆฌ `/srv/devteam`์ ์ค์ ํ์ธ์.\n\n์๊ตฌ์ฌํญ:\n1. `devteam` ๊ทธ๋ฃน ์์ฑ\n2. `alice`์ `bob`์ `devteam`์ ์ถ๊ฐ\n3. `/srv/devteam` ์์ ๊ทธ๋ฃน์ `devteam`์ผ๋ก ์ค์ \n4. ๊ทธ๋ฃน์ rwx ๊ถํ ๋ถ์ฌ, ๊ธฐํ ์ฌ์ฉ์๋ ์ ๊ทผ ๋ถ๊ฐ\n5. ์๋ก ์์ฑ๋๋ ํ์ผ๋ ์๋์ผ๋ก `devteam` ์์ ๊ฐ ๋๋๋ก SGID ์ค์ \n6. ์ค์ง `alice`์๊ฒ๋ง ACL๋ก ์ถ๊ฐ ์คํ ๊ถํ ๋ถ์ฌ", | |
| "expected_command": "groupadd devteam && usermod -aG devteam alice && usermod -aG devteam bob && chgrp devteam /srv/devteam && chmod 2770 /srv/devteam && setfacl -m u:alice:rwx /srv/devteam", | |
| "grading_conditions": [ | |
| "groupadd devteam", | |
| "usermod -aG devteam alice", | |
| "usermod -aG devteam bob", | |
| "chgrp devteam", | |
| "chmod 2770", | |
| "setfacl -m u:alice" | |
| ], | |
| "hint": "SGID ๋นํธ๋ chmod ์์ 2๋ฅผ ๋ถ์ ๋๋ค(์: 2770). ACL์ ๊ธฐ๋ณธ ๊ถํ๊ณผ ๋ ๋ฆฝ์ ์ผ๋ก ๋์ํฉ๋๋ค.", | |
| "explanation": "2770 = SGID(2) + ์์ ์rwx(7) + ๊ทธ๋ฃนrwx(7) + ๊ธฐํ์์(0). SGID๊ฐ ์์ผ๋ฉด ํด๋น ๋๋ ํฐ๋ฆฌ์์ ์์ฑ๋ ํ์ผ์ด ์๋์ผ๋ก ๋ถ๋ชจ ๋๋ ํฐ๋ฆฌ์ ๊ทธ๋ฃน์ ์์ํฉ๋๋ค.", | |
| "difficulty": "hard" | |
| }, | |
| { | |
| "id": "linux-lab-56", | |
| "title": "[์๋๋ฆฌ์ค] ์ปค์คํ systemd ์๋น์ค ๋ฑ๋ก ๋ฐ ๋ณด์ ๊ฐํ", | |
| "task_description": "`/opt/myapp/run.sh` ์คํฌ๋ฆฝํธ๋ฅผ systemd ์๋น์ค๋ก ๋ฑ๋กํ์ธ์.\n\n์๊ตฌ์ฌํญ:\n1. `/etc/systemd/system/myapp.service` ํ์ผ ์์ฑ\n2. ์ ์ฉ ์์คํ ๊ณ์ `myapp`์ผ๋ก ์คํ (๋ก๊ทธ์ธ ๋ถ๊ฐ)\n3. ๋คํธ์ํฌ ์ค๋น ํ ์์ (`After=network.target`)\n4. ์คํจ ์ ์๋ ์ฌ์์\n5. ๋ถํ ์ ์๋ ์์ ์ค์ \n\n์์ฑ ํ ์ฆ์ ์์๊น์ง ์๋ฃํ์ธ์.", | |
| "expected_command": "useradd -r -s /sbin/nologin myapp && systemctl daemon-reload && systemctl enable --now myapp", | |
| "grading_conditions": [ | |
| "useradd -r", | |
| "-s /sbin/nologin myapp", | |
| "systemctl daemon-reload", | |
| "systemctl enable", | |
| "myapp" | |
| ], | |
| "hint": "์์คํ ์๋น์ค ๊ณ์ ์ `useradd -r`(์์คํ ๊ณ์ )๊ณผ `-s /sbin/nologin`(๋ก๊ทธ์ธ ์ฐจ๋จ)์ผ๋ก ์์ฑํฉ๋๋ค. ์ ๋ ํ์ผ ์์ฑ ํ daemon-reload ํ์.", | |
| "explanation": "์ด์ ํ๊ฒฝ์์ ์๋น์ค๋ ์ ์ฉ ์ต์ ๊ถํ ๊ณ์ ์ผ๋ก ์คํํ๋ ๊ฒ์ด ๋ณด์ ๋ชจ๋ฒ ์ฌ๋ก์ ๋๋ค. `-r` ํ๋๊ทธ๋ ์์คํ ๊ณ์ ์ฉ ๋ฎ์ UID๋ฅผ ๋ถ์ฌํฉ๋๋ค.", | |
| "difficulty": "hard" | |
| }, | |
| { | |
| "id": "linux-lab-57", | |
| "title": "[์๋๋ฆฌ์ค] SSH ๋ณด์ ๊ฐํ (ํค ์ธ์ฆ ์ ํ + ๋น๋ฐ๋ฒํธ ์ฐจ๋จ)", | |
| "task_description": "์๋ฒ SSH๋ฅผ ํค ๊ธฐ๋ฐ ์ธ์ฆ์ผ๋ก ์ ํํ๊ณ ๋น๋ฐ๋ฒํธ ๋ก๊ทธ์ธ์ ์ฐจ๋จํ์ธ์.\n\n๋จ๊ณ:\n1. ๋ก์ปฌ์์ ED25519 ํค ์ ์์ฑ\n2. ๊ณต๊ฐ ํค๋ฅผ ์๋ฒ `alice` ๊ณ์ ์ ๋ณต์ฌ (`ssh-copy-id`)\n3. `/etc/ssh/sshd_config`์์:\n - `PasswordAuthentication no`\n - `PermitRootLogin prohibit-password`\n4. sshd ์ฌ์์ ์ ์ค์ ๋ฌธ๋ฒ ๊ฒ์ฆ\n5. sshd ์ฌ์์", | |
| "expected_command": "ssh-keygen -t ed25519 && ssh-copy-id alice@server && sshd -t && systemctl restart sshd", | |
| "grading_conditions": [ | |
| "ssh-keygen -t ed25519", | |
| "ssh-copy-id", | |
| "sshd -t", | |
| "systemctl restart sshd" | |
| ], | |
| "hint": "`sshd -t`๋ ์ค์ ํ์ผ ๋ฌธ๋ฒ์ ๊ฒ์ฆํฉ๋๋ค. ์ฌ์์ ์ ์ ๋ฐ๋์ ์คํํด ์ ๊ธ ๋ฐฉ์ง.", | |
| "explanation": "๋น๋ฐ๋ฒํธ ์ธ์ฆ์ ๋๊ธฐ ์ ํค ์ธ์ฆ์ด ์๋ํ๋์ง ๋ฐ๋์ ํ์ธํด์ผ ํฉ๋๋ค. `sshd -t` ์คํจ ์ ์ฌ์์ํ๋ฉด ์๋ฒ์ ์ ์ ๋ถ๊ฐ ์ํ๊ฐ ๋ ์ ์์ต๋๋ค.", | |
| "difficulty": "hard" | |
| }, | |
| { | |
| "id": "linux-lab-58", | |
| "title": "[์๋๋ฆฌ์ค] ๋ธ๋ฃจํธํฌ์ค IP ํ์ง ํ ๋ฐฉํ๋ฒฝ ์ฐจ๋จ", | |
| "task_description": "`/var/log/auth.log`๋ฅผ ๋ถ์ํด SSH ๋ก๊ทธ์ธ ์คํจ IP๋ฅผ ์ฐพ๊ณ ufw๋ก ์ฐจ๋จํ์ธ์.\n\n๋จ๊ณ:\n1. auth.log์์ 'Failed' ํฌํจ ์ค์ IP(ํ๋ 11)๋ฅผ ์ถ์ถ\n2. ํ์ ๊ธฐ์ค ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ\n3. ์์ IP๋ฅผ ufw deny๋ก ์ฐจ๋จ\n4. ufw ๊ท์น ํ์ธ", | |
| "expected_command": "grep 'Failed' /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -rn | head -5", | |
| "grading_conditions": [ | |
| "grep 'Failed' /var/log/auth.log", | |
| "awk", | |
| "sort", | |
| "uniq -c", | |
| "sort -rn" | |
| ], | |
| "hint": "grepโawkโsortโuniq -cโsort -rn ํ์ดํ๋ผ์ธ์ผ๋ก IP๋ณ ์คํจ ํ์๋ฅผ ์ง๊ณํฉ๋๋ค.", | |
| "explanation": "์ด ํ์ดํ๋ผ์ธ์ ๋ณด์ ๋ถ์์ ๊ธฐ๋ณธ ํจํด์ ๋๋ค. ํ์ง๋ IP๋ `ufw deny from 1.2.3.4`๋ก ์ฐจ๋จํฉ๋๋ค. fail2ban์ด ์ด ๊ณผ์ ์ ์๋ํํฉ๋๋ค.", | |
| "difficulty": "hard" | |
| }, | |
| { | |
| "id": "linux-lab-59", | |
| "title": "[์๋๋ฆฌ์ค] Docker ์ปจํ ์ด๋ ์น ์๋ฒ ๋ฐฐํฌ ๋ฐ ๋ก๊ทธ ํ์ธ", | |
| "task_description": "nginx ์ปจํ ์ด๋๋ฅผ ๋ฐฐํฌํ๊ณ ์ด์ ์ํ๋ฅผ ๊ฒ์ฆํ์ธ์.\n\n๋จ๊ณ:\n1. nginx:latest ์ด๋ฏธ์ง pull\n2. ์ด๋ฆ `webserver`, ํธ์คํธ 8080โ์ปจํ ์ด๋ 80, ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์คํ\n3. ์ปจํ ์ด๋ ์คํ ์ํ ํ์ธ\n4. `curl localhost:8080`์ผ๋ก ์๋ต ํ์ธ\n5. ์ปจํ ์ด๋ ๋ก๊ทธ ๋ง์ง๋ง 20์ค ํ์ธ", | |
| "expected_command": "docker pull nginx:latest && docker run -d -p 8080:80 --name webserver nginx && docker ps && curl localhost:8080 && docker logs --tail 20 webserver", | |
| "grading_conditions": [ | |
| "docker pull nginx", | |
| "docker run -d -p 8080:80 --name webserver nginx", | |
| "docker ps", | |
| "curl localhost:8080", | |
| "docker logs --tail 20 webserver" | |
| ], | |
| "hint": "`docker logs --tail N`์ผ๋ก ์ต๊ทผ N์ค๋ง ๋ณผ ์ ์์ต๋๋ค. `--follow`๋ฅผ ์ถ๊ฐํ๋ฉด ์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ๋ฉ๋๋ค.", | |
| "explanation": "์ปจํ ์ด๋ ๋ฐฐํฌ ํ ps๋ก ์ํ, curl๋ก ์๋ต, logs๋ก ๋ด๋ถ ๋์์ ํ์ธํ๋ 3๋จ๊ณ ๊ฒ์ฆ์ ์ด์ ํ๊ฒฝ ํ์ค ์ ์ฐจ์ ๋๋ค.", | |
| "difficulty": "hard" | |
| } | |
| ] |