linux - 以非 root 身份创建 Debian 软件包

标签 linux deb

我已经创建了相当多的 deb 文件,这样做没有任何问题,而且它们都运行得很好。但是,如果我想替换用户主目录中的文件,我不确定如何执行此操作。

我尝试创建一个 postinst 将文件从预定义位置 rsync 到主目录,但由于 postinst 文件以 root 身份运行(由于 debian 安装程序以 root 身份运行),因此它被发送到 root 主目录而不是用户的主目录....

以下是 deb 文件内容的示例:

Debian Directory ---> Control File ----> Postint File

usr/share/desktop (directory with files inside)

postinst 文件具有同步命令,可将这些文件发送到用户家中:

#!/bin/sh
rsync -av /usr/share/desktop/ ~/.config/desktop/

问题是它正在将文件发送到 Root/home...而不是默认用户的 home :(

我没有用户的用户名,因为这将在许多具有不同用户的计算机上使用,因此我无法使用sudo -u username

那我该怎么办?如何从 deb 安装中替换用户主目录中的文件?非常感谢任何帮助。

最佳答案

在 Bash 脚本中,~ 指的是当前用户的主目录。软件包安装脚本始终以 root 身份运行,因此这就是“当前用户”在此上下文中的含义。

(您可能会认为软件包安装可能是由运行 susudo 的用户启动的,但在一般情况下,您不能假设情况是这样.)

无论如何,从系统包修改用户文件都显得极其可疑。如果确实有需要,那么一开始就不应该将其作为系统包安装问题来处理。您实际上想要实现什么目标?

您不仅违反了包管理不应干扰用户文件的基本原则,而且还违反了包管理不应干扰用户文件的基本原则。这种安排的结果是该操作只能执行一次:如果用户已经安装了该软件包,则尝试再次安装它不会执行任何操作(至少在卸载之前)。

一种更易于管理和预测的方法似乎是让包提供此功能,但让用户根据需要调用实际的同步(覆盖)脚本。也许您想以某种方式将其挂接到桌面启动脚本中。

话虽如此,sudo 会在 $SUDO_USER 中公开调用用户的身份,因此您可以查找该身份,如果未设置,则会失败。

顺便说一句,包脚本应该与 dash 一起使用,因此您需要避免 bashisms - 例如,更喜欢 $HOME 而不是 ~

关于linux - 以非 root 身份创建 Debian 软件包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35971583/

相关文章:

linux - Debian/Ubuntu 软件包默认安装在 root 中

linux - Google Cloud Compute 上的多个 IP 地址

php - php 中的 chmod 777

c++ - 在 Qt 上使用 CMake 配置 VSCode - 找不到 ui_*.h 文件

c++ - 以编程方式提取 .deb 包

linux - 哪个lib属于deb

packaging - Debian : control file add dependency on the current building version

linux - 尝试使用 NEXT 凭据登录时出错

linux - 根据列排序命令 bash 对制表符分隔文件进行排序

linux - 构建多架构 Debian 软件包的正确方法是什么?