diff --git a/setup_cups.sh b/setup_cups.sh index 7231780..1423fc3 100755 --- a/setup_cups.sh +++ b/setup_cups.sh @@ -447,6 +447,169 @@ EOF success "传统网络配置完成" } +# 配置 DHCP 自动获取 IP +configure_dhcp() { + echo "" + echo -e "${YELLOW}═══════════════════════════════════════════════════════════${NC}" + echo -e "${YELLOW} 切换为 DHCP 自动获取 IP ${NC}" + echo -e "${YELLOW}═══════════════════════════════════════════════════════════${NC}" + echo "" + + local current_ip=$(get_ip) + local current_interface=$(get_interface) + + echo -e "${BLUE}当前网络配置:${NC}" + echo " 接口名称: $current_interface" + echo " 当前 IP: $current_ip" + echo "" + + echo -e "${YELLOW}警告: 切换为 DHCP 后,IP 地址可能会改变!${NC}" + echo " 请确保你能通过其他方式(如显示器/串口)访问设备" + echo "" + read -p "确定要切��为 DHCP 吗? [y/N]: " confirm < /dev/tty + confirm=${confirm:-N} + + if [[ ! "$confirm" =~ ^[Yy]$ ]]; then + echo "已取消" + return 0 + fi + + # 检查是否使用 NetworkManager + if systemctl is-active --quiet NetworkManager 2>/dev/null; then + configure_dhcp_networkmanager "$current_interface" + # 检查是否使用 netplan (Ubuntu 18.04+) + elif [ -d /etc/netplan ]; then + configure_dhcp_netplan "$current_interface" + # 使用传统的 /etc/network/interfaces + else + configure_dhcp_interfaces "$current_interface" + fi + + show_dhcp_result +} + +# 使用 NetworkManager 配置 DHCP +configure_dhcp_networkmanager() { + local iface=$1 + + info "检测到 NetworkManager,使用 nmcli 配置 DHCP..." + + # 获取连接名称 + local conn_name=$(nmcli -t -f NAME,DEVICE con show --active | grep "$iface" | cut -d':' -f1) + + if [ -z "$conn_name" ]; then + conn_name="$iface" + fi + + # 配置 DHCP + nmcli con mod "$conn_name" ipv4.method auto + nmcli con mod "$conn_name" ipv4.addresses "" + nmcli con mod "$conn_name" ipv4.gateway "" + nmcli con mod "$conn_name" ipv4.dns "" + + # 重启连接 + nmcli con down "$conn_name" 2>/dev/null || true + nmcli con up "$conn_name" + + success "NetworkManager DHCP 配置完成" +} + +# 使用 netplan 配置 DHCP +configure_dhcp_netplan() { + local iface=$1 + + info "检测到 netplan,创建 DHCP 配置..." + + # 备份现有配置 + for f in /etc/netplan/*.yaml; do + if [ -f "$f" ]; then + cp "$f" "$f.bak" + info "已备份: $f -> $f.bak" + fi + done + + # 创建新的 netplan DHCP 配置 + cat > /etc/netplan/01-dhcp.yaml << EOF +# DHCP 配置 - 由 CUPS 一键脚本生成 +network: + version: 2 + renderer: networkd + ethernets: + $iface: + dhcp4: yes +EOF + + # 设置正确的权限 + chmod 600 /etc/netplan/01-dhcp.yaml + + # 删除其他可能冲突的配置 + for f in /etc/netplan/*.yaml; do + if [ "$f" != "/etc/netplan/01-dhcp.yaml" ] && [ -f "$f" ]; then + rm -f "$f" + info "移除冲突配置: $f" + fi + done + + # 应用配置 + info "应用 netplan 配置..." + netplan apply + + success "Netplan DHCP 配置完成" +} + +# 使用传统 interfaces 文件配置 DHCP +configure_dhcp_interfaces() { + local iface=$1 + + info "使用传统 /etc/network/interfaces 配置 DHCP..." + + # 备份原配置 + if [ -f /etc/network/interfaces ]; then + cp /etc/network/interfaces /etc/network/interfaces.bak + info "已备份: /etc/network/interfaces -> /etc/network/interfaces.bak" + fi + + # 创建新配置 + cat > /etc/network/interfaces << EOF +# DHCP 配置 - 由 CUPS 一键脚本生成 +# 备份文件: /etc/network/interfaces.bak + +# 本地回环接口 +auto lo +iface lo inet loopback + +# 主网络接口 - DHCP +auto $iface +iface $iface inet dhcp +EOF + + # 重启网络服务 + info "重启网络服务..." + systemctl restart networking 2>/dev/null || /etc/init.d/networking restart 2>/dev/null || true + + success "传统网络配置完成" +} + +# 显示 DHCP 配置结果 +show_dhcp_result() { + # 等待网络重新配置 + sleep 3 + local new_ip=$(get_ip) + local new_interface=$(get_interface) + + echo "" + echo -e "${GREEN}╔══════════════════════════════════════════════════════════╗${NC}" + echo -e "${GREEN}║ DHCP 配置完成! ║${NC}" + echo -e "${GREEN}╚══════════════════════════════════════════════════════════╝${NC}" + echo "" + echo -e " ${BLUE}网络接口:${NC} $new_interface" + echo -e " ${BLUE}当前 IP:${NC} $new_ip" + echo "" + echo -e " ${YELLOW}注意:${NC} IP 地址现在由 DHCP 服务器自动分配" + echo -e " ${YELLOW} ${NC} 重启后 IP 可能会改变" + echo "" +} + # 显示静态IP配置结果 show_static_ip_result() { local new_ip=$(get_ip) @@ -1266,9 +1429,10 @@ show_menu() { echo "" echo " 1) 安装 CUPS 打印服务" echo " 2) 卸载 CUPS 打印服务" + echo " 3) 切换为 DHCP 自动获取 IP" echo " 0) 退出" echo "" - read -p " 请输入选项 [1/2/0]: " choice < /dev/tty + read -p " 请输入选项 [1/2/3/0]: " choice < /dev/tty case "$choice" in 1) @@ -1277,6 +1441,13 @@ show_menu() { 2) uninstall ;; + 3) + check_root + configure_dhcp + echo "" + read -p "按 Enter 返回主菜单..." < /dev/tty + show_menu + ;; 0) echo "已退出" exit 0