Fügen Sie unter OS X ein Dämonkonto hinzu

9

Ich versuche, einen Daemon (Oracle Grid Engine) manuell auf meinem Computer zu installieren, und möchte, dass er unter einem isolierten Konto ausgeführt wird. Was ist die bevorzugte Methode, um mithilfe von Verzeichnisdiensten dem lokalen Computer unter OS X ein "System" -Konto hinzuzufügen? Viele von ihnen sind in / etc / passwd ( _www, _dovecotusw.) vorhanden, aber Kommentare oben in dieser Datei besagen, dass sie nur im Einzelbenutzermodus verwendet werden.

Ich verwende 10.6 und benötige keine spezielle Netzwerkkontenverwaltung. Ich hoffe auf etwas Einfaches - das Äquivalent useraddzu fast jedem anderen Unix-ähnlichen Betriebssystem.

Tim Yates
quelle

Antworten:

3

dscl ist der Befehl, den Sie suchen.

Sven
quelle
+1, weil dies die endgültige Antwort ist. Wenn Sie eine grafische Benutzeroberfläche wünschen, können Sie die Server-Tools herunterladen und auf Workgroup Manager auf Ihrem eigenen Computer zeigen, um im Wesentlichen dasselbe zu tun.
Johnnie Odom
12

Ich habe das Skript von Par ausprobiert und einige Probleme festgestellt. Also habe ich es für eine bestimmte Benutzer-ID und für OS X Mavericks (10.9) geändert.

Ich habe festgestellt, dass dem Benutzerkonto unter Mavericks einige irrelevante Datensätze hinzugefügt wurden - ein PasswordPolicyOptions- und ein AuthenticationAuthority-Datensatz -, die entfernt werden mussten, um andere integrierte Dienstbenutzerkonten (wie _www) korrekt nachzuahmen.

Ich habe auch die Kennwort- und RealName-Datensätze zum Gruppenkonto hinzugefügt.

Ich habe ein benutzerdefiniertes, einmaliges Skript nur für ein WSGI-Dienstkonto erstellt. Hier ist das aktualisierte Skript.

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

Beachten Sie, dass nach dem Ausführen dieses Skripts die Dateien / etc / passwd und / etc / groups nicht aktualisiert werden. Ich glaube, sie werden beim Neustart aktualisiert.

Dave Hein
quelle
1
Danke Dave. Ich habe mein Skript (unten) aktualisiert, um Ihre Mavericks-Entdeckungen zu verwenden und einen optionalen Real-Name-Parameter zu verwenden.
Par
11

EDIT: Aktualisiert am 9. Januar 2014 für OS X Mavericks (Vorschläge von Dave, danke!)

Ich habe dazu ein Bash-Skript geschrieben. Es wird die erste nicht verwendete UID verwendet, die kleiner oder gleich 500 ist (Daemon-Konto-Uids unter Mac OS X) und die ebenfalls eine identische nicht verwendete GID enthält.

Speichern Sie das Skript in einer Datei mit dem Namen add_system_user.shund legen Sie die ausführbare Datei mit fest chmod 755 add_system_user.sh.

Angenommen, Sie möchten einen Daemon / Systembenutzer namens par hinzufügen . Sie würden dieses Skript folgendermaßen ausführen:

sudo add_system_user.sh par

Und Sie erhalten einen Systembenutzer namens _parAlias par(der von Ihnen angeforderte Name) mit einer passenden UID und GID (z. B. 499 oder was auch immer gefunden wurde).

Hier ist das Skript:

#!/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
quelle
Das hat bei mir am 10.9 gut funktioniert. Vielen Dank!
Jbyler
2

In diesem Artikel wird erläutert, wie Sie mit dscl ein Benutzerkonto erstellen.

osxdaily.com Artikel

Joe Block
quelle
Vielen Dank. Auf den Manpages erfahren Sie, welche Befehle Sie verwenden können, aber Sie erhalten keine Hilfe zu den zu verwendenden Feldern und zu den Einstellungen. Ich wollte gerade die Konfiguration von einem anderen Konto kopieren, aber dies ist ein gutes Beispiel.
Tim Yates
Schauen Sie sich für ein verstecktes Systemkonto einige vorhandene Systemkonten an, um bessere Beispiele zu finden. ZB dscl /Local/Default -read /Users/_sshd ( dscl /Local/Default -ls /Userserhalten Sie eine Liste der lokalen Konten). Beachten Sie, dass Sie nicht alle Attribute festlegen müssen. GeneratedUID wird zufällig generiert und RecordType sind automatische Metadaten. Außerdem haben die meisten OS X-Systemkonten einen primären Kontonamen, der mit einem Unterstrich beginnt, und einen Alias ​​ohne diesen Namen, um die Abwärtskompatibilität zu gewährleisten. Ich empfehle die Verwendung der Unterstrichkonvention, aber kümmere dich nicht um den einfachen Alias, es sei denn, du musst.
Gordon Davisson
2

Hier ist eine Version von Daves Skript, die auch prüft, ob der Benutzer / die Gruppe vorhanden ist, bevor sie erstellt wird:

#! / bin / sh
# erstellt einen Dienstkontobenutzer ähnlich dem Linux-Befehl adduser
# Um vorhandene Benutzer und IDs anzuzeigen, versuchen Sie:
# dscl. -readall / Users UniqueID | sort -nk 2

sterben () {
    echo> & 2 "$ @"
    Ausfahrt 1
}}

echo "Verwendung: sudo $ 0 Benutzername uid realname"
echo "HINWEISE: Benutzername sollte nicht mit dem Unterstrich beginnen (er wird vom Skript angehängt)"
echo "Überprüfen Sie, ob der Benutzer nicht existiert und erhalten Sie die kostenlose ID-Nummer im Bereich 1000"
echo "zB mit dscl. -readall / Users UniqueID | sort -nk 2"
Echo ""

# Überprüfen Sie, ob wir Superuser sind (dh $ (id -u) ist Null)
[`id -u` -eq 0] || die "Dieses Skript muss als root ausgeführt werden"

["$ #" -eq 3] || die "Fehler: 3 Argumente erforderlich: Benutzername, UID und Realname"

Benutzername _ = $ 1
uid _ = $ 2
realname _ = $ 3
nfs_homedir = "/ var / tmp"
user_shell = "/ usr / bin / false"

echo "Überprüfen, ob der Benutzer / die Gruppe vorhanden ist: \ c"

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


[$ {# check_uuid} = 0] || die "fehlgeschlagen! \ nFEHLER: Nicht eindeutige Benutzer-UniqueID: \ n \ n`dscl. -read / Users / _ $ username_ RecordName PrimaryGroupID RealName` \ n \ nUm vorhandene Benutzer / IDs anzuzeigen, führen Sie Folgendes aus: dscl. -readall / Users UniqueID | sort -nk 2 "
[$ {# check_upgid} = 0] || die "fehlgeschlagen! \ nFEHLER: Nicht eindeutiger Benutzer PrimaryGroupID \ n \ n`dscl. -read / Users / _ $ username_ RecordName PrimaryGroupID RealName` \ n \ nUm vorhandene Benutzer / IDs anzuzeigen, wird Folgendes ausgeführt: dscl. -readall / Users UniqueID | sort -nk 2 "
[$ {# check_urn} = 0] || die "fehlgeschlagen! \ nFEHLER: Nicht eindeutiger Benutzer RecordName \ n \ n`dscl. -read / Users / _ $ username_ RecordName PrimaryGroupID RealName` \ n \ nUm vorhandene Benutzer / IDs anzuzeigen, führen Sie Folgendes aus: dscl. -readall / Users UniqueID | sort -nk 2 "
[$ {# check_grn} = 0] || die "fehlgeschlagen! \ nFEHLER: Nicht eindeutige Gruppe RecordName \ n \ n`dscl. -read / Groups / _ $ username_ RecordName PrimaryGroupID RealName` \ n \ nUm vorhandene Benutzer / IDs anzuzeigen, führen Sie Folgendes aus: dscl. -readall / Users UniqueID | sort -nk 2 "

Echo "Wir können loslegen!"

# echo "Weiter (j / n)?"
# read input_
# ["$ input_" = "y"] || stirb "wie du willst ..."

echo "Benutzer erstellen: \ c"

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 $ nfs_homedir
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 $ user_shell
dscl. -delete / Users / _ $ username_ PasswordPolicyOptions
dscl. -delete / Users / _ $ username_ AuthenticationAuthority

Echo "fertig!"

und ein Skript zum Löschen des Benutzers:

#! / bin / sh
# Löschen Sie den Dienstbenutzer ähnlich dem Linux-Befehl userdel, lassen Sie die Dateien jedoch intakt
# Um vorhandene Benutzer und IDs anzuzeigen, versuchen Sie:
# dscl. -readall / Users UniqueID | sort -nk 2

sterben () {
    echo> & 2 "$ @"
    Ausfahrt 1
}}

# Überprüfen Sie, ob wir Superuser sind (dh $ (id -u) ist Null)
[`id -u` -eq 0] || die "Dieses Skript muss als root ausgeführt werden"
["$ #" -eq 1] || die "Fehler: Benutzername Argumente sind erforderlich!"

Benutzername _ = $ 1

dscl. -delete / Users / $ username_
dscl. -delete / Groups / $ username_

Echo "fertig!"
Alex Popov
quelle
Du bist ein Zauberer, vielen Dank! Funktioniert unter macOS 10.13.
Dmitry Verkhoturov