Was entspricht dem Befehl adduser unter Mac OS X?

20

Ich möchte neue Benutzer über die Befehlszeile erstellen können, wenn ich als Administrator angemeldet bin. Insbesondere suche ich nach einem Äquivalent des adduserBefehls unter Linux.

Buzzy
quelle

Antworten:

12

Unter http://wiki.freegeek.org/index.php/Mac_OSX_adduser_script ist ein gutes Skript verfügbar. Es enthält jedoch mehrere Tippfehler und ist manchmal nicht flexibel genug. Daher hier meine modifizierte Version mit einigen Verbesserungen:

#!/bin/bash
# =========================
# Add User OS X Interactive Command Line
# =========================

getHiddenUserUid()
{
    local __UIDS=$(dscl . -list /Users UniqueID | awk '{print $2}' | sort -ugr)

    #echo $__UIDS
    local __NewUID
    for __NewUID in $__UIDS
    do
        if [[ $__NewUID -lt 499 ]] ; then
            break;
        fi
    done

    echo $((__NewUID+1))
}

getInteractiveUserUid()
{
    # Find out the next available user ID
    local __MAXID=$(dscl . -list /Users UniqueID | awk '{print $2}' | sort -ug | tail -1)
    echo $((__MAXID+1))
}

if  [ $UID -ne 0 ] ; then echo "Please run $0 as root." && exit 1; fi

read -p "Enter your desired user name: " USERNAME

read -p "Enter a full name for this user: " FULLNAME

read -s -p "Enter a password for this user: " PASSWORD
echo
read -s -p "Validate a password: " PASSWORD_VALIDATE
echo

if [[ $PASSWORD != $PASSWORD_VALIDATE ]] ; then
    echo "Passwords do not match!"
    exit 1;
fi

# ====

# A list of (secondary) groups the user should belong to
# This makes the difference between admin and non-admin users.

read -p "Is this an administrative user? [y/n] (n): " GROUP_ADD
GROUP_ADD=${GROUP_ADD:-n}

if [ "$GROUP_ADD" = n ] ; then
    SECONDARY_GROUPS="staff"  # for a non-admin user
elif [ "$GROUP_ADD" = y ] ; then
    SECONDARY_GROUPS="admin _lpadmin _appserveradm _appserverusr" # for an admin user
else
    echo "You did not make a valid selection!"
    exit 1;
fi

# ====

# Create a UID that is not currently in use

read -p "Should this user have interactive access?  [y/n] (y): " IS_INTERACTIVE
IS_INTERACTIVE=${IS_INTERACTIVE:-y}

if [ "$IS_INTERACTIVE" = y ] ; then
    USERID=$(getInteractiveUserUid)
elif [ "$IS_INTERACTIVE" = n ] ; then
    USERID=$(getHiddenUserUid)
else
    echo "You did not make a valid selection!"
    exit 1;
fi

echo "Going to create user as:"
echo "User name: " $USERNAME
echo "Full name: " $FULLNAME
echo "Secondary groups: " $SECONDARY_GROUPS
echo "UniqueID: " $USERID

read -p "Is this information correct?  [y/n] (y): " IS_INFO_CORRECT
IS_INFO_CORRECT=${IS_INFO_CORRECT:-y}

if [ "$IS_INFO_CORRECT" = y ] ; then
    echo "Configuring Open Directory..."
elif [ "$IS_INFO_CORRECT" = n ] ; then
    echo "User creation cancelled!"
    exit 1;
else
    echo "You did not make a valid selection!"
    exit 1;
fi


# Create the user account by running dscl (normally you would have to do each of these commands one
# by one in an obnoxious and time consuming way.

dscl . -create /Users/$USERNAME
dscl . -create /Users/$USERNAME UserShell /bin/bash
dscl . -create /Users/$USERNAME RealName "$FULLNAME"
dscl . -create /Users/$USERNAME UniqueID "$USERID"
dscl . -create /Users/$USERNAME PrimaryGroupID 20
dscl . -create /Users/$USERNAME NFSHomeDirectory /Users/$USERNAME
dscl . -passwd /Users/$USERNAME $PASSWORD


# Add user to any specified groups
echo "Adding user to specified groups..."

for GROUP in $SECONDARY_GROUPS ; do
    dseditgroup -o edit -t user -a $USERNAME $GROUP
done

# Create the home directory
echo "Creating home directory..."
createhomedir -c 2>&1 | grep -v "shell-init"

echo "Created user #$USERID: $USERNAME ($FULLNAME)"
Anton Matosov
quelle
Zumindest am 10.12 / Sierra könnte dies problematisch sein. Als ich es versuchte, erstellte es Verzeichnisse für jeden einzelnen Benutzer im Netzwerk. Insbesondere die Verwendung von "createhomedir" ohne Angabe von "-u Benutzername" ist wahrscheinlich nicht ratsam.
Jan Kyu Peblik
17

Ich glaube, Sie suchen nach dem Befehl dscl. Niutil klingt wie NetInfo, das in OS X zugunsten von Open Directory alias LDAP veraltet ist.

Dscl oder Directory Services Command Line kann verwendet werden, um Open Directory sowohl für einen lokalen als auch für einen Remotebenutzerdatenspeicher zu bearbeiten. Dies kann mit sudo-Befehlen erfolgen, ist jedoch einfacher als root zu verwenden.

Hier ist ein kurzes und sehr unangemessenes Tutorial: Im Terminal können Sie mit sudo -s Ihren Benutzer auf root umstellen. Um ein funktionsfähiges Benutzerkonto mit dem Namen dscl2 zu erstellen, müssen Sie folgende Schritte ausführen:

dscl . -create /Users/dscl2

dscl . -create /Users/dscl2 UserShell /bin/bash

dscl . -create /Users/dscl2 RealName "DSCL 2"

dscl . -create /Users/dscl2 UniqueID 8005

dscl . -create /Users/dscl2 PrimaryGroupID 20

dscl . -create /Users/dscl2 NFSHomeDirectory /Users/dscl2

dscl . -passwd /Users/dscl2 password

Die UUID liegt normalerweise bei 501 oder höher. 501 ist die Standard-UID für das erste erstellte Konto. UIDs unter 500 werden standardmäßig nicht im Bereich "Konten" angezeigt. Wählen Sie die gewünschte Nummer aus, stellen Sie jedoch sicher, dass sie auf dem lokalen System eindeutig ist. Überschreiben Sie keine vorhandene UID, da Sie sonst große Probleme haben.

Dscl hat auch einen interaktiven Modus, der ein bisschen anders funktioniert. Geben Sie an der Eingabeaufforderung nur "dscl" ein, um in den interaktiven Modus zu wechseln.

Wenn Sie sich im interaktiven Modus befinden, geben Sie ls ein, um die verfügbaren Verzeichnisse aufzulisten. Sie sollten BSD, LDAP und Local sehen. Sie navigieren mit cd durch die Verzeichnisse. Weitere Informationen finden Sie auf der Manpage Ihres Freundes.

Theo Belk
quelle
2
Ich weiß, dass Sie uns gewarnt haben, dass dies nicht ausreichend ist, aber es wäre großartig zu sehen, welche Schritte erforderlich sind, um ein Konto zu erstellen, auch wenn dscl abgeschlossen ist. Muss beispielsweise ein Ordner / Users / dscl2 erstellt werden? Wie werden die ACLs angewendet?
Nathan Garabedian
1
Diese Antwort ist richtig, aber das Skript in @ anton-matosov Antwort ist großartig. Führt dieselben Befehle aus.
Bmucklow