Co jest odpowiednikiem polecenia adduser w systemie Mac OS X?

20

Chcę móc tworzyć nowych użytkowników z wiersza poleceń, gdy jestem zalogowany jako administrator. W szczególności szukam odpowiednika adduserpolecenia w systemie Linux.

Buzzy
źródło

Odpowiedzi:

12

Dobry skrypt jest dostępny na stronie http://wiki.freegeek.org/index.php/Mac_OSX_adduser_script Jednak ma kilka literówek i czasami nie jest wystarczająco elastyczny, więc oto moja zmodyfikowana wersja z pewnymi ulepszeniami:

#!/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
źródło
Przynajmniej 10.12 / Sierra może to stanowić problem. Kiedy próbowałem, tworzyło katalogi dla każdego użytkownika w sieci. W szczególności użycie „createhomedir” bez określenia „-u nazwa użytkownika” jest prawdopodobnie niewskazane.
Jan Kyu Peblik
17

Myślę, że szukasz polecenia dscl. Niutil brzmi jak NetInfo, który jest przestarzały w OS X na rzecz Open Directory aka LDAP.

Dscl lub Wiersz poleceń usług katalogowych może być używany do edycji Open Directory dla lokalnego lub zdalnego magazynu danych użytkownika. Można to zrobić za pomocą poleceń sudo, ale łatwiej jest używać go jako root.

Oto krótki i bardzo nieodpowiedni samouczek: W terminalu sudo -s przełącza użytkownika na rootowanie. Aby utworzyć funkcjonalne konto użytkownika o nazwie dscl2, musisz wykonać następujące czynności:

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

UUID wynosi zwykle około 501 lub więcej. 501 to domyślny identyfikator UID dla pierwszego utworzonego konta. Identyfikatory UID mniejsze niż 500 nie są domyślnie wyświetlane w panelu Konta. Wybierz dowolny numer, ale upewnij się, że jest on unikalny w systemie lokalnym. Nie zastępuj istniejącego identyfikatora UID, w przeciwnym razie będziesz mieć duże problemy.

Dscl ma również tryb interaktywny, który działa nieco inaczej. W wierszu polecenia wpisz „dscl”, aby przejść do trybu interaktywnego.

Jeśli jesteś w trybie interaktywnym, wpisz ls, aby wyświetlić listę dostępnych katalogów. Powinieneś zobaczyć BSD, LDAP i lokalny. Poruszasz się po katalogach za pomocą cd. Aby uzyskać więcej informacji, zobacz stronę podręcznika znajomego.

Theo Belk
źródło
2
Wiem, że ostrzegłeś nas, że jest to niewystarczające, ale byłoby wspaniale zobaczyć pełny zestaw kroków wymaganych do utworzenia konta, nawet po zakończeniu dscl. Na przykład, czy należy utworzyć folder / Users / dscl2? jak stosować listy ACL?
Nathan Garabedian
1
Ta odpowiedź jest poprawna, ale skrypt w odpowiedzi @ anton-matosov jest świetny. Uruchamia te same polecenia.
bmucklow 30.04.2013