diff --git a/setup_cups.sh b/setup_cups.sh index 3662471..ca7eecb 100755 --- a/setup_cups.sh +++ b/setup_cups.sh @@ -160,6 +160,254 @@ get_ip() { ip addr show | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | grep -v '127.0.0.1' | head -n1 } +# 获取默认网关 +get_gateway() { + ip route | grep default | awk '{print $3}' | head -n1 +} + +# 获取主网络接口名称 +get_interface() { + ip route | grep default | awk '{print $5}' | head -n1 +} + +# 获取子网掩码(CIDR格式) +get_netmask() { + local iface=$(get_interface) + ip addr show "$iface" | grep -oP 'inet \K[\d.]+/\d+' | head -n1 | cut -d'/' -f2 +} + +# 获取DNS服务器 +get_dns() { + # 尝试从 resolv.conf 获取 + grep -E "^nameserver" /etc/resolv.conf 2>/dev/null | awk '{print $2}' | head -n2 | tr '\n' ' ' +} + +# 配置静态IP +configure_static_ip() { + echo "" + echo -e "${YELLOW}═══════════════════════════════════════════════════════════${NC}" + echo -e "${YELLOW} 配置静态 IP 地址 ${NC}" + echo -e "${YELLOW}═══════════════════════════════════════════════════════════${NC}" + echo "" + + local current_ip=$(get_ip) + local current_gateway=$(get_gateway) + local current_interface=$(get_interface) + local current_netmask=$(get_netmask) + local current_dns=$(get_dns) + + echo -e "${BLUE}当前网络配置:${NC}" + echo " 接口名称: $current_interface" + echo " IP 地址: $current_ip" + echo " 子网掩码: /$current_netmask" + echo " 网关: $current_gateway" + echo " DNS: $current_dns" + echo "" + + # 询问是否使用当前IP + echo -e "${YELLOW}是否将当前 IP ($current_ip) 设置为静态 IP?${NC}" + echo " Y - 使用当前 IP" + echo " N - 手动输入新 IP" + echo "" + read -p "选择 [Y/n]: " use_current < /dev/tty + use_current=${use_current:-Y} + + local static_ip="" + local static_gateway="" + local static_netmask="" + local static_dns="" + + if [[ "$use_current" =~ ^[Yy]$ ]]; then + static_ip="$current_ip" + static_gateway="$current_gateway" + static_netmask="$current_netmask" + static_dns="${current_dns:-8.8.8.8 114.114.114.114}" + else + echo "" + read -p "请输入静态 IP 地址 (如 192.168.1.100): " static_ip < /dev/tty + read -p "请输入子网掩码 (如 24,表示255.255.255.0): " static_netmask < /dev/tty + read -p "请输入网关地址 (如 192.168.1.1): " static_gateway < /dev/tty + read -p "请输入 DNS 服务器 (如 8.8.8.8 114.114.114.114): " static_dns < /dev/tty + + static_netmask=${static_netmask:-24} + static_dns=${static_dns:-"8.8.8.8 114.114.114.114"} + fi + + # 检查是否使用 NetworkManager + if systemctl is-active --quiet NetworkManager 2>/dev/null; then + configure_static_ip_networkmanager "$current_interface" "$static_ip" "$static_netmask" "$static_gateway" "$static_dns" + # 检查是否使用 netplan (Ubuntu 18.04+) + elif [ -d /etc/netplan ]; then + configure_static_ip_netplan "$current_interface" "$static_ip" "$static_netmask" "$static_gateway" "$static_dns" + # 使用传统的 /etc/network/interfaces + else + configure_static_ip_interfaces "$current_interface" "$static_ip" "$static_netmask" "$static_gateway" "$static_dns" + fi +} + +# 使用 NetworkManager 配置静态IP +configure_static_ip_networkmanager() { + local iface=$1 + local ip=$2 + local mask=$3 + local gw=$4 + local dns=$5 + + info "检测到 NetworkManager,使用 nmcli 配置..." + + # 获取连接名称 + 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 + + # 配置静态IP + nmcli con mod "$conn_name" ipv4.method manual + nmcli con mod "$conn_name" ipv4.addresses "$ip/$mask" + nmcli con mod "$conn_name" ipv4.gateway "$gw" + nmcli con mod "$conn_name" ipv4.dns "$dns" + + # 重启连接 + nmcli con down "$conn_name" 2>/dev/null || true + nmcli con up "$conn_name" + + success "NetworkManager 静态 IP 配置完成" +} + +# 使用 netplan 配置静态IP +configure_static_ip_netplan() { + local iface=$1 + local ip=$2 + local mask=$3 + local gw=$4 + local dns=$5 + + info "检测到 netplan,创建静态 IP 配置..." + + # 备份现有配置 + for f in /etc/netplan/*.yaml; do + if [ -f "$f" ]; then + cp "$f" "$f.bak" + info "已备份: $f -> $f.bak" + fi + done + + # 转换DNS格式 + local dns_list="" + for d in $dns; do + dns_list="$dns_list, $d" + done + dns_list=$(echo "$dns_list" | sed 's/^, //') + + # 创建新的netplan配置 + cat > /etc/netplan/01-static-ip.yaml << EOF +# 静态 IP 配置 - 由 CUPS 一键脚本生成 +network: + version: 2 + renderer: networkd + ethernets: + $iface: + dhcp4: no + addresses: + - $ip/$mask + routes: + - to: default + via: $gw + nameservers: + addresses: [$dns_list] +EOF + + # 删除其他可能冲突的配置 + for f in /etc/netplan/*.yaml; do + if [ "$f" != "/etc/netplan/01-static-ip.yaml" ] && [ -f "$f" ]; then + rm -f "$f" + info "移除冲突配置: $f" + fi + done + + # 应用配置 + info "应用 netplan 配置..." + netplan apply + + success "Netplan 静态 IP 配置完成" +} + +# 使用传统 interfaces 文件配置静态IP +configure_static_ip_interfaces() { + local iface=$1 + local ip=$2 + local mask=$3 + local gw=$4 + local dns=$5 + + info "使用传统 /etc/network/interfaces 配置..." + + # 备份原配置 + if [ -f /etc/network/interfaces ]; then + cp /etc/network/interfaces /etc/network/interfaces.bak + info "已备份: /etc/network/interfaces -> /etc/network/interfaces.bak" + fi + + # 将CIDR转换为子网掩码 + local netmask="" + case $mask in + 8) netmask="255.0.0.0" ;; + 16) netmask="255.255.0.0" ;; + 24) netmask="255.255.255.0" ;; + 25) netmask="255.255.255.128" ;; + 26) netmask="255.255.255.192" ;; + 27) netmask="255.255.255.224" ;; + 28) netmask="255.255.255.240" ;; + 29) netmask="255.255.255.248" ;; + 30) netmask="255.255.255.252" ;; + *) netmask="255.255.255.0" ;; + esac + + # 创建新配置 + cat > /etc/network/interfaces << EOF +# 静态 IP 配置 - 由 CUPS 一键脚本生成 +# 备份文件: /etc/network/interfaces.bak + +# 本地回环接口 +auto lo +iface lo inet loopback + +# 主网络接口 - 静态IP +auto $iface +iface $iface inet static + address $ip + netmask $netmask + gateway $gw + dns-nameservers $dns +EOF + + # 重启网络服务 + info "重启网络服务..." + systemctl restart networking 2>/dev/null || /etc/init.d/networking restart 2>/dev/null || true + + success "传统网络配置完成" +} + +# 显示静态IP配置结果 +show_static_ip_result() { + local new_ip=$(get_ip) + local new_gateway=$(get_gateway) + local new_interface=$(get_interface) + + echo "" + echo -e "${GREEN}╔══════════════════════════════════════════════════════════╗${NC}" + echo -e "${GREEN}║ 静态 IP 配置完成! ║${NC}" + echo -e "${GREEN}╚══════════════════════════════════════════════════════════╝${NC}" + echo "" + echo -e " ${BLUE}网络接口:${NC} $new_interface" + echo -e " ${BLUE}静态 IP:${NC} $new_ip" + echo -e " ${BLUE}网关:${NC} $new_gateway" + echo "" + echo -e " ${YELLOW}注意:${NC} IP 地址已固定,重启后不会改变" + echo "" +} + # 显示欢迎信息 show_banner() { clear @@ -421,19 +669,37 @@ main() { change_mirror=${change_mirror:-Y} echo "" + # 询问是否配置静态IP + echo -e "${YELLOW}是否将当前 IP 配置为静态 IP?${NC}" + echo " 推荐:选择 Y,避免 IP 变化导致无法连接打印服务器" + echo " 当前 IP: ${LOCAL_IP}" + echo "" + read -p "配置静态 IP? [Y/n]: " config_static_ip < /dev/tty + config_static_ip=${config_static_ip:-Y} + echo "" + # 确认安装 echo -e "${YELLOW}即将执行以下操作:${NC}" + local step=1 if [[ "$change_mirror" =~ ^[Yy]$ ]]; then - echo " 1. 更换为国内软件源(清华大学)" - echo " 2. 更新系统软件源" - else - echo " 1. 更新系统软件源" + echo " $step. 更换为国内软件源(清华大学)" + ((step++)) fi - echo " 3. 安装 CUPS 和 Avahi" - echo " 4. 安装打印机驱动" - echo " 5. 配置 CUPS 允许局域网访问" - echo " 6. 将当前用户添加到 lpadmin 组" - echo " 7. 启动并设置开机自启" + echo " $step. 更新系统软件源" + ((step++)) + if [[ "$config_static_ip" =~ ^[Yy]$ ]]; then + echo " $step. 配置静态 IP 地址 (${LOCAL_IP})" + ((step++)) + fi + echo " $step. 安装 CUPS 和 Avahi" + ((step++)) + echo " $step. 安装打印机驱动" + ((step++)) + echo " $step. 配置 CUPS 允许局域网访问" + ((step++)) + echo " $step. 将当前用户添加到 lpadmin 组" + ((step++)) + echo " $step. 启动并设置开机自启" echo "" read -p "是否继续? [Y/n]: " confirm < /dev/tty confirm=${confirm:-Y} @@ -457,7 +723,12 @@ main() { apt update success "软件源更新完成" - # 2. 安装 CUPS 和 Avahi + # 3. 配置静态IP(如果选择) + if [[ "$config_static_ip" =~ ^[Yy]$ ]]; then + configure_static_ip + fi + + # 4. 安装 CUPS 和 Avahi info "安装 CUPS 和 Avahi..." apt install -y cups avahi-daemon wget unzip success "CUPS 和 Avahi 安装完成" @@ -515,12 +786,19 @@ main() { systemctl enable avahi-daemon success "Avahi 服务已启动并设置开机自启" + # 更新IP地址(如果配置了静态IP) + LOCAL_IP=$(get_ip) + # 完成提示 echo "" echo -e "${GREEN}╔══════════════════════════════════════════════════════════╗${NC}" echo -e "${GREEN}║ 安装完成! ║${NC}" echo -e "${GREEN}╚══════════════════════════════════════════════════════════╝${NC}" echo "" + if [[ "$config_static_ip" =~ ^[Yy]$ ]]; then + echo -e " ${GREEN}[静态IP]${NC} 已配置,IP 地址固定为: ${LOCAL_IP}" + echo "" + fi echo -e " ${BLUE}CUPS 管理界面:${NC} https://${LOCAL_IP}:631" echo -e " ${BLUE}用户名:${NC} root" echo -e " ${BLUE}密码:${NC} 你的 SSH 密码"