添加静态IP配置功能
- 新增DHCP转静态IP功能,避免IP变动导致无法连接打印服务器 - 支持三种网络配置方式:NetworkManager、Netplan、传统interfaces - 自动检测当前网络配置(IP、网关、子网掩码、DNS) - 用户可选择使用当前IP或手动输入新IP - 配置前自动备份原有网络配置文件 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
298
setup_cups.sh
298
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 密码"
|
||||
|
||||
Reference in New Issue
Block a user