#!/bin/bash
#zach 20260122
# 强制指定bash解释器,避免sh/dash兼容问题
set -uo pipefail  # 去掉-e(避免单步命令失败直接退出,便于精准控制错误)

# ====================== 预置FTP配置(请根据实际情况修改)======================
FTP_IP="192.168.1.1"        # 你的FTP服务器IP
FTP_PORT="21"                # FTP端口
FTP_USER="test"           # FTP用户名
FTP_PASS="123456"       # FTP密码
LOCAL_DOWNLOAD_DIR="."       # 本地下载目录(去掉末尾/,避免lcd语法错误)
# ==============================================================================

# 函数:检查原生ftp是否安装
check_ftp() {
    if ! command -v ftp &> /dev/null; then
        echo "错误:系统未安装原生ftp工具!"
        echo "Debian/Ubuntu: sudo apt update && sudo apt install -y ftp"
        echo "CentOS/RHEL: sudo yum install -y ftp"
        exit 1
    fi
}

# 函数:生成ftp批处理指令文件(展示根目录)
generate_list_cmds() {
    local cmd_file="/tmp/ftp_list_cmds_$$.txt"
    cat > "${cmd_file}" << EOF
user ${FTP_USER} ${FTP_PASS}
cd /
ls -l
quit
EOF
    echo "${cmd_file}"
}

# 函数:展示FTP根目录文件
show_ftp_root_files() {
    echo "===== 正在连接FTP服务器 ${FTP_IP}:${FTP_PORT} ====="
    
    local cmd_file=$(generate_list_cmds)
    # 执行ftp并捕获输出,便于排查
    ftp_output=$(ftp -inv ${FTP_IP} ${FTP_PORT} < "${cmd_file}")
    local exit_code=$?
    rm -f "${cmd_file}"
    
    # 输出FTP执行结果
    echo "${ftp_output}"
    
    if [ ${exit_code} -ne 0 ] || echo "${ftp_output}" | grep -q "530 Login incorrect"; then
        echo "错误:FTP连接/列文件失败!请检查账号密码或IP端口。"
        exit 1
    fi
    echo "===== FTP根目录文件展示完成 =====
"
}

# 函数:交互式下载文件
download_file() {
    read -p "请输入你要下载的文件名(直接回车退出):" filename
    
    if [ -z "${filename}" ]; then
        echo "你选择退出下载,脚本即将结束。"
        exit 0
    fi

    # 生成下载指令文件(修复lcd/get语法)
    local download_cmd_file="/tmp/ftp_download_cmds_$$.txt"
    cat > "${download_cmd_file}" << EOF
user ${FTP_USER} ${FTP_PASS}
cd /
lcd ${LOCAL_DOWNLOAD_DIR}
binary  # 强制二进制模式,避免文件损坏(图片/压缩包必备)
get "${filename}"
quit
EOF

    echo "
===== 正在下载文件:${filename} ====="
    # 捕获下载过程输出,用于判断是否成功
    download_output=$(ftp -inv ${FTP_IP} ${FTP_PORT} < "${download_cmd_file}")
    local exit_code=$?
    rm -f "${download_cmd_file}"
    
    # 输出下载过程
    echo "${download_output}"
    
    # 精准判断下载是否成功(检查关键提示)
    if echo "${download_output}" | grep -qE "226 Transfer complete|150 Opening BINARY mode data connection"; then
        echo "✅ 文件 ${filename} 下载成功!保存路径:${LOCAL_DOWNLOAD_DIR}/${filename}"
    else
        echo "❌ 文件 ${filename} 下载失败!可能原因:文件不存在/文件名错误。"
        exit 1
    fi
}

# 主程序
main() {
    check_ftp
    show_ftp_root_files
    download_file
    echo "
===== 脚本执行完成,已退出FTP连接 ====="
    exit 0
}

# 启动主程序
main