Что эквивалентно команде adduser в Mac OS X?

20

Я хочу иметь возможность создавать новых пользователей из командной строки, когда я вошел в систему как администратор. В частности, я ищу эквивалент adduserкоманды на Linux.

Buzzy
источник

Ответы:

12

Хороший скрипт доступен по адресу http://wiki.freegeek.org/index.php/Mac_OSX_adduser_script. Однако он имеет несколько опечаток и иногда недостаточно гибок, поэтому вот моя модифицированная версия с некоторыми улучшениями:

#!/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)"
Антон Матосов
источник
По крайней мере, 10.12 / Sierra это может быть проблематично. Когда я попробовал, он создавал каталоги для каждого пользователя в сети. В частности, использование 'createhomedir' без указания '-u username', вероятно, не рекомендуется.
Ян Кью Пеблик
17

Я думаю, что вы ищете команду dscl. Niutil звучит как NetInfo, который устарел в OS X в пользу Open Directory или LDAP.

Dscl или командную строку служб каталогов можно использовать для редактирования Open Directory как для локального, так и для удаленного хранилища пользовательских данных. Это можно сделать с помощью команд sudo, но его проще использовать в качестве пользователя root.

Вот краткое и крайне неадекватное руководство: в терминале sudo -s для переключения вашего пользователя в root. Чтобы создать функциональную учетную запись пользователя с именем dscl2, вам необходимо сделать следующее:

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 обычно составляет около 501 или больше. 501 - это UID по умолчанию для первой созданной учетной записи. UID менее 500 не отображаются на панели учетных записей по умолчанию. Выберите любой номер, который вы хотите, но убедитесь, что он уникален в локальной системе. Не перезаписывайте существующий UID, иначе у вас будут большие проблемы.

В Dscl есть интерактивный режим, который работает немного по-другому. Введите просто «dscl» в ответ на приглашение войти в интерактивный режим.

Если вы находитесь в интерактивном режиме, введите ls, чтобы увидеть список доступных каталогов. Вы должны увидеть BSD, LDAP и Local. Вы перемещаетесь по каталогам с помощью CD. Обратитесь к странице вашего друга за дополнительной информацией.

Тео Белк
источник
2
Я знаю, что вы предупредили нас, что это неадекватно, но было бы здорово увидеть полный набор шагов, необходимых для создания учетной записи, даже после того, как dscl будет сделан. Например, нужно ли создавать папку / Users / dscl2? как применять ACL?
Натан Гарабедян
1
Этот ответ правильный, но сценарий ответа @ anton-matosov великолепен. Запускает те же команды.
bmucklow