原文链接:「链接」
在企业运维、国产化适配或内网部署场景中,经常有脚本需要部署到多个终端,例如:
拷贝脚本到指定目录
设置执行权限
修改系统配置或写入日志
启用 systemd 服务
注册菜单或创建快捷方式
如果每次都靠 sh install.sh 执行部署脚本,不仅易错、不可管理,还不支持版本控制或卸载清理。更专业的方式:将这些操作封装进 .deb 安装包,用户只需 dpkg -i 即可完成完整部署流程!
一、目标:让脚本操作“自动化安装”而不是“单独执行”
举例:你原来的 install.sh 做了如下事:
pdsyw@pdsyw1024:~/Desktop$ vim install.sh
pdsyw@pdsyw1024:~/Desktop$ cat install.sh
#!/bin/bash
cp myapp.sh /usr/local/bin/myapp
chmod +x /usr/local/bin/myapp
mkdir -p /etc/myapp
cp config.ini /etc/myapp/
echo "Installed successfully."
现在的目标是:将这些步骤融入到 .deb 包中,安装即完成上述部署!
二、目录结构设计(推荐标准)
原 install.sh 操作 | 替代方法 |
cp myapp.sh /usr/... | 包内直接包含目标路径文件 |
chmod +x | 写入 postinst |
mkdir -p + cp | 包含完整 etc 结构或在 postinst 中处理 |
软链接、输出提示 | postinst 中实现 |
卸载时清理文件 | 用 prerm 或 postrm |
pdsyw@pdsyw1024:~/Desktop$ tree myapp
myapp
├── DEBIAN
│ ├── control
│ ├── postinst
│ └── prerm
├── etc
│ └── myapp
│ └── config.ini
└── usr
└── local
└── bin
└── myapp.sh
6 directories, 5 files
三、创建工作目录
pdsyw@pdsyw1024:~/Desktop$ mkdir -p myapp/DEBIAN
pdsyw@pdsyw1024:~/Desktop$ mkdir -p myapp/usr/local/bin
pdsyw@pdsyw1024:~/Desktop$ mkdir -p myapp/etc/myapp
四、control 文件详解
DEBIAN/control 是 .deb 的元信息中心,示例如下:
pdsyw@pdsyw1024:~/Desktop$ vim myapp/DEBIAN/control
pdsyw@pdsyw1024:~/Desktop$ cat myapp/DEBIAN/control
Package: myapp
Version: 1.0.0
Section: utils
Priority: optional
Architecture: all
Maintainer: 运维工具团队 <ops@example.com>
Depends: bash
Description: MyApp 工具脚本
MyApp 是一个自动化工具,安装后可在终端使用 myapp 命令直接运行。
关键字段解释:
字段 | 含义 |
Package | 包名,卸载时使用 |
Version | 版本号 |
Architecture | all 表示无架构依赖(纯脚本) |
Depends | 安装依赖,例如 bash、coreutils |
Description | 第一行简述,第二行开始需缩进一个空格 |
五、postinst:脚本操作迁移入口
路径:DEBIAN/postinst,记得赋予执行权限 chmod +x postinst
这是 .deb 安装完成后自动执行的脚本,可将 install.sh 中的行为搬到这里:
pdsyw@pdsyw1024:~/Desktop$ vim myapp/DEBIAN/postinst
pdsyw@pdsyw1024:~/Desktop$ cat myapp/DEBIAN/postinst
#!/bin/bash
# 设置执行权限
chmod +x /usr/local/bin/myapp.sh
# 创建命令别名(软链接)
ln -sf /usr/local/bin/myapp.sh /usr/local/bin/myapp
# 创建默认配置文件(如果未存在)
if [ ! -f /etc/myapp/config.ini ]; then
cp /etc/myapp/config.ini.default /etc/myapp/config.ini
fi
# 输出提示
echo "MyApp 安装完成,可通过 myapp 命令运行。"
pdsyw@pdsyw1024:~/Desktop$ chmod +x myapp/DEBIAN/postinst
六、卸载清理逻辑(可选)
你还可以定义:
prerm:卸载前执行(适合停止服务)
postrm:卸载后执行(适合删除残留文件)
示例 prerm:
pdsyw@pdsyw1024:~/Desktop$ vim myapp/DEBIAN/prerm
pdsyw@pdsyw1024:~/Desktop$ cat myapp/DEBIAN/prerm
#!/bin/bash
# 删除命令软链接
rm -f /usr/local/bin/myapp
pdsyw@pdsyw1024:~/Desktop$ chmod +x myapp/DEBIAN/prerm
七、编辑myapp.sh
pdsyw@pdsyw1024:~/Desktop$ cp myapp.sh myapp/usr/local/bin/
pdsyw@pdsyw1024:~/Desktop$ cat myapp/usr/local/bin/myapp.sh
#!/bin/bash
echo hello
八、编辑config.ini
pdsyw@pdsyw1024:~/Desktop$ cp config.ini myapp/etc/myapp/
pdsyw@pdsyw1024:~/Desktop$ cat myapp/etc/myapp/config.ini
pdsyw=pdsyw1024
九、一键打包构建
pdsyw@pdsyw1024:~/Desktop$ dpkg-deb -b myapp myapp_1.0.0_all.deb
dpkg-deb: 正在 'myapp_1.0.0_all.deb' 中构建软件包 'myapp'。
pdsyw@pdsyw1024:~/Desktop$ ls -ltr myapp_1.0.0_all.deb
-rw-r--r-- 1 pdsyw pdsyw 1176 7月 8 16:44 myapp_1.0.0_all.deb
十、测试安装卸载流程
pdsyw@pdsyw1024:~/Desktop$ sudo dpkg -i myapp_1.0.0_all.deb
pdsyw@pdsyw1024:~/Desktop$ myapp
hello
pdsyw@pdsyw1024:~/Desktop$ cat /etc/myapp/config.ini
pdsyw=pdsyw1024
pdsyw@pdsyw1024:~/Desktop$ sudo dpkg -P myapp
pdsyw@pdsyw1024:~/Desktop$ myapp
bash: myapp:未找到命令
pdsyw@pdsyw1024:~/Desktop$ ls -ltr /etc/myapp
ls: 无法访问'/etc/myapp': 没有那个文件或目录
十一、进阶建议(可选)
功能 | 方法 |
启用 systemd 服务 | 在 postinst 中运行 systemctl enable |
启用桌面快捷方式 | 安装 .desktop 文件到 /usr/share/applications |
设置文件权限/所有权 | 使用 postinst 中的 chmod 和 chown |
防止重复软链接或配置覆盖 | 判断文件是否存在,避免覆盖 |