我已经创建了相当多的 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 身份运行,因此这就是“当前用户”在此上下文中的含义。
(您可能会认为软件包安装可能是由运行 su
或 sudo
的用户启动的,但在一般情况下,您不能假设情况是这样.)
无论如何,从系统包修改用户文件都显得极其可疑。如果确实有需要,那么一开始就不应该将其作为系统包安装问题来处理。您实际上想要实现什么目标?
您不仅违反了包管理不应干扰用户文件的基本原则,而且还违反了包管理不应干扰用户文件的基本原则。这种安排的结果是该操作只能执行一次:如果用户已经安装了该软件包,则尝试再次安装它不会执行任何操作(至少在卸载之前)。
一种更易于管理和预测的方法似乎是让包提供此功能,但让用户根据需要调用实际的同步(覆盖)脚本。也许您想以某种方式将其挂接到桌面启动脚本中。
话虽如此,sudo
会在 $SUDO_USER
中公开调用用户的身份,因此您可以查找该身份,如果未设置,则会失败。
顺便说一句,包脚本应该与 dash
一起使用,因此您需要避免 bashisms - 例如,更喜欢 $HOME
而不是 ~
。
关于linux - 以非 root 身份创建 Debian 软件包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35971583/