OPEN HYPER STEP
← 목록으로 (화이트햇 보안)
SECURITY · 82 / 84
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']화이트리스트

서브커맨드 보안 도구 프레임워크

PYTHON📋 코드 (102줄)
#!/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())

사용 예시

BASH📋 코드 (19줄)
$ 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