四时宝库

程序员的知识宝库

将Shell脚本打包为DEB安装包的完整教程

原文链接:「链接」

在企业运维、国产化适配或内网部署场景中,经常有脚本需要部署到多个终端,例如:

拷贝脚本到指定目录

设置执行权限

修改系统配置或写入日志

启用 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

防止重复软链接或配置覆盖

判断文件是否存在,避免覆盖

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接