从零到发布:手把手教你为你的Shell脚本制作一个专属DEB安装包(Ubuntu/Debian平台)
从零到发布手把手教你为你的Shell脚本制作一个专属DEB安装包Ubuntu/Debian平台当你花费数小时精心打磨出一个实用的Shell脚本——比如能自动清理过期日志的clean_logs.sh或是实时监控服务器资源的system_monitor.sh——接下来最自然的想法就是如何让这个脚本像系统原生命令一样被轻松安装和使用在Debian/Ubuntu生态中DEB包就是答案。本文将带你从脚本功能验证开始逐步构建一个符合Linux标准、支持完整安装/卸载流程的专业级DEB包。1. 前期准备脚本与环境的双重验证1.1 确保脚本的完整性与可移植性在打包前先用这些命令检查脚本基础质量# 检查脚本语法无输出表示正常 bash -n clean_logs.sh # 测试脚本执行权限 chmod x clean_logs.sh ./clean_logs.sh --dry-run常见需要处理的依赖问题路径硬编码将/home/user/改为${HOME}/外部命令依赖用which命令检查awk、sed等工具是否存在# 依赖检查示例 for cmd in awk date find; do if ! which $cmd /dev/null; then echo Missing dependency: $cmd exit 1 fi done1.2 规划文件系统布局专业DEB包的文件布局应当遵循 Filesystem Hierarchy Standard 脚本类型安装路径配置文件路径系统级工具/usr/local/bin//etc/用户级工具${HOME}/.local/bin/${HOME}/.config/服务类脚本/usr/lib/systemd//var/lib/提示使用/usr/local/而非/usr/可以避免与系统包管理器管理的文件冲突2. 构建DEB包核心结构2.1 创建标准目录树mkdir -p mypkg/DEBIAN mypkg/usr/local/bin mypkg/etc cp clean_logs.sh mypkg/usr/local/bin/ touch mypkg/etc/clean_logs.conf2.2 编写control文件mypkg/DEBIAN/controlPackage: clean-logs Version: 1.0.0 Architecture: all Maintainer: Your Name your.emailexample.com Depends: bash, coreutils, findutils Section: utils Priority: optional Description: Automated log cleaning tool Cleans up old log files with configurable retention policies. Supports dry-run mode and custom directory scanning.关键字段解析Depends声明依赖的包用dpkg -S查找命令所属包Architectureall表示纯脚本amd64等表示二进制依赖Section参考 Debian Policy Manual3. 高级打包技巧3.1 添加维护脚本postinst/prerm在DEBIAN/目录下创建这些脚本并赋予执行权限postinst安装后配置#!/bin/bash # 创建日志轮转配置 cat /etc/logrotate.d/clean-logs EOF /var/log/*.log { daily missingok rotate 7 compress delaycompress notifempty } EOF # 设置配置文件权限 chmod 600 /etc/clean_logs.confprerm卸载前清理#!/bin/bash # 移除日志轮转配置 rm -f /etc/logrotate.d/clean-logs # 提示用户手动删除配置文件 echo Note: User config file at /etc/clean_logs.conf was not removed3.2 实现配置文件保留策略通过DEBIAN/conffiles声明需要保留的配置文件/etc/clean_logs.conf这样在包升级时dpkg会智能处理配置文件的合并问题。4. 构建与测试流程4.1 使用dpkg-buildpackage推荐创建标准的Debian源码包结构mkdir -p debian/source echo 1.0 debian/version dh_make --native -s -p clean-logs_1.0.0关键文件说明debian/rules定义构建流程的Makefiledebian/changelog版本更新记录debian/install指定文件安装路径4.2 快速打包与安装测试# 构建DEB包 dpkg-deb --build --root-owner-group mypkg mv mypkg.deb clean-logs_1.0.0_all.deb # 安装测试 sudo dpkg -i clean-logs_1.0.0_all.deb sudo apt-get install -f # 自动解决依赖 # 验证安装 which clean_logs.sh dpkg -L clean-logs # 卸载测试 sudo dpkg -r clean-logs4.3 使用lintian进行质量检查sudo apt install lintian lintian clean-logs_1.0.0_all.deb常见需要修复的警告no-manual-page给脚本添加man手册unstripped-binary-or-object对二进制文件执行stripmaintainer-script-empty删除空的维护脚本5. 进阶自动化打包与版本管理5.1 使用Makefile自动化流程创建Makefile实现一键打包VERSION : 1.0.0 PKGNAME : clean-logs build: mkdir -p build/$(PKGNAME)/DEBIAN cp -r src/* build/$(PKGNAME)/ sed s/{{VERSION}}/$(VERSION)/ control.template build/$(PKGNAME)/DEBIAN/control dpkg-deb --build --root-owner-group build/$(PKGNAME) mv build/$(PKGNAME).deb $(PKGNAME)_$(VERSION)_all.deb clean: rm -rf build *.deb5.2 集成Git版本控制典型的版本管理策略# 更新changelog dch -i # 交互式更新版本信息 # 打标签 git tag -a v1.0.0 -m Release version 1.0.0 # 构建指定版本 git checkout v1.0.0 make build5.3 搭建私有APT仓库使用reprepro创建本地仓库mkdir -p repo/conf cat repo/conf/distributions EOF Origin: Your Organization Label: Local Repo Codename: stable Architectures: amd64 arm64 all Components: main Description: Local package repository EOF # 添加DEB包 reprepro -b repo includedeb stable clean-logs_1.0.0_all.deb # 配置客户端使用 echo deb [trustedyes] http://your-server/path/to/repo stable main | sudo tee /etc/apt/sources.list.d/local.list sudo apt update在项目实践中我们发现最容易被忽视的是卸载时的清理逻辑——很多开发者只记得在postinst里添加配置却忘了在prerm中移除它们。建议在测试阶段专门验证卸载流程是否干净。