Dodaj konto demona w OS X

9

Próbuję ręcznie zainstalować demona (Oracle Grid Engine) na moim komputerze i chciałbym, aby działał na osobnym koncie. Jaki jest preferowany sposób korzystania z usług katalogowych w celu dodania konta „systemowego” do komputera lokalnego w systemie OS X? Wiele z nich istnieje w / etc / passwd ( _www, _dovecotitp.), Ale komentarze na górze tego pliku mówią, że nie jest używany z wyjątkiem trybu pojedynczego użytkownika.

Korzystam z wersji 10.6 i nie wymagam żadnego specjalnego zarządzania kontem w sieci. Mam nadzieję na coś prostego - odpowiednik useraddna prawie każdym innym systemie uniksowym.

Tim Yates
źródło

Odpowiedzi:

3

dscl to polecenie, którego szukasz.

Sven
źródło
+1, ponieważ jest to ostateczna odpowiedź. Jeśli chcesz mieć GUI, możesz pobrać Narzędzia Serwera i skierować Workgroup Managera na swój komputer, aby zrobić zasadniczo to samo.
Johnnie Odom
12

Próbowałem skryptu od wartości nominalnej i znalazłem kilka problemów. Zmodyfikowałem go więc dla jednego konkretnego identyfikatora użytkownika i dla OS X Mavericks (10.9).

Odkryłem, że do Mavericksa dodano kilka obcych rekordów - hasło PasswordPolicyOptions i rekord AuthenticationAuthority - które trzeba było usunąć, aby poprawnie naśladować inne konta użytkowników usług wbudowanych (np. _Www).

Dodałem również rekordy Hasło i RealName do konta grupy.

Stworzyłem niestandardowy, jednorazowy skrypt tylko dla konta usługi WSGI. Oto zaktualizowany skrypt.

#! /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

Zauważ, że po uruchomieniu tego skryptu pliki / etc / passwd i / etc / groups nie są aktualizowane. Wierzę, że są aktualizowane przy ponownym uruchomieniu.

Dave Hein
źródło
1
Dzięki Dave. Zaktualizowałem skrypt (poniżej), aby korzystać z odkryć Mavericks i wziąć opcjonalny parametr rzeczywistej nazwy.
par
11

EDYCJA: Zaktualizowano 9 stycznia 2014 dla OS X Mavericks (sugestie Dave'a, dziękuję!)

Napisałem skrypt bash, aby to zrobić. Użyje pierwszego nieużywanego identyfikatora użytkownika, który jest mniejszy lub równy 500 (identyfikatory użytkownika konta demona w systemie Mac OS X), który ma również identyczny nieużywany identyfikator użytkownika.

Zapisz skrypt w pliku o nazwie add_system_user.shi ustaw go jako wykonywalny za pomocą chmod 755 add_system_user.sh.

Powiedzmy, że chcesz dodać użytkownika demona / systemu o nazwie par . Uruchomiłbyś ten skrypt tak:

sudo add_system_user.sh par

_parOtrzymasz wywołanie użytkownika systemu, który jest aliasowany par(nazwa, o którą prosiłeś) i ma pasujący identyfikator uid i gid (np. 499 lub cokolwiek, co znalazł).

Oto skrypt:

#!/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"
par
źródło
Działa to dla mnie dobrze w 10.9. Dzięki!
jbyler,
2

Oto artykuł wyjaśniający, jak używać dscl do utworzenia konta użytkownika.

artykuł osxdaily.com

Joe Block
źródło
Dzięki. Strony podręcznika informują o tym, jakich poleceń można używać, ale nie udzielają żadnej pomocy dotyczącej tego, jakich pól należy użyć i jakie mają być ustawione. Właśnie zamierzałem skopiować konfigurację z innego konta, ale to dobry przykład.
Tim Yates
W przypadku ukrytego konta systemowego spójrz na niektóre istniejące konta systemowe, aby uzyskać lepsze przykłady. Np. dscl /Local/Default -read /Users/_sshd ( Otrzymasz dscl /Local/Default -ls /Userslistę lokalnych kont). Pamiętaj, że nie musisz ustawiać wszystkich atrybutów; GeneratedUID jest generowany losowo, a RecordType to automatyczne metadane. Ponadto większość kont systemowych OS X ma nazwę konta podstawowego rozpoczynającą się od znaku podkreślenia i alias bez tej nazwy dla zapewnienia zgodności z poprzednimi wersjami; Zalecam stosowanie konwencji podkreślania, ale nie przejmuj się zwykłym aliasem, chyba że musisz.
Gordon Davisson
2

Oto wersja skryptu Dave'a, który sprawdza również, czy użytkownik / grupa istnieje przed jego utworzeniem:

#! / bin / sh
# tworzy użytkownika konta usługi podobnego do polecenia adduser w systemie Linux
#, aby wyświetlić istniejących użytkowników i identyfikatory, spróbuj:
# dscl. -readall / Users UniqueID | sort -nk 2

die () {
    echo> i 2 „$ @”
    wyjście 1
}

echo "Zastosowanie: sudo $ 0 nazwa użytkownika uid prawdziwa nazwa"
echo „UWAGI: nazwa użytkownika nie powinna zaczynać się od znaku podkreślenia (zostanie dodany przez skrypt)”
echo „sprawdź, czy użytkownik nie istnieje i uzyskaj bezpłatny numer identyfikacyjny w zakresie 1000”
echo "np. z dscl. -readall / Users UniqueID | sort -nk 2"
Echo ""

# Sprawdź, czy jesteśmy superużytkownikami (tzn. $ (Id -u) wynosi zero)
[`id -u` -eq 0] || die „Ten skrypt musi działać jako root”

[„$ #” -eq 3] || die „Błąd: wymagane 3 argumenty: nazwa użytkownika, identyfikator użytkownika i nazwa rzeczywista”

nazwa użytkownika _ = 1 $
uid _ = 2 USD
prawdziwe imię _ = 3 $
nfs_homedir = "/ var / tmp"
user_shell = "/ usr / bin / false"

echo "Sprawdzanie, czy użytkownik / grupa istnieje: \ c"

check_uuid = `dscl. -search / Users UniqueID $ uid_`
check_upgid = `dscl. -search / Users PrimaryGroupID $ uid_`
check_urn = `dscl. -search / Users RecordName _ $ nazwa_użytkownika_`
check_grn = `dscl. -search / Groups RecordName _ $ nazwa_użytkownika_`


[$ {# check_uuid} = 0] || die "failed! \ nERROR: Non-Unique User UniqueID: \ n \ n`dscl. -read / Users / _ $ username_ RecordName PrimaryGroupID RealName` \ n \ nAby wyświetlić istniejących użytkowników / identyfikatory uruchom: dscl. -readall / Users UniqueID | sort -nk 2 "
[$ {# check_upgid} = 0] || die "failed! \ nERROR: Non-Unique User PrimaryGroupID \ n \ n`dscl. -read / Users / _ $ username_ RecordName PrimaryGroupID RealName` \ n \ nAby wyświetlić istniejących użytkowników / identyfikatory uruchom: dscl. -readall / Users UniqueID | sort -nk 2 "
[$ {# check_urn} = 0] || die "failed! \ nERROR: Non-unique User RecordName \ n \ n`dscl. -read / Users / _ $ username_ RecordName PrimaryGroupID RealName` \ n \ nAby wyświetlić istniejących użytkowników / identyfikatory uruchom: dscl. -readall / Users UniqueID | sort -nk 2 "
[$ {# check_grn} = 0] || die "failed! \ nERROR: Non-Unique Group RecordName \ n \ n`dscl. -read / Groups / _ $ username_ RecordName PrimaryGroupID RealName` \ n \ nAby wyświetlić istniejących użytkowników / identyfikatory uruchom: dscl. -readall / Users UniqueID | sort -nk 2 "

echo „jesteśmy gotowi!”

# echo „Kontynuować (t / n)?”
# czytaj wejście_
# ["$ input_" = "y"] || umrzyj „jak chcesz ...”

echo „Tworzenie użytkownika: \ c”

dscl. -tworzenie / Grupy / _ $ nazwa użytkownika_
dscl. -create / Groups / _ $ nazwa_użytkownika_ PrimaryGroupID $ uid_
dscl. -tworzy / Grupy / _ $ nazwa użytkownika_ Nazwa rekordu _ $ nazwa użytkownika_ $ nazwa użytkownika_
dscl. -create / Groups / _ $ nazwa_użytkownika_ RealName „$ realname_”
dscl. -tworzenie / Grupy / _ $ nazwa użytkownika_ Hasło \ *

dscl. -tworzy / Użytkownicy / _ $ nazwa_użytkownika_
dscl. -create / Users / _ $ username_ NFSHomeDirectory $ nfs_homedir
dscl. -tworzy / Użytkownicy / _ $ nazwa_użytkownika_ Hasło \ *
dscl. -create / Users / _ $ nazwa_użytkownika_ PrimaryGroupID $ uid_
dscl. -create / Users / _ $ nazwa_użytkownika_ RealName „$ realname_”
dscl. -tworzy / Użytkownicy / _ $ nazwa użytkownika_ Nazwa rekordu _ $ nazwa użytkownika_ $ nazwa użytkownika_
dscl. -tworzy / Użytkownicy / _ $ nazwa_użytkownika_ UniqueID $ uid_
dscl. -create / Users / _ $ username_ UserShell $ user_shell
dscl. -delete / Users / _ $ username_ PasswordPolicyOptions
dscl. -delete / Users / _ $ username_ AuthenticationAuthority

echo „gotowe!”

oraz skrypt do usunięcia użytkownika:

#! / bin / sh
# usuń użytkownika usługi podobnego do polecenia Linux userdel, ale pliki pozostaną nienaruszone
#, aby wyświetlić istniejących użytkowników i identyfikatory, spróbuj:
# dscl. -readall / Users UniqueID | sort -nk 2

die () {
    echo> i 2 „$ @”
    wyjście 1
}

# Sprawdź, czy jesteśmy superużytkownikami (tzn. $ (Id -u) wynosi zero)
[`id -u` -eq 0] || die „Ten skrypt musi działać jako root”
[„$ #” -eq 1] || die „Błąd: wymagane są argumenty nazwy użytkownika!”

nazwa użytkownika _ = 1 $

dscl. -delete / Users / $ nazwa_użytkownika_
dscl. -delete / Groups / $ nazwa_użytkownika_

echo „gotowe!”
Alex Popov
źródło
Jesteś magikiem, wielkie dzięki! Działa w systemie macOS 10.13.
Dmitrij Werkhoturow