[Share Experiences] deb 打包的一个心得,操作当前用户目录
Tofloor
poster avatar
酷谷的谷子
deepin
2023-06-23 21:30
Author

有新的内容会在笔记里 https://note.youdao.com/s/BBlPM7OJ

更新时间 2023.06.26-1436 版本0.1 脚本类型 SHELL BASH 实际有效脚本5个

上次更新 :2023.06.23-1939 版本0.1 实际有效脚本4个

点这个图标 比较好浏览

QQ截图20230624205819.png


#核心命令
getent passwd ${SUDO_UID:-$(id -u)} | cut -d: -f 6

核心目的就是简化代码量 比较直观

可以认为 定义了三个管道命令脚本文件

MY-Desktop 是输出桌面路径的脚本

MY-USER-PWD 是输出用户名 或用户路径的脚本

CHOWN-CHGRP-CHMOD 是处理权限的脚本

先上一张图片比较直观 这个里使用一个小脚本来解决获取当前用户以及用户路径

2023-06-23 13-12-28 创建的截图.png

这个脚本带一个参数 1

./MY-USER-PWD 1 显示当前登入用户路径
./MY-USER-PWD 显示当前登入用户名

下面是代码 可以保存到一个 文件 我这叫 MY-USER-PWD

加权限 chmod -R 755 MY-USER-PWD

#!/bin/bash
A="$1"
NAME_ID=`getent passwd ${SUDO_UID:-$(id -u)} | cut -d: -f 6`
MY_USER_DIR="${NAME_ID}"
MY_USER_NAME="${MY_USER_DIR##*/}"

MY_USER_DIR_X="1"
if [[ ! X${A} = X${MY_USER_DIR_X} ]];then
   # 输出用户名
   echo "${MY_USER_NAME}"
else
   # 输出用户路径
   echo "${MY_USER_DIR}"  
fi

exit 0

sudo apt install shc 可以使用 shc 制作成二进制文件 shc -r -v -f MY-USER-PWD

MY-USER-PWD.x 复制到usr/bin/改成 MY-USER-PWD

在deb 中怎么调用? 很简单 在虚拟目录文件夹里 usr/bin/MY-USER-PWD

在 DEBIAN 目录下的相应脚本引入即可

MY_USER_DIR=`/usr/bin/MY-USER-PWD 1`
MY_USER_NAME=`/usr/bin/MY-USER-PWD`
echo ${MY_USER_DIR}
echo ${MY_USER_NAME}

修改文件归属

把这个脚本保存到文本文件 取名 CHOWN-CHGRP-CHMOD

加权限 chmod -R 755 CHOWN-CHGRP-CHMOD

存放到在虚拟目录文件夹里 usr/bin/CHOWN-CHGRP-CHMOD

#!/bin/bash
INPUT="$1"
DIR_END_FILE="$2"
NAME_ID=`getent passwd ${SUDO_UID:-$(id -u)} | cut -d: -f 6`
MY_USER_DIR="${NAME_ID}"
MY_USER_NAME="${MY_USER_DIR##*/}"

# 如果输入的第一个参数是数字,就执行 chmod ${INPUT} ${DIR_END_FILE}
# 如果输入的第一个参数不是数字,就进行判断,如果是root就执行 echo "归属 群组 设成 root"
# 如果输入的第一个参数不是数字,也不是果是root就执行 echo "归属 群组 设成 ${MY_USER_NAME}"

if [ "${INPUT}" -gt 0 ] 2>/dev/null ;then 

      echo "附加权限${INPUT}"
      # chmod -R 哪个-R加不加都可
      # 加了-R单独拿来用三种状态都需要加sudo 
      # 还有就是更改root用户和群组需要 sudo
      chmod ${INPUT} ${DIR_END_FILE}

else

     MY_ROOT='root'
     if [[ ! X${INPUT} = X${MY_ROOT} ]];then
       echo "归属 群组 设成 ${MY_USER_NAME}"
       chown ${MY_USER_NAME} ${INPUT}
       chgrp ${MY_USER_NAME} ${INPUT}
     else
       echo "归属 群组 设成 root"
       chown ${MY_ROOT} ${DIR_END_FILE}
       chgrp ${MY_ROOT} ${DIR_END_FILE}
     fi
   
fi

exit 0

在 DEBIAN 目录下的相应脚本引入即可

权限设置对照表 https://note.youdao.com/s/LpqVlRUk

3种用法

# /home/i8520/桌面/MHZXx 可以是文件路径或文件夹路径
# /home/i8520/桌面/MHZXx 必须是绝对路径
#把权限设置成 755 这个可以随意设置
/usr/bin/CHOWN-CHGRP-CHMOD 755 /home/i8520/桌面/MHZXx
/usr/bin/CHOWN-CHGRP-CHMOD 700 /home/i8520/桌面/MHZXx
...
#把归属群组设置成 当前用户
/usr/bin/CHOWN-CHGRP-CHMOD /home/i8520/桌面/MHZXx
#把归属群组设置成 root
/usr/bin/CHOWN-CHGRP-CHMOD root /home/i8520/桌面/MHZXx
#-------------------------------------------------------
配合使用
MY_USER_NAME=`/usr/bin/MY-USER-PWD`
/usr/bin/CHOWN-CHGRP-CHMOD 666 /home/${MY_USER_NAME}/桌面/MHZXx
/usr/bin/CHOWN-CHGRP-CHMOD /home/${MY_USER_NAME}/桌面/MHZXx
/usr/bin/CHOWN-CHGRP-CHMOD root /home/${MY_USER_NAME}/桌面/MHZXx

还有一种情况就是 中文桌面和英文桌面 下面使用一个脚本来结局这个问题

把下面代码保存到 文本文件 取名 MY-Desktop 加权限 chmod -R 755 MY-Desktop

然后保存到虚拟目录 usr/bin/MY-Desktop

#!/bin/bash
#---------------------------------
# 判断桌面文件夹名称是中文还是英文
# 用于复制文件到桌面
#---------------------------------
NAME_ID=`getent passwd ${SUDO_UID:-$(id -u)} | cut -d: -f 6`
MY_USER_DIR="${NAME_ID}"
MY_USER_U_NED_R(){
A="${MY_USER_DIR}/桌面"
B="${MY_USER_DIR}/Desktop"
cd ${A} 2>/dev/null
if [ $? -ne 0 ]; then
   cd ${B} 2>/dev/null
     if [ $? -ne 0 ]; then
       echo "/root/Desktop"
       #echo "ERR"
     else
       MY_USER=$(echo `pwd`)
       echo ${MY_USER}
     fi
else
   MY_USER=$(echo `pwd`)
   echo ${MY_USER}
fi
}
MY_USER_U_NED_R 

最后结合3个脚本来使用

在 DEBIAN 目录下的相应脚本引入即可

MY_Desktop=`MY-Desktop`
MY_USER_DIR=`MY-USER-PWD 1`
MY_USER_NAME=`MY-USER-PWD`
CHOWN-CHGRP-CHMOD

假设一个启动器文件 要从 /opt/data/xxx.desktop 复制到桌面

或者复制到/home/用户名/.config/autostart

注意事项:在 DEBIAN 目录下的脚本都是ROOT权限执行的,

安装完以后一些文件在普通用户下可能没有权限操作,CHOWN-CHGRP-CHMOD 脚本来处理


下面 实际综合来演示

#!/bin/bash
MY_Desktop=`MY-Desktop`
MY_USER_DIR=`MY-USER-PWD 1`
MY_USER_NAME=`MY-USER-PWD`
#-----------------------------------------------------------
#/opt/data/xxx.desktop 复制到桌面
cp -r /opt/data/xxx.desktop ${MY_Desktop}
#-----------------------------------------------------------
#/opt/data/xxx.desktop 复制到/home/用户名/.config/autostart
#不建议使用 /home/${MY_USER_NAME}/.config/autostart 不兼容没有用户的系统
cp -r /opt/data/xxx.desktop ${MY_USER_DIR}/.config/autostart
#-----------------------------------------------------------
# xxx.desktop 添加当前用户设置成 所有着 和 群组
CHOWN-CHGRP-CHMOD ${MY_Desktop}/xxx.desktop
# 755权限
CHOWN-CHGRP-CHMOD 755 ${MY_Desktop}/xxx.desktop

这样代码就比较清楚了

Reply Favorite View the author
All Replies
阿尼樱奈奈
Moderator
2023-06-23 21:42
#1

like

Reply View the author
lizipeng0013
deepin
2023-06-23 21:43
#2

收藏起来备用

Reply View the author
神末shenmo
deepin
Spark-App
2023-06-23 21:54
#3

为什么shc呢?直接用就好了

Reply View the author
青稚
deepin
2023-06-23 22:37
#4

感谢分享。

Reply View the author
梦幻大陆
deepin
2023-06-24 04:14
#5

打包时用 fakeroot 不就可以了吗

Reply View the author
lizipeng0013
deepin
2023-06-24 19:33
#6
sudo -i
echo /home/$SUDO_USER

这样在root下就可以得到当前登录的普通用户主目录路径了

不过也有点小问题,一定要root下才能获取到当前用户名,sudo都不行

Reply View the author
酷谷的谷子
deepin
2023-06-24 21:41
#7
lizipeng0013
sudo -i
echo /home/$SUDO_USER

这样在root下就可以得到当前登录的普通用户主目录路径了

不过也有点小问题,一定要root下才能获取到当前用户名,sudo都不行

getent passwd ${SUDO_UID:-$(id -u)} | cut -d: -f 6

这个可以 普通用户 root 都可以 不用加sudo -i

普通用户显示 /home/用户名

root 显示 /root

Reply View the author
lizipeng0013
deepin
2023-06-24 22:05
#8
酷谷的谷子

getent passwd ${SUDO_UID:-$(id -u)} | cut -d: -f 6

这个可以 普通用户 root 都可以 不用加sudo -i

普通用户显示 /home/用户名

root 显示 /root

deb安装时使用sudo运行后,安装脚本是用root身份运行的,所以这部分的脚本中将 $USER替换为 $SUDO_USER就可以操作用户目录了

如果只是需要在root运行的脚本下操作用户目录,用这种系统提供的变量更简单

我加的sudo -i只是切换为root而已,然后echo测试输出,在脚本中不需要这些

Reply View the author
酷谷的谷子
deepin
2023-06-24 22:19
#9
lizipeng0013

deb安装时使用sudo运行后,安装脚本是用root身份运行的,所以这部分的脚本中将 $USER替换为 $SUDO_USER就可以操作用户目录了

如果只是需要在root运行的脚本下操作用户目录,用这种系统提供的变量更简单

我加的sudo -i只是切换为root而已,然后echo测试输出,在脚本中不需要这些

都可 不过 有点问题 也需要过滤字符串

我还是觉得这个比较好一点 getent passwd ${SUDO_UID:-$(id -u)} | cut -d: -f 6

2023-06-24 14-15-18 创建的截图.png

Reply View the author
vivian_me
deepin testing team
2023-06-25 21:49
#10

不错不错proud

Reply View the author