#!/bin/bash
# mirror.techlabs.co.kr ISO 퀵 다운로더 스크립트
# 이 스크립트는 techlabs 미러에서 Linux ISO 이미지 다운로드를 도와줍니다
set -e
# 색상 정의
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# curl 명령 확인
if ! command -v curl &> /dev/null; then
echo -e "${RED}오류: curl 명령이 설치되어 있지 않습니다.${NC}"
echo "curl을 설치하려면 다음 명령을 실행하세요:"
echo "Ubuntu/Debian: sudo apt-get update && sudo apt-get install -y curl"
echo "CentOS/RHEL: sudo yum install -y curl"
echo "Alpine: apk add curl"
exit 1
fi
# wget 명령 확인
if ! command -v wget &> /dev/null; then
echo -e "${RED}오류: wget 명령이 설치되어 있지 않습니다.${NC}"
echo "wget을 설치하려면 다음 명령을 실행하세요:"
echo "Ubuntu/Debian: sudo apt-get update && sudo apt-get install -y wget"
echo "CentOS/RHEL: sudo yum install -y wget"
echo "Alpine: apk add wget"
exit 1
fi
# 서버 URL (마지막 슬래시 없이)
MIRROR_URL="https://mirror.techlabs.co.kr"
# 임시 파일
TEMP_DIR="/tmp/iso-downloader"
ISO_LIST_FILE="${TEMP_DIR}/iso-list.txt"
# 디렉토리 생성
mkdir -p "$TEMP_DIR"
# 서버 연결 테스트
echo "서버 연결 테스트 중..."
if ! curl -s -k --head --fail "$MIRROR_URL" > /dev/null; then
echo -e "${RED}오류: 미러 서버에 연결할 수 없습니다. 인터넷 연결을 확인하세요.${NC}"
exit 1
fi
echo "서버 연결 확인 완료"
# SSL 인증서 검증 비활성화 (일부 환경에서 필요)
SSL_OPTS="-k"
clear
echo -e "${BLUE}=================================${NC}"
echo -e "${BLUE}= mirror.techlabs.co.kr ISO 퀵 다운로더 =${NC}"
echo -e "${BLUE}=================================${NC}"
echo -e "${YELLOW}이 스크립트는 techlabs 미러에서 Linux ISO 이미지를 쉽게 다운로드할 수 있도록 도와줍니다${NC}"
echo ""
# 배포판 선택 함수
select_distro() {
echo -e "${GREEN}다운로드할 배포판을 선택하세요:${NC}"
echo "1) Alpine Linux"
echo "2) Kali Linux"
echo "3) Proxmox"
echo "4) OPNsense"
echo "5) Rocky Linux"
echo "6) Ubuntu"
echo "7) 종료"
echo ""
read -p "선택 (1-7): " DISTRO_CHOICE
case $DISTRO_CHOICE in
1) distro="alpine" ;;
2) distro="kali" ;;
3) distro="proxmox" ;;
4) distro="opnsense" ;;
5) distro="rocky" ;;
6) distro="ubuntu" ;;
7) echo -e "${GREEN}프로그램을 종료합니다.${NC}"; exit 0 ;;
*) echo -e "${RED}잘못된 선택입니다. 다시 시도하세요.${NC}"; select_distro ;;
esac
}
# Alpine 버전 선택
select_alpine_version() {
echo -e "${GREEN}Alpine Linux 버전을 선택하세요:${NC}"
# Alpine 버전 가져오기
echo "Alpine 버전 목록 가져오는 중..."
ALPINE_VERSIONS=$(curl -s $SSL_OPTS $MIRROR_URL/alpine/ | grep -oP 'v\d+\.\d+(?=/)' | sort -V)
if [ -z "$ALPINE_VERSIONS" ]; then
echo -e "${RED}Alpine 버전을 가져오지 못했습니다.${NC}"
echo "서버 응답 확인:"
curl -s $SSL_OPTS -I $MIRROR_URL/alpine/
return 1
fi
# Edge 추가
ALPINE_VERSIONS="$ALPINE_VERSIONS edge"
# 버전 출력
i=1
for ver in $ALPINE_VERSIONS; do
echo "$i) $ver"
i=$((i+1))
done
echo "$i) 이전 메뉴"
echo ""
read -p "선택: " VERSION_CHOICE
if [ "$VERSION_CHOICE" -eq "$i" ]; then
return 1
fi
i=1
for ver in $ALPINE_VERSIONS; do
if [ "$i" -eq "$VERSION_CHOICE" ]; then
alpine_version="$ver"
break
fi
i=$((i+1))
done
if [ -z "$alpine_version" ]; then
echo -e "${RED}잘못된 선택입니다.${NC}"
return 1
fi
echo "선택한 버전: $alpine_version"
return 0
}
# Kali 이미지 선택
select_kali_version() {
echo -e "${GREEN}Kali Linux 이미지 유형을 선택하세요:${NC}"
echo "1) 최신 안정 버전"
echo "2) 주간 빌드"
echo "3) 이전 메뉴"
echo ""
read -p "선택: " KALI_TYPE
case $KALI_TYPE in
1) kali_version="current" ;;
2) kali_version="kali-weekly" ;;
3) return 1 ;;
*) echo -e "${RED}잘못된 선택입니다.${NC}"; return 1 ;;
esac
return 0
}
# Proxmox 이미지 선택
select_proxmox_product() {
echo -e "${GREEN}Proxmox 제품을 선택하세요:${NC}"
echo "1) Proxmox Virtual Environment (VE)"
echo "2) Proxmox Backup Server"
echo "3) Proxmox Mail Gateway"
echo "4) 이전 메뉴"
echo ""
read -p "선택: " PROXMOX_PRODUCT
case $PROXMOX_PRODUCT in
1) proxmox_product="ve" ;;
2) proxmox_product="backup-server" ;;
3) proxmox_product="mail-gateway" ;;
4) return 1 ;;
*) echo -e "${RED}잘못된 선택입니다.${NC}"; return 1 ;;
esac
return 0
}
# OPNsense 버전 선택
select_opnsense_version() {
echo -e "${GREEN}OPNsense 버전을 선택하세요:${NC}"
# OPNsense 버전 가져오기
OPNSENSE_VERSIONS=$(curl -s $SSL_OPTS $MIRROR_URL/opnsense/releases/ | grep -oP '\d+\.\d+(?=/)' | sort -V -r)
if [ -z "$OPNSENSE_VERSIONS" ]; then
echo -e "${RED}OPNsense 버전을 가져오지 못했습니다.${NC}"
return 1
fi
# 버전 출력
i=1
for ver in $OPNSENSE_VERSIONS; do
echo "$i) $ver"
i=$((i+1))
done
echo "$i) 이전 메뉴"
echo ""
read -p "선택: " VERSION_CHOICE
if [ "$VERSION_CHOICE" -eq "$i" ]; then
return 1
fi
i=1
for ver in $OPNSENSE_VERSIONS; do
if [ "$i" -eq "$VERSION_CHOICE" ]; then
opnsense_version="$ver"
break
fi
i=$((i+1))
done
if [ -z "$opnsense_version" ]; then
echo -e "${RED}잘못된 선택입니다.${NC}"
return 1
fi
return 0
}
# Rocky Linux 버전 선택
select_rocky_version() {
echo -e "${GREEN}Rocky Linux 버전을 선택하세요:${NC}"
# Rocky 버전 가져오기
ROCKY_VERSIONS=$(curl -s $SSL_OPTS $MIRROR_URL/rocky/ | grep -oP '\d+\.\d+(?=/)' | sort -V -r)
if [ -z "$ROCKY_VERSIONS" ]; then
echo -e "${RED}Rocky Linux 버전을 가져오지 못했습니다.${NC}"
return 1
fi
# 버전 출력
i=1
for ver in $ROCKY_VERSIONS; do
echo "$i) $ver"
i=$((i+1))
done
echo "$i) 이전 메뉴"
echo ""
read -p "선택: " VERSION_CHOICE
if [ "$VERSION_CHOICE" -eq "$i" ]; then
return 1
fi
i=1
for ver in $ROCKY_VERSIONS; do
if [ "$i" -eq "$VERSION_CHOICE" ]; then
rocky_version="$ver"
break
fi
i=$((i+1))
done
if [ -z "$rocky_version" ]; then
echo -e "${RED}잘못된 선택입니다.${NC}"
return 1
fi
return 0
}
# Ubuntu 버전 선택
select_ubuntu_version() {
echo -e "${GREEN}Ubuntu 버전을 선택하세요:${NC}"
# Ubuntu 버전 가져오기
echo "Ubuntu 버전 목록 가져오는 중..."
UBUNTU_VERSIONS=$(curl -s $SSL_OPTS $MIRROR_URL/ubuntu-releases/ | grep -oP '\d+\.\d+(?=/)' | grep -v "^0" | sort -V -r)
if [ -z "$UBUNTU_VERSIONS" ]; then
echo -e "${RED}Ubuntu 버전을 가져오지 못했습니다.${NC}"
echo "서버 응답 확인:"
curl -s $SSL_OPTS -I $MIRROR_URL/ubuntu-releases/
return 1
fi
# 버전 출력
i=1
for ver in $UBUNTU_VERSIONS; do
echo "$i) $ver"
i=$((i+1))
done
echo "$i) 이전 메뉴"
echo ""
read -p "선택: " VERSION_CHOICE
if [ "$VERSION_CHOICE" -eq "$i" ]; then
return 1
fi
i=1
for ver in $UBUNTU_VERSIONS; do
if [ "$i" -eq "$VERSION_CHOICE" ]; then
ubuntu_version="$ver"
break
fi
i=$((i+1))
done
if [ -z "$ubuntu_version" ]; then
echo -e "${RED}잘못된 선택입니다.${NC}"
return 1
fi
return 0
}
# ISO 파일 리스트 가져오기
get_iso_list() {
> "$ISO_LIST_FILE" # 파일 비우기
case $distro in
alpine)
if [ "$alpine_version" = "edge" ]; then
ISO_URL="$MIRROR_URL/alpine/edge/releases/x86_64"
else
ISO_URL="$MIRROR_URL/alpine/$alpine_version/releases/x86_64"
fi
;;
kali)
ISO_URL="$MIRROR_URL/kali-images/$kali_version"
;;
proxmox)
ISO_URL="$MIRROR_URL/proxmox/iso"
GREP_PATTERN="proxmox-[^_]*_"
if [ "$proxmox_product" = "ve" ]; then
GREP_PATTERN="proxmox-ve_"
elif [ "$proxmox_product" = "backup-server" ]; then
GREP_PATTERN="proxmox-backup-server_"
elif [ "$proxmox_product" = "mail-gateway" ]; then
GREP_PATTERN="proxmox-mail-gateway_"
fi
;;
opnsense)
ISO_URL="$MIRROR_URL/opnsense/releases/$opnsense_version"
;;
rocky)
# Rocky는 isos와 live 디렉토리 둘 다 확인
ISO_URL_1="$MIRROR_URL/rocky/$rocky_version/isos/x86_64"
ISO_URL_2="$MIRROR_URL/rocky/$rocky_version/live/x86_64"
echo "Rocky Linux ISO 목록 가져오는 중 ($ISO_URL_1)..."
curl -s $SSL_OPTS "$ISO_URL_1" | grep -oP '(?<=href=")[^"]*\.iso(?=")' > "$ISO_LIST_FILE"
echo "Rocky Linux Live ISO 목록 가져오는 중 ($ISO_URL_2)..."
curl -s $SSL_OPTS "$ISO_URL_2" | grep -oP '(?<=href=")[^"]*\.iso(?=")' >> "$ISO_LIST_FILE" 2>/dev/null || true
# 전체 URL로 변환
if [ -s "$ISO_LIST_FILE" ]; then
sed -i "s|^|$ISO_URL_1/|g" "$ISO_LIST_FILE"
echo "$(wc -l < "$ISO_LIST_FILE")개의 ISO 파일을 찾았습니다."
return 0
else
echo "ISO 파일을 찾을 수 없습니다."
return 1
fi
;;
ubuntu)
ISO_URL="$MIRROR_URL/ubuntu-releases/$ubuntu_version"
;;
esac
echo "$distro ISO 목록 가져오는 중 ($ISO_URL)..."
# ISO 파일 리스트 가져오기
echo "URL: $ISO_URL"
if [ "$distro" = "proxmox" ]; then
curl -s $SSL_OPTS "$ISO_URL" | grep -oP '(?<=href=")[^"]*\.iso(?=")' | grep "$GREP_PATTERN" > "$ISO_LIST_FILE" 2>/dev/null || true
elif [ "$distro" = "ubuntu" ]; then
# Ubuntu 웹페이지는 특별한 구조를 가짐 - HEADER.html에서 링크 추출
curl -s $SSL_OPTS "$ISO_URL" | grep -o '[^<]*' | sed -E 's/.*/\1/g' > "$ISO_LIST_FILE" 2>/dev/null || true
# 파일이 없으면 일반 방식으로 한 번 더 시도
if [ ! -s "$ISO_LIST_FILE" ]; then
curl -s $SSL_OPTS "$ISO_URL" | grep -oP '(?<=href=")[^"]*\.iso(?=")' > "$ISO_LIST_FILE" 2>/dev/null || true
fi
else
# 일반 및 beta 이미지 모두 가져오기
# 심볼릭 링크가 있는 경우 직접 파일 이름 검색
curl -s $SSL_OPTS "$ISO_URL" | grep -E '' | sed -E 's/.*.*/\1/g' > "$ISO_LIST_FILE" 2>/dev/null || true
# 파일이 없으면 일반 방식으로 한 번 더 시도
if [ ! -s "$ISO_LIST_FILE" ]; then
curl -s $SSL_OPTS "$ISO_URL" | grep -oP '(?<=href=")[^"]*\.iso(?=")' > "$ISO_LIST_FILE" 2>/dev/null || true
fi
fi
# OPNsense는 iso.bz2 파일도 포함
if [ "$distro" = "opnsense" ]; then
curl -s $SSL_OPTS "$ISO_URL" | grep -oP '(?<=href=")[^"]*\.iso\.bz2(?=")' > "$ISO_LIST_FILE" 2>/dev/null || true
fi
# 전체 URL로 변환
if [ -s "$ISO_LIST_FILE" ]; then
# 이미 전체 URL이 아닌 파일만 변환
sed -i '/^http/!s|^|$ISO_URL/|g' "$ISO_LIST_FILE"
sed -i "s|\$ISO_URL/|$ISO_URL/|g" "$ISO_LIST_FILE"
# 디버깅을 위해 찾은 파일 목록 출력
echo "$(wc -l < "$ISO_LIST_FILE")개의 ISO 파일을 찾았습니다:"
cat "$ISO_LIST_FILE"
return 0
else
echo "ISO 파일을 찾을 수 없습니다. 서버 응답 확인:"
curl -s $SSL_OPTS -I "$ISO_URL"
return 1
fi
}
# ISO 파일 선택
select_iso() {
if [ ! -s "$ISO_LIST_FILE" ]; then
echo -e "${RED}ISO 파일 목록을 가져오지 못했습니다.${NC}"
return 1
fi
echo -e "${GREEN}다운로드할 ISO 이미지를 선택하세요:${NC}"
# ISO 파일 목록 출력
i=1
while read -r iso; do
filename=$(basename "$iso")
echo "$i) $filename"
i=$((i+1))
done < "$ISO_LIST_FILE"
echo "$i) 이전 메뉴"
echo ""
read -p "선택: " ISO_CHOICE
if [ "$ISO_CHOICE" -eq "$i" ]; then
return 1
fi
if [ "$ISO_CHOICE" -lt 1 ] || [ "$ISO_CHOICE" -ge "$i" ]; then
echo -e "${RED}잘못된 선택입니다.${NC}"
return 1
fi
selected_iso=$(sed -n "${ISO_CHOICE}p" "$ISO_LIST_FILE")
if [ -z "$selected_iso" ]; then
echo -e "${RED}ISO 파일을 선택하지 못했습니다.${NC}"
return 1
fi
return 0
}
# ISO 다운로드
download_iso() {
filename=$(basename "$selected_iso")
echo -e "${BLUE}다운로드할 ISO 파일: $filename${NC}"
echo -e "${YELLOW}다운로드를 시작합니다...${NC}"
# 다운로드 디렉토리 확인
read -p "다운로드 저장 경로 [현재 디렉토리]: " download_path
download_path=${download_path:-"."}
# 디렉토리가 존재하는지 확인
if [ ! -d "$download_path" ]; then
echo -e "${RED}디렉토리가 존재하지 않습니다. 현재 디렉토리에 저장합니다.${NC}"
download_path="."
fi
# 파일 다운로드
echo -e "${GREEN}파일을 $download_path 디렉토리에 다운로드 중...${NC}"
wget --no-check-certificate --show-progress -O "$download_path/$filename" "$selected_iso"
if [ $? -eq 0 ]; then
echo -e "${GREEN}다운로드가 완료되었습니다.${NC}"
echo -e "${BLUE}파일: $download_path/$filename${NC}"
else
echo -e "${RED}다운로드에 실패했습니다.${NC}"
fi
}
# 메인 로직
main() {
echo "프로그램 시작 중..."
while true; do
select_distro
echo "선택된 배포판: $distro"
case $distro in
alpine)
if select_alpine_version; then
if get_iso_list; then
if select_iso; then
download_iso
else
echo -e "${YELLOW}ISO 선택이 취소되었습니다.${NC}"
fi
else
echo -e "${RED}해당 버전의 ISO 파일이 없습니다.${NC}"
fi
else
echo -e "${YELLOW}버전 선택이 취소되었습니다.${NC}"
fi
;;
kali)
if select_kali_version; then
if get_iso_list; then
if select_iso; then
download_iso
else
echo -e "${YELLOW}ISO 선택이 취소되었습니다.${NC}"
fi
else
echo -e "${RED}해당 버전의 ISO 파일이 없습니다.${NC}"
fi
else
echo -e "${YELLOW}버전 선택이 취소되었습니다.${NC}"
fi
;;
proxmox)
if select_proxmox_product; then
if get_iso_list; then
if select_iso; then
download_iso
else
echo -e "${YELLOW}ISO 선택이 취소되었습니다.${NC}"
fi
else
echo -e "${RED}해당 제품의 ISO 파일이 없습니다.${NC}"
fi
else
echo -e "${YELLOW}제품 선택이 취소되었습니다.${NC}"
fi
;;
opnsense)
if select_opnsense_version; then
if get_iso_list; then
if select_iso; then
download_iso
else
echo -e "${YELLOW}ISO 선택이 취소되었습니다.${NC}"
fi
else
echo -e "${RED}해당 버전의 ISO 파일이 없습니다.${NC}"
fi
else
echo -e "${YELLOW}버전 선택이 취소되었습니다.${NC}"
fi
;;
rocky)
if select_rocky_version; then
if get_iso_list; then
if select_iso; then
download_iso
else
echo -e "${YELLOW}ISO 선택이 취소되었습니다.${NC}"
fi
else
echo -e "${RED}해당 버전의 ISO 파일이 없습니다.${NC}"
fi
else
echo -e "${YELLOW}버전 선택이 취소되었습니다.${NC}"
fi
;;
ubuntu)
if select_ubuntu_version; then
if get_iso_list; then
if select_iso; then
download_iso
else
echo -e "${YELLOW}ISO 선택이 취소되었습니다.${NC}"
fi
else
echo -e "${RED}해당 버전의 ISO 파일이 없습니다.${NC}"
fi
else
echo -e "${YELLOW}버전 선택이 취소되었습니다.${NC}"
fi
;;
esac
echo ""
read -p "계속하려면 Enter 키를 누르세요..."
clear
done
}
# 임시 파일 정리
cleanup() {
rm -rf "$TEMP_DIR"
echo -e "${GREEN}종료합니다.${NC}"
}
# 스크립트 시작
main
# 종료 시 정리
trap cleanup EXIT