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:
208
setup_cups.sh
208
setup_cups.sh
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user