在RPM规范中管理服务帐户


16

对于我们正在编写的服务,我已经获得了部分完整的RPM规范。它可以创建所需的目录,复制文件,设置权限等,但是并不能使服务运行在所需的系统帐户上。有人告诉我,最好由RPM来解决,所以我添加了

Requires(pre): /usr/sbin/useradd

%pre
useradd -r -d /path/to/program -s /bin/false myservice

这样可以成功创建用户帐户(和关联的组),因此稍后尝试对服务的文件设置所有权/权限时,该操作也会成功。

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


//,您是否考虑使用FPM?
弥敦道(Nathan Basanese)2015年

Answers:


18

通过查看其他执行类似功能的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

这样可以确保RPM可以“自行清除”,但是即使该帐户已经存在,它仍然可以进行安装。


13
虽然这个答案,值得一读的音符在Fedora的链接的链接为什么删除用户/组发布的伊格纳西奥是不可取的。
CoverosGene

1
存在UID和GID重用问题(当删除的用户具有最高的UID / GID时),这使得对userdel的任何自动使用都是一个坏主意。
Bruno9779

1
在CentOS 6.7上,我删除了/ usr / sbin / groupadd命令,因为useradd命令将自行创建组。当一组同名的用户已经存在时,useradd也会退出并出现错误。
Raffael

rpmlint报告“ W:%postun userdel中的危险命令”(如果使用)
Rfraile

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

4

Coderer的响应很好,但是第二个pre命令给我有关Centos 7的错误。必须指定该组。

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

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

%postun
/usr/sbin/userdel myservice

我还添加了重定向到/ dev / null以忽略不需要的回声。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.