OS X'te daemon hesabı ekle


9

Makineme manuel olarak bir arka plan programı (Oracle Grid Engine) yüklemeye çalışıyorum ve izole bir hesap altında çalışmasını istiyorum. OS X'teki yerel makineye bir "sistem" hesabı eklemenin Dizin Hizmetleri'ni kullanmasının tercih edilen yolu nedir? Bunların birçoğu / etc / passwd ( _www, _dovecotvb.) Dizininde bulunur , ancak dosyanın üst kısmındaki yorumlar tek kullanıcı modu dışında kullanılmadığını söyler.

Ben 10.6 üzerinde çalışıyorum ve herhangi bir özel ağa bağlı hesap yönetimi gerektirmez. Basit bir şey bekliyorum - useraddneredeyse diğer tüm Unix benzeri işletim sistemlerine eşdeğer .

Yanıtlar:


3

dscl aradığınız komuttur.


+1 çünkü bu kesin cevaptır. Bir GUI istiyorsanız, Sunucu Araçları'nı indirebilir ve temel olarak aynı şeyi yapmak için kendi makinenizde Workgroup Manager'ı işaret edebilirsiniz ..
Johnnie Odom

12

Komut dosyasını par'dan denedim ve birkaç sorun buldum. Bu yüzden belirli bir kullanıcı kimliği ve OS X Mavericks (10.9) için değiştirdim.

Diğer yerleşik hizmet kullanıcı hesaplarını (_www gibi) doğru bir şekilde taklit etmek için kaldırılması gereken Mavericks - PasswordPolicyOptions ve AuthenticationAuthority kaydı altında Kullanıcı hesabına eklenen birkaç gereksiz kayıt olduğunu buldum.

Parola ve GerçekAd kayıtlarını da Grup hesabına ekledim.

Sadece bir WSGI hizmet hesabı için özel bir kerelik bir komut dosyası oluşturdum. İşte güncellenmiş komut dosyası.

#! /bin/bash
#

# Check that we are superuser (i.e. $(id -u) is zero)
if (( $(id -u) ))
then
    echo "This script needs to run as root"
    exit 1
fi

username_=wsgi
uid_=240
realname_="WSGI Daemon"

dscl . -create /Groups/_$username_
dscl . -create /Groups/_$username_ PrimaryGroupID $uid_
dscl . -create /Groups/_$username_ RecordName _$username_ $username_
dscl . -create /Groups/_$username_ RealName $realname_
dscl . -create /Groups/_$username_ Password \*

dscl . -create /Users/_$username_
dscl . -create /Users/_$username_ NFSHomeDirectory /xpt/local/apache2/wsgi/api
dscl . -create /Users/_$username_ Password \*
dscl . -create /Users/_$username_ PrimaryGroupID $uid_
dscl . -create /Users/_$username_ RealName $realname_
dscl . -create /Users/_$username_ RecordName _$username_ $username_
dscl . -create /Users/_$username_ UniqueID $uid_
dscl . -create /Users/_$username_ UserShell /usr/bin/false
dscl . -delete /Users/_$username_ PasswordPolicyOptions
dscl . -delete /Users/_$username_ AuthenticationAuthority

Bu komut dosyasını çalıştırdıktan sonra / etc / passwd ve / etc / groups dosyalarının güncellenmediğini unutmayın. Yeniden başlatıldığında güncellendiğine inanıyorum.


1
Teşekkürler Dave. Mavericks keşiflerinizi kullanmak ve isteğe bağlı bir gerçek ad parametresi almak için betiğimi (aşağıda) güncelledim.
par

12

EDIT: 9 Ocak 2014 OS X Mavericks için güncellendi (Dave önerileri, teşekkürler!)

Bunu yapmak için bir bash senaryosu yazdım. Aynı kullanılmayan gid değeri olan 500'den (Mac OS X'te daemon hesabı uids'i) küçük veya ona eşit olan ilk kullanılmayan uid'i kullanır.

Komut dosyasını adlı bir dosyaya kaydedin add_system_user.shve çalıştırılabilir olarak ayarlayın chmod 755 add_system_user.sh.

Sonra diyelim ki par adlı bir daemon / system kullanıcısı eklemek istiyorsunuz . Bu betiği şu şekilde çalıştırırsınız:

sudo add_system_user.sh par

Ve adı verilen bir sistem kullanıcıyı alacak _pardiğer ad olarak par(eğer istenen ad) ve eşleşen uid ve gid sahiptir (örn 499 ya da her ne buldum).

İşte senaryo:

#!/bin/bash

if (( $(id -u) )) ; then
    echo "This script needs to run as root"
    exit 1
fi

if [[ -z "$1" ]] ; then
    echo "Usage: $(basename $0) [username] [realname (optional)]"
    exit 1
fi

username=$1
realname="${2:-$username}"

echo "Adding daemon user $username with real name \"$realname\""

for (( uid = 500;; --uid )) ; do
    if ! id -u $uid &>/dev/null; then
        if ! dscl /Local/Default -ls Groups gid | grep -q [^0-9]$uid\$ ; then
          dscl /Local/Default -create Groups/_$username
          dscl /Local/Default -create Groups/_$username Password \*
          dscl /Local/Default -create Groups/_$username PrimaryGroupID $uid
          dscl /Local/Default -create Groups/_$username RealName "$realname"
          dscl /Local/Default -create Groups/_$username RecordName _$username $username

          dscl /Local/Default -create Users/_$username
          dscl /Local/Default -create Users/_$username NFSHomeDirectory /var/empty
          dscl /Local/Default -create Users/_$username Password \*
          dscl /Local/Default -create Users/_$username PrimaryGroupID $uid
          dscl /Local/Default -create Users/_$username RealName "$realname"
          dscl /Local/Default -create Users/_$username RecordName _$username $username
          dscl /Local/Default -create Users/_$username UniqueID $uid
          dscl /Local/Default -create Users/_$username UserShell /usr/bin/false

          dscl /Local/Default -delete /Users/_$username AuthenticationAuthority
          dscl /Local/Default -delete /Users/_$username PasswordPolicyOptions
          break
        fi
    fi
done

echo -e "Created system user $username (uid/gid $uid):\n"

dscl /Local/Default -read Users/_$username

echo -e "\nYou can undo the creation of this user by issuing the following commands:\n"
echo "sudo dscl /Local/Default -delete Users/_$username"
echo "sudo dscl /Local/Default -delete Groups/_$username"

Bu benim için iyi çalıştı 10.9. Teşekkürler!
jbyler

2

Bir kullanıcı hesabı oluşturmak için dscl'nin nasıl kullanılacağını açıklayan bir makale.

osxdaily.com makalesi


Teşekkürler. Man sayfaları hangi komutları kullanabileceğinizi söyler, ancak hangi alanları kullanacağınız ve neyi ayarlayacağınız konusunda size yardım etmeyin. Yapılandırmayı başka bir hesaptan kopyalayacaktım, ancak bu iyi bir örnek veriyor.
Tim Yates

Gizli bir sistem hesabı için, daha iyi örnekler için bazı mevcut sistem hesaplarına göz atın. Örneğin dscl /Local/Default -read /Users/_sshd ( dscl /Local/Default -ls /Userssize yerel hesapların bir listesini alırsınız). Tüm özellikleri ayarlamanız gerekmediğini unutmayın; GeneratedUID rastgele oluşturulur ve RecordType otomatik meta verilerdir. Ayrıca, çoğu OS X sistem hesabının alt çizgi ile başlayan bir birincil hesap adı ve geriye dönük uyumluluk için onsuz bir takma adı vardır; Alt çizgi kuralını kullanmanızı öneririm, ancak gerekmedikçe düz takma adla uğraşmayın.
Gordon Davisson

2

Dave'in komut dosyasının, kullanıcı / grubun oluşturmadan önce var olup olmadığını da kontrol eden bir sürümü:

#! / Bin / sh
# Linux adduser komutuna benzer bir hizmet hesabı kullanıcısı oluşturur
# mevcut kullanıcıları ve kimlikleri görüntülemek için şunu deneyin:
# dscl. -readall / Kullanıcılar UniqueID | sırala -nk 2

ölmek () {
    echo> & 2 "$ @"
    çıkış 1
}

echo "Kullanım: sudo $ 0 kullanıcı adı uid realname"
echo "NOTLAR: kullanıcı adı alt çizgiyle başlamamalıdır (komut dosyası tarafından eklenecektir)"
echo "Kullanıcının bulunup bulunmadığını kontrol edin ve 1000 aralığında ücretsiz kimlik numarası alın"
echo "ör. dscl ile. -readall / Users UniqueID | sort -nk 2"
Eko ""

# Süper kullanıcı olduğumuzu kontrol edin (yani $ (id -u) sıfırdır)
[`id -u` -eq 0] || die "Bu komut dosyasının root olarak çalışması gerekiyor"

["$ #" -eq 3] || die "Hata: 3 bağımsız değişken gerekli: kullanıcı adı, kullanıcı kimliği ve gerçek ad"

kullanıcı adı _ = $ 1
uid _ = $ 2
Gerçek_İsim _ = $ 3
nfs_homedir = "/ var / tmp"
user_shell = "/ usr / bin / false"

echo "Kullanıcı / grup olup olmadığını kontrol etme: \ c"

check_uuid = `dscl. -arama / Kullanıcılar UniqueID $ uid_`
check_upgid = `dscl. -arama / Kullanıcılar PrimaryGroupID $ uid_`
check_urn = `dscl. -arama / Kullanıcılar KayıtAdı _ $ kullanıcıadı_`
check_grn = `dscl. -arama / Gruplar KayıtAdı _ $ kullanıcıadı_`


[$ {# check_uuid} = 0] || die "başarısız oldu! \ nERROR: Benzersiz Olmayan Kullanıcı UniqueID: \ n \ n`dscl. -read / Users / _ $ kullanıcıadı_ RecordName PrimaryGroupID RealName` \ n \ nMevcut kullanıcıları / kimlikleri görüntülemek için: dscl. -readall / Users UniqueID | sort -nk 2 "
[$ {# check_upgid} = 0] || die "başarısız oldu! \ nERROR: Benzersiz olmayan Kullanıcı PrimaryGroupID \ n \ n`dscl. -read / Users / _ $ kullanıcıadı_ KayıtAdı PrimaryGroupID GerçekAd` \ n \ nMevcut kullanıcıları / kimlikleri görüntülemek için: dscl. -readall / Users UniqueID | sırala -nk 2 "
[$ {# check_urn} = 0] || die "başarısız oldu! \ nERROR: Benzersiz olmayan Kullanıcı KayıtAdı \ n \ n`dscl. -read / Users / _ $ kullanıcıadı_ KayıtAdı PrimaryGroupID GerçekAd` \ n \ nMevcut kullanıcıları / kimlikleri görüntülemek için: dscl. -readall / Users UniqueID | sırala -nk 2 "
[$ {# check_grn} = 0] || die "başarısız oldu! \ nERROR: Benzersiz olmayan Grup KayıtAdı \ n \ n`dscl. -read / Groups / _ $ kullanıcıadı_ KayıtAdı PrimaryGroupID GerçekAd` \ n \ nMevcut kullanıcıları / kimlikleri görüntülemek için: dscl. -readall / Users UniqueID | sırala -nk 2 "

echo "Gitmeye hazırız!"

# echo "Devam et (mi / n)?"
# okuma girişi_
# ["$ input_" = "y"] || ölmek "istediğin gibi ..."

echo "Kullanıcı Oluşturuluyor: \ c"

dscl. -create / Gruplar / _ $ username_
dscl. -create / Gruplar / _ $ username_ PrimaryGroupID $ uid_
dscl. -create / Gruplar / _ $ username_ RecordName _ $ username_ $ username_
dscl. -create / Gruplar / _ $ username_ GerçekAd "$ realname_"
dscl. -create / Gruplar / _ $ kullanıcıadı_ Parola \ *

dscl. -create / Kullanıcılar / _ $ username_
dscl. -create / Kullanıcılar / _ $ kullanıcıadı_ NFSHomeDirectory $ nfs_homedir
dscl. -create / Kullanıcılar / _ $ kullanıcıadı_ Parola \ *
dscl. -create / Kullanıcılar / _ $ username_ PrimaryGroupID $ uid_
dscl. -create / Kullanıcılar / _ $ username_ GerçekAd "$ realname_"
dscl. -create / Kullanıcılar / _ $ username_ RecordName _ $ username_ $ username_
dscl. -create / Kullanıcılar / _ $ username_ UniqueID $ uid_
dscl. -create / Kullanıcılar / _ $ username_ UserShell $ user_shell
dscl. -delete / Users / _ $ username_ PasswordPolicyOptions
dscl. -delete / Users / _ $ username_ Kimlik Doğrulama Yetkisi

echo "bitti!"

ve kullanıcıyı silmek için bir komut dosyası:

#! / Bin / sh
# delete user kullanıcısı Linux userdel komutuna benzer, ancak dosyaları olduğu gibi bırakıyor
# mevcut kullanıcıları ve kimlikleri görüntülemek için şunu deneyin:
# dscl. -readall / Kullanıcılar UniqueID | sırala -nk 2

ölmek () {
    echo> & 2 "$ @"
    çıkış 1
}

# Süper kullanıcı olduğumuzu kontrol edin (yani $ (id -u) sıfırdır)
[`id -u` -eq 0] || die "Bu komut dosyasının root olarak çalışması gerekiyor"
["$ #" -eq 1] || die "Hata: kullanıcı adı bağımsız değişkenleri gerekli!"

kullanıcı adı _ = $ 1

dscl. -delete / Kullanıcılar / $ username_
dscl. -delete / Gruplar / $ username_

echo "bitti!"

Sen bir sihirbazsın, çok teşekkürler! MacOS 10.13'te çalışır.
Dmitry Verkhoturov
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.