Qual è l'equivalente del comando adduser su Mac OS X?


20

Voglio essere in grado di creare nuovi utenti dalla riga di comando quando eseguo l'accesso come amministratore. In particolare, sto cercando un equivalente del addusercomando su Linux.

Risposte:


12

C'è un buon script disponibile su http://wiki.freegeek.org/index.php/Mac_OSX_adduser_script Tuttavia ha diversi errori di battitura e talvolta non è abbastanza flessibile, quindi ecco la mia versione modificata di esso con alcuni miglioramenti:

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

Almeno il 10.12 / Sierra questo potrebbe essere problematico. Quando l'ho provato, stava creando directory per ogni singolo utente sulla rete. In particolare, l'utilizzo di "createhomedir" senza specificare "-u username" è probabilmente sconsigliato.
Jan Kyu Peblik,

17

Penso che tu stia cercando il comando dscl. Niutil sembra NetInfo che è deprecato in OS X a favore di Open Directory aka LDAP.

Dscl, o riga di comando dei servizi di directory, può essere utilizzato per modificare Open Directory per un archivio dati di utenti locali o remoti. Può essere fatto con i comandi sudo ma è più facile da usare come root.

Ecco un breve tutorial altamente inadeguato: nel terminale, sudo -s per passare l'utente alla radice. Per creare un account utente funzionale denominato dscl2, è necessario effettuare le seguenti operazioni:

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

L'UUID è in genere di circa 501 o superiore. 501 è l'UID predefinito per il primo account creato. Gli UID inferiori a 500 non vengono visualizzati nel riquadro Account per impostazione predefinita. Scegli il numero che desideri, ma assicurati che sia univoco sul sistema locale. Non sovrascrivere un UID esistente o avrai grossi problemi.

Dscl ha anche una modalità interattiva che funziona in modo leggermente diverso. Immettere solo "dscl" al prompt per accedere alla modalità interattiva.

Se sei in modalità interattiva, digita ls per elencare le directory disponibili. Dovresti vedere BSD, LDAP e Local. Si naviga attraverso le directory con cd. Vedi la pagina man del tuo amico per maggiori informazioni.


2
So che ci hai avvertito che questo era inadeguato, ma sarebbe bello vedere l'intera serie di passaggi necessari per creare un account, anche dopo che dscl è stato eseguito. Ad esempio, è necessario creare una cartella / Users / dscl2? come applicare gli ACL?
Nathan Garabedian,

1
Questa risposta è corretta, ma lo script nella risposta @ anton-matosov è eccezionale. Esegue gli stessi comandi.
bmucklow,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.