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


20

Я хочу мати можливість створювати нових користувачів з командного рядка, коли я входив як адміністратор. Зокрема, я шукаю еквівалент adduserкоманди в Linux.

Відповіді:


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 / Сьєрра це може бути проблематично. Коли я спробував це, він створював каталоги для кожного користувача в мережі. Зокрема, використання "createhomedir" без зазначення "-u ім'я користувача", ймовірно, недоцільно.
Ян Кю Пеблик

17

Я думаю, ти шукаєш команду dscl. Niutil звучить як NetInfo, який застаріло в OS X на користь Open Directory aka 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. Ви переглядаєте каталоги з компакт-диском. Для отримання додаткової інформації дивіться сторінку чоловіка свого друга.


2
Я знаю, ви попередили нас, що це недостатньо, але було б чудово побачити повний набір кроків, необхідних для створення облікового запису, навіть після того, як буде виконано dscl. Наприклад, чи потрібно створити папку / Users / dscl2? як застосувати ACL?
Натан Гарабедян

1
Ця відповідь правильна, але сценарій у відповіді @ anton-matosov чудовий. Виконує ті самі команди.
bmucklow
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.