14

Мне дали частично полную спецификацию RPM для сервиса, который мы пишем. Он доходит до создания необходимых каталогов, копирования файлов, установки разрешений и т.д., Но не создает необходимой системной учетной записи, под которой будет работать служба. Мне сказали, что RPM лучше всего позаботиться об этом, поэтому я добавил

Requires(pre): /usr/sbin/useradd

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

Это позволяет создать учетную запись пользователя (и связанную группу), поэтому позже, когда он пытается установить права доступа / права на файлы службы, это также успешно выполняется.

Моя текущая проблема заключается в следующем: а) если учетная запись пользователя уже существует, установка RPM завершится неудачно из-за сбоя useradd (поскольку пользователь уже существует); и б) я не знаю, как rpm -e myservice также удаляет связанных пользователя и группу.

3 ответа3

17

Я на самом деле решил это самостоятельно, посмотрев на другие спецификации RPM, которые делали подобные вещи. Если вы просто хотите добавить пользователя (условно), воспользуйтесь ссылкой Игнасио. Я сделал это:

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 "очищается после себя", но все же предоставляет возможность установки, даже если учетная запись уже существует.

4

Ответ от Coderer хороший, но вторая предварительная команда выдает ошибку на 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, чтобы игнорировать нежелательные эхо.

3

Любой из двух предыдущих ответов готов к работе, так как эти методы удаляют пользователя, если пакет обновляется. Yum устанавливает новый пакет, а затем удаляет старый пакет. Это оставит вас без пользователя. Не круто!

Используйте этот метод вместо:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .