Hizmet hesaplarını bir RPM spesifikasyonunda yönetme


16

Yazdığımız bir hizmet için bana kısmen tamamlanmış bir RPM spesifikasyonu verildi. Gerekli dizinleri yapmak, dosyaları kopyalamak, izinleri ayarlamak vb. Kadar sürer, ancak hizmetin altında çalışacağı gerekli sistem hesabını oluşturmaz. RPM'nin bununla ilgilenmesinin en iyisi olduğu söylendi, bu yüzden ekledim

Requires(pre): /usr/sbin/useradd

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

Bu, kullanıcı hesabını (ve ilişkili grubu) oluşturmayı başarır, bu nedenle daha sonra, hizmet dosyalarında sahiplik / izinler ayarlamaya çalıştığında da başarılı olur.

Şu anki sorunum: a) kullanıcı hesabı zaten varsa, RPM yüklemesi başarısız olduğu için useraddbaşarısız olur (kullanıcı zaten var olduğu için); ve b) rpm -e myserviceİlişkili kullanıcı ve grubu nasıl kaldıracağımı bilmiyorum .


//, FPM kullanmayı düşünür müsünüz?
Nathan Basanese

Yanıtlar:


18

Aslında bunu benzer şeyleri yapan diğer RPM özelliklerine bakarak bağımsız olarak çözdüm. Sadece bir kullanıcı eklemek istiyorsanız (koşullu olarak), Ignacio'nun bağlantısını kullanın. Bunu ben yaptım:

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

Bu, RPM'nin "kendinden sonra temizlenmesini" sağlar, ancak hesap zaten mevcut olsa bile yükleme yeteneği sağlar.


13
Her ne kadar bu soruya cevap verse de, Ignacio tarafından kullanıcının / grubun kaldırılmasının neden istenmediği hakkında yayınlanan Fedora bağlantı bağlantısındaki notu okumakta fayda var.
CoverosGene

1
Bir kullanıcı kimliği ve GID yeniden kullanım sorunu var (silinen kullanıcı en yüksek UID / GID değerine sahip olduğunda), userdel'in otomatik kullanımını kötü bir fikir haline getirir.
Bruno9779

1
CentOS 6.7'imde, useradd komutu grubun kendisini oluşturacağından / usr / sbin / groupadd komutunu kaldırdım. Ayrıca, aynı ada sahip bir grup zaten mevcutsa, useradd bir hata ile çıkar.
Raffael

rpmlint raporu "W: tehlikeli-komut-in-% postun userdel" kullanırsanız
Rfraile

5

Önceki iki yanıttan her ikisi de üretime hazırdır, çünkü paket yükseltilirse bu yöntemler kullanıcıyı siler. Yum yeni paketi yükler, ardından eski paketi kaldırır. Bu sizi bir kullanıcı olmadan bırakacaktır. Hiç hoş değil!

Bunun yerine bu yöntemi kullanın:

%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'ın yanıtı iyidir, ancak ikinci ön komut bana Centos 7'de bir hata verir. Grup belirtilmelidir.

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

İstenmeyen ekoları yok saymak için / dev / null öğesine yönlendirmeyi de ekledim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.