security
CHAPTER 82 / 84
읽기 약 2분
FUNCTION
argparse로 CLI 도구 만들기
핵심 개념
argparse 심화 — 서브커맨드·타입 검증·자동 도움말. scan/analyze/report 3개 서브커맨드 보안 도구 프레임워크 구축.
본문
argparse 핵심 패턴
| 기능 | API | 용도 |
|---|---|---|
| 위치 인자 | add_argument('url') | 필수 입력 |
| 선택 인자 | add_argument('--port', type=int, default=80) | 옵션 |
| 플래그 | add_argument('--verbose', action='store_true') | on/off |
| 서브커맨드 | add_subparsers(dest='cmd') | 도구 분기 |
| 타입 검증 | type=int / type=float / type=callable | 자동 검증 |
| 선택지 제한 | choices=['fast', 'deep'] | 화이트리스트 |
서브커맨드 보안 도구 프레임워크
#!/usr/bin/env python3
# secscan.py — 통합 보안 점검 CLI 도구
# ⚠️ 본인 소유·허가된 환경에서만 사용하세요.
import argparse
import json
import sys
from pathlib import Path
from typing import Any
from urllib.parse import urlparse
def url_type(value: str) -> str:
"""URL 형식 자동 검증"""
parsed = urlparse(value)
if parsed.scheme not in ('http', 'https'):
raise argparse.ArgumentTypeError(f'http/https URL이 필요합니다: {value}')
if not parsed.hostname:
raise argparse.ArgumentTypeError(f'호스트가 없습니다: {value}')
return value
def positive_int(value: str) -> int:
"""양의 정수 검증"""
n = int(value)
if n <= 0:
raise argparse.ArgumentTypeError(f'양의 정수가 필요합니다: {n}')
return n
# ── 서브커맨드별 핸들러 ──
def cmd_scan(args: argparse.Namespace) -> int:
print(f'[scan] target={args.url} mode={args.mode} timeout={args.timeout}s')
# 실제 스캔 로직은 다음 챕터(CH.29)에서 통합
return 0
def cmd_analyze(args: argparse.Namespace) -> int:
log_path = Path(args.log_file)
if not log_path.is_file():
print(f'[!] 로그 파일 없음: {log_path}', file=sys.stderr)
return 1
print(f'[analyze] file={log_path} format={args.format}')
return 0
def cmd_report(args: argparse.Namespace) -> int:
data = {'tool': 'secscan', 'version': '1.0', 'finding_count': 0}
out = json.dumps(data, indent=2) if args.format == 'json' else str(data)
if args.output:
Path(args.output).write_text(out)
print(f'[report] saved: {args.output}')
else:
print(out)
return 0
# ── 파서 빌드 ──
def build_parser() -> argparse.ArgumentParser:
parser = argparse.ArgumentParser(
prog='secscan',
description='통합 보안 점검 CLI 도구 (교육 목적)',
epilog='⚠️ 본인 소유 또는 허가된 환경에서만 사용하세요.',
)
parser.add_argument('--version', action='version', version='secscan 1.0')
sub = parser.add_subparsers(
dest='cmd',
required=True,
help='하위 명령',
metavar='COMMAND',
)
# scan
p_scan = sub.add_parser('scan', help='URL 스캔')
p_scan.add_argument('url', type=url_type, help='대상 URL')
p_scan.add_argument('--mode', choices=['fast', 'deep'], default='fast')
p_scan.add_argument('--timeout', type=positive_int, default=10)
p_scan.set_defaults(func=cmd_scan)
# analyze
p_an = sub.add_parser('analyze', help='로그 파일 분석')
p_an.add_argument('log_file', help='로그 파일 경로')
p_an.add_argument('--format', choices=['apache', 'nginx', 'auto'], default='auto')
p_an.set_defaults(func=cmd_analyze)
# report
p_rep = sub.add_parser('report', help='결과 리포트 생성')
p_rep.add_argument('--format', choices=['json', 'text'], default='json')
p_rep.add_argument('-o', '--output', help='출력 파일 (생략 시 stdout)')
p_rep.set_defaults(func=cmd_report)
return parser
def main() -> int:
parser = build_parser()
args = parser.parse_args()
return args.func(args)
if __name__ == '__main__':
sys.exit(main())사용 예시
$ secscan --version
secscan 1.0
$ secscan --help
usage: secscan [-h] [--version] COMMAND ...
...
COMMAND 하위 명령
scan URL 스캔
analyze 로그 파일 분석
report 결과 리포트 생성
$ secscan scan https://example.com --mode deep --timeout 20
[scan] target=https://example.com mode=deep timeout=20s
$ secscan scan invalid-url
secscan scan: error: argument url: http/https URL이 필요합니다: invalid-url
$ secscan report --format json -o result.json
[report] saved: result.json도움말 자동 생성 — argparse의 강점
--help/-h자동 노출- 필수 vs 선택 자동 표시
- 기본값 표시 (
default=X→ "(default: X)") - 타입 검증 실패 시 명확한 에러 메시지
- 종료 코드 일관성 (0=성공 / 1=에러 / 2=잘못된 인자)
AI 프롬프트
🤖 AI에게 잘 물어보는 법 — 모델·전략별 프롬프트
Claude
무료: Sonnet 4.6 / Pro $20/mo: Opus 4.6
내가 만들고 싶은 보안 도구의 기능 명세를 줄게. 적합한 argparse 서브커맨드 구조와 각 인자의 type/choices 검증 코드를 만들어줘.
ChatGPT
무료: GPT-5.5 / Plus $20/mo: GPT-5.5 Pro
argparse vs Click vs Typer 3개 라이브러리 비교를 보안 CLI 도구 관점에서 해주고 어떤 경우 어느 것을 선택할지 가이드해줘.
Gemini
무료: 2.5 Flash / Pro $19.99/mo: 3.1 Pro
내 CLI 도구의 모든 인자·서브커맨드를 분석해서 도움말 일관성·타입 검증 누락·UX 문제를 우선순위별 개선안으로 보고해줘.
Grok
무료: Grok 4.1 / SuperGrok $30/mo
2026년 인기 있는 Python 보안 CLI 도구 5개의 argparse 패턴과 사용성 비교를 솔직히 알려줘.
⭐ 이것만 기억하세요
argparse로 CLI 도구 만들기는 이 3가지만 확실히 잡으세요
1.argparse는 보안 도구 인터페이스의 표준 — 자동 도움말·타입 검증·서브커맨드로 사용성과 안전성 확보
2.type=callable로 커스텀 검증 함수를 인자에 바로 적용 — 잘못된 입력은 main 진입 전 차단
3.다음 챕터(CH.29)에서 이 프레임워크에 모듈 1~5 기법 통합 → 완성된 웹 취약점 스캐너 빌드
공유하기
진행도 82 / 84