在 RPM 规范中管理服务帐户

Cod*_*rer 17 services user-accounts rpm

我已经获得了我们正在编写的服务的部分完整的 RPM 规范。它可以创建所需的目录、复制文件、设置权限等,但不会创建运行服务所需的系统帐户。有人告诉我 RPM 最好处理这个问题,所以我添加了

Requires(pre): /usr/sbin/useradd

%pre
useradd -r -d /path/to/program -s /bin/false myservice
Run Code Online (Sandbox Code Playgroud)

这成功地创建了用户帐户(和关联的组),因此稍后当它尝试设置服务文件的所有权/权限时,也会成功。

我目前的问题是,a) 如果用户帐户已经存在,RPM 安装失败,因为useradd失败(因为用户已经存在);b) 我不知道如何rpm -e myservice删除关联的用户和组。

Cod*_*rer 19

我实际上是通过查看其他执行类似操作的 RPM 规范独立解决了这个问题。如果您只想添加用户(有条件地),请使用 Ignacio 的链接。我这样做了:

Requires(pre): /usr/sbin/useradd, /usr/bin/getent
Requires(postun): /usr/sbin/userdel

%pre
/usr/bin/getent group myservice || /usr/sbin/groupadd -r myservice
/usr/bin/getent passwd myservice || /usr/sbin/useradd -r -d /path/to/program -s /sbin/nologin myservice

%postun
/usr/sbin/userdel myservice
Run Code Online (Sandbox Code Playgroud)

这可确保 RPM“自行清理”,但即使帐户已存在,仍提供安装能力。

  • 尽管这回答了这个问题,但还是值得阅读 Ignacio 发布的 Fedora 链接 [link](https://fedoraproject.org/wiki/Packaging:UsersAndGroups) 中关于为什么不希望删除用户/组的说明。 (13认同)

小智 5

前两个答案中的任何一个都已准备好生产,因为如果升级包,这些方法将删除用户。Yum 安装新包,然后删除旧包。这将使您没有用户。不酷!

请改用此方法:

%postun
case "$1" in
   0) # This is a yum remove.
      /usr/sbin/userdel myservice
   ;;
   1) # This is a yum upgrade.
      # do nothing
   ;;
 esac
Run Code Online (Sandbox Code Playgroud)