【问题标题】:Debian Package Creation postinst as non-rootDebian 软件包创建 postinst 作为非 root
【发布时间】:2026-01-08 01:45:01
【问题描述】:

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

我已尝试制作 postinst 以将文件从预定义位置同步到主目录,但由于 postinst 文件以 root 身份运行(由于 debian 安装程序以 root 身份运行),它被发送到 root 主目录而不是用户的主目录....

这是 deb 文件内容的示例:

Debian 目录 ---> 控制文件 ----> Postint 文件

usr/share/desktop(里面有文件的目录)

postinst 文件具有将这些文件发送到用户主页的同步命令:

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

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

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

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

【问题讨论】:

    标签: linux deb


    【解决方案1】:

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

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

    在任何情况下,从系统包中修改用户文件都显得极为可疑。如果需求是真实的,那么这可能不应该首先作为系统包安装问题来处理。您实际上想要完成什么?

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

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

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

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

    【讨论】:

    • 我正在尝试备份 .config 文件夹中的 Xfce 面板、主题、图标、壁纸和桌面设置文件,以及各种其他设置。将其放入 deb 文件中,以便其他人可以简单地运行 deb 文件并将所有设置“恢复”为原始系统上的所有设置。我知道还有其他方法可以做到这一点,但我必须通过存储库提供这些设置,所以 deb 文件是必须的.​​.....我需要找到一种方法将这些文件恢复到用户主文件夹,无论用户名可能是什么覆盖现有文件。
    • 我已经用 deb 格式完成了大部分工作,一切都很好。问题只是主目录特定文件,当用户安装选定的 deb 文件时,我需要找到一种方法来恢复这些文件。当然,我包含了一个文件将被覆盖的警告,但是如果他单击“是”,它仍然必须执行正确的操作,但事实并非如此。
    • 稍微更新了答案。希望这会有所帮助。
    【解决方案2】:

    我设法找到了一种解决方法,虽然它不是我想要的,但这是我的解决方案,至少现在是这样。

    #!/bin/sh
    #This will move the desktop settings to required folder.
    
    szAnswer=$(zenity --entry --text "Enter your login username\nThis must be entered correctly\n" --entry-text "Enter name of profile to use:")
    xfce4-terminal -e "sudo rsync -av /usr/share/Desktop/ /home/$szAnswer/.config/xfce4/" 
    
    exit 0
    

    换句话说,用户被要求输入他的用户名,文件被复制到该用户的主目录。好处是,如果他确实有多个用户,它将使用正确的用户。缺点是用户名输入错误,甚至拼写错误,都会安装失败。

    但它确实有效,我已经测试过了。如果有人有更好的解决方案,我热切期待您的建议。

    【讨论】:

    • 这要求用户有一个有效的 XFCE 会话,这似乎有点违背脚本的目的。此外,它显然允许恶意用户覆盖其他用户的配置文件。
    • 一种侵入性较小的方法是让对话框简单地在/etc 中设置一个配置文件,并将其留给系统范围的 XFCE 脚本,以便在用户下次登录时删除用户的文件中,然后删除标志文件。
    • 事后才想到,sudo rsync 将创建由目录所有者以外的其他人拥有的文件,这意味着它们基本上不能被您正在写入其目录的用户操作。这是另一个违反基本包卫生的行为,尽管我想它很容易修复(sudo 给给定的用户,或者用chown 修复复制的文件,或者rsync 可以选择转移所有权)。
    最近更新 更多