[Share Experiences] 打包 deb postinst postrm 两个配置脚本【简单实例*不是很严谨】
Tofloor
poster avatar
酷谷的谷子
deepin
2023-06-16 21:55
Author

打包 deb postinst postrm 两个配置脚本【简单实例*不是很严谨】

postinst 脚本的作用:可以理解为安装(解压)DEB包,后执行的脚本

postrm 脚本的作用:可以理解为卸载deb包后执行的脚本,可以删除一些垃圾文件等

桌面环境的系统显示/home/$USER,

服务器系统最后就显示 /root

目录结构 deb 虚拟目录 /opt/i8520_123 里面有一个文件 在安装后需要通过postinst 复制到指定目录

DEBIAN/postinst

#!/bin/bash
set -e
mkdir -p /tmp/CN-i8520-MILLET
MY_TMP='/tmp/CN-i8520-MILLET'

#----------------------------
# 判断系统是否是服务器,服务器一般不会有桌面文件夹.
# 间接 区分root和用户
#----------------------------
MY_USER_U_NED_R(){
A='/home/*/桌面'
B='/home/*/Desktop'
cd ${A} 2>/dev/null
if [ $? -ne 0 ]; then
   cd ${B} 2>/dev/null
     if [ $? -ne 0 ]; then
       echo "/root"
     else
       MY_USER=$(echo `pwd`)
       echo ${MY_USER%/*}
     fi
else
   MY_USER=$(echo `pwd`)
   echo ${MY_USER%/*}
fi
}
MY_USER_U_NED_R  > ${MY_TMP}/MY_USER_DIR.TXT
#--------------------------------
# 定义用户路径 和用户名
# /home/用户/.config/autostart开机执行起动器文件
#--------------------------------
MY_ROOT_DIR='/root'
MY_USER_DIR=`cat ${MY_TMP}/MY_USER_DIR.TXT`
MY_USER="${MY_USER_DIR##*/}"
MY_CONKY_DIR="${MY_USER_DIR}/.config/autostart"
#--------------------------------
# 在用户下的操作
#--------------------------------
MY_USER_U(){

   if [ ! -d "${MY_CONKY_DIR}" ]
   then
   mkdir -p ${MY_CONKY_DIR}
   #这个脚本是在ROOT执行的所以需要修改权限
   chown ${MY_USER} ${MY_CONKY_DIR}
   chgrp ${MY_USER} ${MY_CONKY_DIR}
   fi
   #+------------------------------
   echo "当前用户路径:${MY_USER_DIR}"
   echo "当前系统用户:${MY_USER}"
   echo "修改${MY_USER_DIR}/123的权限为755"
   echo "123" > ${MY_USER_DIR}/123
   chmod 755 ${MY_USER_DIR}/123
   echo -e "修改文件属性${MY_USER_DIR}/123为"
   echo "[归属]为当前用户:${MY_USER}"
   chown ${MY_USER} ${MY_USER_DIR}/123
   echo "[群组]为当前用户:${MY_USER}"
   chgrp ${MY_USER} ${MY_USER_DIR}/123
   #+------------------------------
   #/tmp/CN-i8520-MILLET
   rm -rf ${MY_TMP}
}
#--------------------------------
# 在root下的操作
#--------------------------------
MY_USER_R(){

   echo ${MY_ROOT_DIR}
   mkdir -p ${MY_USER_DIR}/666
   #+------------------------------
   # /tmp/CN-i8520-MILLET
   rm -rf ${MY_TMP}
   
}
#--------------------------------
# 根据自定义函数 MY_USER_U_NED_R 的输出
# 输出为 /home/用户 就是系统管理员,没有ROOT权限
# 输出为 /root     超级管理员权限,有ROOT权限
#--------------------------------

if [[ ! X${MY_ROOT_DIR} = X${MY_USER_DIR} ]];then
   # 在用户下的操作
   MY_USER_U
else
   # 在root下的操作
   MY_USER_R
fi
exit 0

DEBIAN/postrm

#!/bin/bash
set -e
mkdir -p /tmp/CN-i8520-MILLET
MY_TMP='/tmp/CN-i8520-MILLET'

#----------------------------
# 判断系统是否是服务器,服务器一般不会有桌面文件夹.
# 间接 区分root和用户
#----------------------------
MY_USER_U_NED_R(){
A='/home/*/桌面'
B='/home/*/Desktop'
cd ${A} 2>/dev/null
if [ $? -ne 0 ]; then
   cd ${B} 2>/dev/null
     if [ $? -ne 0 ]; then
       echo "/root"
     else
       MY_USER=$(echo `pwd`)
       echo ${MY_USER%/*}
     fi
else
   MY_USER=$(echo `pwd`)
   echo ${MY_USER%/*}
fi
}
MY_USER_U_NED_R  > ${MY_TMP}/MY_USER_DIR.TXT
#--------------------------------
# 定义用户路径 和用户名
# /home/用户/.config/autostart开机执行起动器文件
#--------------------------------
MY_ROOT_DIR='/root'
MY_USER_DIR=`cat ${MY_TMP}/MY_USER_DIR.TXT`
MY_USER="${MY_USER_DIR##*/}"
MY_CONKY_DIR="${MY_USER_DIR}/.config/autostart"
#--------------------------------
# 在用户下的操作
#--------------------------------
MY_USER_U(){
   
   echo "删除卸载残留"
   rm -rf ${MY_CONKY_DIR}/conkyrcXX.desktop
   rm -rf ${MY_USER_DIR}/.conkyrc
   rm -rf /opt/CN-i8520-MILLET/cn.i8520.conky/wk.txt
   rm -rf /root/.conkyrc
   rm -rf /tmp/URL_LINK

}
#--------------------------------
# 在root下的操作
#--------------------------------
MY_USER_R(){
   
   echo "删除卸载残留"
   rm -rf /etc/profile.d/conky-X
   rm -rf /root/.conkyrc
   rm -rf /opt/CN-i8520-MILLET/cn.i8520.conky/wk.txt
   rm -rf /tmp/URL_LINK

}
#--------------------------------
# 根据自定义函数 MY_USER_U_NED_R 的输出
# 输出为 /home/用户 就是系统管理员,没有ROOT权限
# 输出为 /root     超级管理员权限,有ROOT权限
#--------------------------------

if [[ ! X${MY_ROOT_DIR} = X${MY_USER_DIR} ]];then
   # 在用户下的操作
   if [[ ! -f ${MY_CONKY_DIR}/conkyrcXX.desktop ]];then
       echo "OK"
     else
       MY_USER_U
   fi
else
   # 在root下的操作
   if [[ ! -f /etc/profile.d/conky-X ]];then
       echo "OK"
     else
       MY_USER_R
   fi
fi
exit 0

Reply Favorite View the author
All Replies
阿尼樱奈奈
deepin
2023-06-16 21:56
#1

applaud

Reply View the author
神末shenmo
deepin
Spark-App
Q&A Team
2023-06-16 21:57
#2

你这个找桌面的方式有点费劲啊

试试这样?

#!/bin/bash

if [ "$1" = "remove" ] || [ "$1" = "purge" ];then

echo "清理卸载残留"
for username in `ls /home`  
    do
      echo /home/$username
        if [ -d /home/$username/.deepinwine/Spark-weixin ]
        then
        rm -rf /home/$username/.deepinwine/Spark-weixin
        fi
    done
else
echo "非卸载,跳过清理"
fi
Reply View the author
酷谷的谷子
deepin
2023-06-16 22:26
#3
神末shenmo

你这个找桌面的方式有点费劲啊

试试这样?

#!/bin/bash

if [ "$1" = "remove" ] || [ "$1" = "purge" ];then

echo "清理卸载残留"
for username in `ls /home`  
    do
      echo /home/$username
        if [ -d /home/$username/.deepinwine/Spark-weixin ]
        then
        rm -rf /home/$username/.deepinwine/Spark-weixin
        fi
    done
else
echo "非卸载,跳过清理"
fi

最后面少了一个 fi

Reply View the author
字甲达宾
deepin
2023-06-18 03:49
#4

2点建议:

  1. 文件头,最好改成

    #!/bin/bash

    原因:Ubuntu 系统下,/bin/sh 可能会链接指向 dash 脚本,而不是 shell 或者 bash. 如果是稍微复杂一点的语法,可能 dash 无法正常解析,或输出与期望有差异。

  2. 第二行,可以加一行

set -e

这样运行时,会详细显示具体的指令操作输出。可以参考下其他 DEB 包,一般都会有这一行指令。

Reply View the author