feat: 添加一键共享所有打印机功能

新增 share_all_printers() 函数和菜单选项6,实现:
- 检查 CUPS 服务状态
- 显示所有打印机当前共享状态
- 执行 cupsctl --share-printers 启用全局共享
- 对每台打印机执行 lpadmin -p <name> -o printer-is-shared=true
- 重启 CUPS 和 Avahi 服务

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-12-05 11:52:48 +08:00
parent 0a86ffcb4f
commit 4c8e51e836

View File

@@ -1526,6 +1526,109 @@ uninstall() {
echo ""
}
# 查看当前网络配置状态
show_network_status() {
echo ""
echo -e "${YELLOW}═══════════════════════════════════════════════════════════${NC}"
echo -e "${YELLOW} 当前网络配置状态 ${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 ""
# 检测配置模式
local config_mode="未知"
local config_detail=""
# 检查 NetworkManager
if systemctl is-active --quiet NetworkManager 2>/dev/null; then
local conn_name=$(nmcli -t -f NAME,DEVICE con show --active 2>/dev/null | grep "$current_interface" | cut -d':' -f1)
if [ -n "$conn_name" ]; then
local method=$(nmcli -g ipv4.method con show "$conn_name" 2>/dev/null)
if [ "$method" = "auto" ]; then
config_mode="DHCP (自动获取)"
config_detail="通过 NetworkManager 管理"
elif [ "$method" = "manual" ]; then
config_mode="静态 IP (固定)"
config_detail="通过 NetworkManager 管理"
fi
fi
# 检查 netplan
elif [ -d /etc/netplan ]; then
config_detail="通过 netplan 管理"
local found_config=false
for f in /etc/netplan/*.yaml; do
if [ -f "$f" ]; then
if grep -q "dhcp4: true\|dhcp4: yes" "$f" 2>/dev/null; then
config_mode="DHCP (自动获取)"
found_config=true
break
elif grep -q "dhcp4: false\|dhcp4: no\|addresses:" "$f" 2>/dev/null; then
config_mode="静态 IP (固定)"
found_config=true
break
fi
fi
done
if [ "$found_config" = false ]; then
config_mode="未检测到配置"
fi
# 检查传统 interfaces
elif [ -f /etc/network/interfaces ]; then
config_detail="通过 /etc/network/interfaces 管理"
if grep -q "iface $current_interface inet dhcp" /etc/network/interfaces 2>/dev/null; then
config_mode="DHCP (自动获取)"
elif grep -q "iface $current_interface inet static" /etc/network/interfaces 2>/dev/null; then
config_mode="静态 IP (固定)"
fi
fi
echo -e "${BLUE}配置模式:${NC}"
if [[ "$config_mode" == *"DHCP"* ]]; then
echo -e " 状态: ${GREEN}$config_mode${NC}"
echo -e " 说明: IP 由路由器自动分配,换网络环境会自动适应"
elif [[ "$config_mode" == *"静态"* ]]; then
echo -e " 状态: ${YELLOW}$config_mode${NC}"
echo -e " 说明: IP 已固定,换网络环境可能无法连接!"
else
echo -e " 状态: ${RED}$config_mode${NC}"
fi
echo " $config_detail"
echo ""
# 显示配置文件内容
echo -e "${BLUE}配置文件详情:${NC}"
if [ -d /etc/netplan ]; then
for f in /etc/netplan/*.yaml; do
if [ -f "$f" ]; then
echo " 文件: $f"
echo " ─────────────────────────────────"
sed 's/^/ /' "$f"
echo ""
fi
done
elif [ -f /etc/network/interfaces ]; then
echo " 文件: /etc/network/interfaces"
echo " ─────────────────────────────────"
grep -A 10 "iface $current_interface" /etc/network/interfaces 2>/dev/null | sed 's/^/ /'
echo ""
fi
echo -e "${YELLOW}═══════════════════════════════════════════════════════════${NC}"
}
# 显示帮助
show_help() {
echo "CUPS 打印服务一键配置脚本"
@@ -1538,6 +1641,94 @@ show_help() {
echo ""
}
# 一键共享所有打印机
share_all_printers() {
echo ""
echo -e "${YELLOW}═══════════════════════════════════════════════════════════${NC}"
echo -e "${YELLOW} 一键共享所有打印机 ${NC}"
echo -e "${YELLOW}══<EFBFBD><EFBFBD><EFBFBD>════════════════════════════════════════════════════════${NC}"
echo ""
# 检查CUPS是否运行
if ! systemctl is-active --quiet cups 2>/dev/null; then
error "CUPS 服务未运行,请先安装 CUPS"
return 1
fi
# 获取所有打印机
local printers=$(lpstat -a 2>/dev/null | awk '{print $1}')
if [ -z "$printers" ]; then
warn "未找到任何打印机"
echo "请先在 CUPS 管理界面添加打印机"
return 1
fi
echo -e "${BLUE}检测到以下打印机:${NC}"
echo "$printers" | while read p; do
local shared=$(grep -A 20 "<Printer $p>" /etc/cups/printers.conf 2>/dev/null | grep "Shared" | head -1 | awk '{print $2}')
if [ "$shared" = "Yes" ]; then
echo -e " - $p ${GREEN}(已共享)${NC}"
else
echo -e " - $p ${RED}(未共享)${NC}"
fi
done
echo ""
read -p "是否将所有打印机设置为共享? [Y/n]: " confirm < /dev/tty
confirm=${confirm:-Y}
if [[ ! "$confirm" =~ ^[Yy]$ ]]; then
echo "已取消"
return 0
fi
echo ""
info "启用全局打印机共享..."
cupsctl --share-printers
info "设置各打印机共享..."
echo "$printers" | while read p; do
if [ -n "$p" ]; then
echo " 启用共享: $p"
lpadmin -p "$p" -o printer-is-shared=true
fi
done
info "重启 CUPS 服务..."
systemctl restart cups
# 重启 avahi 以更新广播
if systemctl is-active --quiet avahi-daemon 2>/dev/null; then
systemctl restart avahi-daemon
fi
echo ""
success "所有打印机已设置为共享!"
echo ""
# 显示结果
echo -e "${BLUE}当前打印机共享状态:${NC}"
local all_shared=true
for p in $(lpstat -a 2>/dev/null | awk '{print $1}'); do
local shared=$(grep -A 20 "<Printer $p>" /etc/cups/printers.conf 2>/dev/null | grep "Shared" | head -1 | awk '{print $2}')
if [ "$shared" = "Yes" ]; then
echo -e " - $p ${GREEN}[已共享]${NC}"
else
echo -e " - $p ${RED}[未共享]${NC}"
all_shared=false
fi
done
echo ""
if [ "$all_shared" = true ]; then
local ip=$(get_ip)
echo -e "${GREEN}现在可以从其他设备连接打印机了:${NC}"
echo -e " CUPS 管理界面: http://$ip:631"
echo -e " Windows 添加打印机地址: http://$ip:631/printers/打印机名"
fi
}
# 显示主菜单
show_menu() {
clear
@@ -1554,9 +1745,11 @@ show_menu() {
echo " 2) 卸载 CUPS 打印服务"
echo " 3) 切换为 DHCP 自动获取 IP"
echo " 4) 切换为静态 IP固定当前 IP"
echo " 5) 查看当前网络状态(静态/DHCP"
echo " 6) 一键共享所有打印机"
echo " 0) 退出"
echo ""
read -p " 请输入选项 [1/2/3/4/0]: " choice < /dev/tty
read -p " 请输入选项 [0-6]: " choice < /dev/tty
case "$choice" in
1)
@@ -1580,6 +1773,19 @@ show_menu() {
read -p "按 Enter 返回主菜单..." < /dev/tty
show_menu
;;
5)
show_network_status
echo ""
read -p "按 Enter 返回主菜单..." < /dev/tty
show_menu
;;
6)
check_root
share_all_printers
echo ""
read -p "按 Enter 返回主菜单..." < /dev/tty
show_menu
;;
0)
echo "已退出"
exit 0