最近用cmake/cpack制作了一个debian包,制作成功了,但是我在电脑上安装(sudo dpkg -i mypcakge.deb),发现一个问题:安装程序的用户和组是root:root。由于某种原因,我的问题应该在特定的用户/组中运行。我不知道该怎么做,你能帮帮我吗?
另外,我不想在安装包后用 chown(..) 修改用户和组。有没有办法在 CMakeLists 中添加一些东西来做到这一点?
它不仅与 CMake 相关,而且通常在使用 debhelper 和/或非标准用户名时。
dh(1)
常用于debian/rules
默认会调用dh_fixperms(1)
,会默认重置所有者和权限。
基本上有三种方法可以保留您想要的所有者/权限:
如果您使用一些标准的 Debian 系统用户/组,您可以跳过或覆盖dh_fixperms(1)
,并且您可以指定要覆盖所有者/组的文件。确保您的包预先依赖于base-passwd
包含所需用户/组的包的正确版本。
你可以在这里覆盖你的debian/rules
喜欢(参见手册页):dh_fixperms(1)
override_dh_fixperms:
dh_fixperms --exclude matchname
Debian 文档有更多信息。
如果您创建自己的用户并且希望文件/目录归他们所有,则需要使用postinst
脚本。在其中,如果用户/组不存在,您首先需要创建它们,然后执行类似的操作
chown myuser:mygroup /var/log/mydir
chmod 0750 /var/log/mydir
或者,您可以使用(也在您的postinst 和 postrm脚本中)dpkg-statoverride(8)来更改您(或其他)文件的所有者、组和权限,如下所示:
for i in /usr/bin/foo /usr/sbin/bar; do
# only do something when no setting exists
if ! dpkg-statoverride --list $i >/dev/null 2>&1; then
#include: debconf processing, question about foo and bar
if [ "$RET" = "true" ] ; then
dpkg-statoverride --update --add sysuser root 4755 $i
fi
fi
done
您还应该处理删除,如下所示:
for i in /usr/bin/foo /usr/sbin/bar; do
if dpkg-statoverride --list $i >/dev/null 2>&1; then
dpkg-statoverride --remove $i
fi
done