Добавить учетную запись демона в OS X

Я пытаюсь вручную установить демон (Oracle Grid Engine) на свою машину и хочу, чтобы он работал под изолированной учетной записью. Каков предпочтительный способ, используя службы каталогов, добавить "системную" учетную запись на локальный компьютер в OS X? Их много в / etc / passwd (_www, _dovecotи т. д.), но комментарии вверху этого файла говорят, что он не используется, кроме как в однопользовательском режиме.

Я работаю на 10.6, и не требую никакого специального сетевого управления учетными записями. Я надеюсь на что-то простое - эквивалент useradd почти на любой другой Unix-подобной ОС.

5 ответов

Решение

dscl - это команда, которую вы ищете.

Я попробовал скрипт из par и обнаружил несколько проблем. Поэтому я изменил его для одного конкретного идентификатора пользователя и для OS X Mavericks (10.9).

Я обнаружил, что есть несколько посторонних записей, добавленных в учетную запись пользователя в Mavericks - PasswordPolicyOptions и запись AuthenticationAuthority - которые необходимо было удалить, чтобы правильно имитировать учетные записи других пользователей встроенной службы (например, _www).

Я также добавил записи Password и RealName в учетную запись группы.

Я создал нестандартный сценарий только для учетной записи службы WSGI. Вот обновленный скрипт.

#! /bin/bash
#

# Check that we are superuser (i.e. $(id -u) is zero)
if (( $(id -u) ))
then
    echo "This script needs to run as root"
    exit 1
fi

username_=wsgi
uid_=240
realname_="WSGI Daemon"

dscl . -create /Groups/_$username_
dscl . -create /Groups/_$username_ PrimaryGroupID $uid_
dscl . -create /Groups/_$username_ RecordName _$username_ $username_
dscl . -create /Groups/_$username_ RealName $realname_
dscl . -create /Groups/_$username_ Password \*

dscl . -create /Users/_$username_
dscl . -create /Users/_$username_ NFSHomeDirectory /xpt/local/apache2/wsgi/api
dscl . -create /Users/_$username_ Password \*
dscl . -create /Users/_$username_ PrimaryGroupID $uid_
dscl . -create /Users/_$username_ RealName $realname_
dscl . -create /Users/_$username_ RecordName _$username_ $username_
dscl . -create /Users/_$username_ UniqueID $uid_
dscl . -create /Users/_$username_ UserShell /usr/bin/false
dscl . -delete /Users/_$username_ PasswordPolicyOptions
dscl . -delete /Users/_$username_ AuthenticationAuthority

Обратите внимание, что после запуска этого скрипта файлы /etc/passwd и /etc/groups не обновляются. Я считаю, что они обновляются при перезагрузке.

РЕДАКТИРОВАТЬ: Обновлено 9 января 2014 года для OS X Mavericks (предложения от Дейва, спасибо!)

Я написал скрипт bash для этого. Он будет использовать первый неиспользуемый uid, который меньше или равен 500 (uid учетной записи демона в Mac OS X), который также имеет идентичный неиспользуемый gid.

Сохраните скрипт в файл с именем add_system_user.sh и установите его исполняемым с chmod 755 add_system_user.sh,

Тогда предположим, что вы хотите добавить пользователя демона / системы с именем par. Вы бы запустили этот скрипт так:

sudo add_system_user.sh par

И вы получите системного пользователя под названием _par который связан с par (имя, которое вы просили) и имеет совпадающий uid и gid (например, 499 или что-то еще)

Вот сценарий:

#!/bin/bash

if (( $(id -u) )) ; then
    echo "This script needs to run as root"
    exit 1
fi

if [[ -z "$1" ]] ; then
    echo "Usage: $(basename $0) [username] [realname (optional)]"
    exit 1
fi

username=$1
realname="${2:-$username}"

echo "Adding daemon user $username with real name \"$realname\""

for (( uid = 500;; --uid )) ; do
    if ! id -u $uid &>/dev/null; then
        if ! dscl /Local/Default -ls Groups gid | grep -q [^0-9]$uid\$ ; then
          dscl /Local/Default -create Groups/_$username
          dscl /Local/Default -create Groups/_$username Password \*
          dscl /Local/Default -create Groups/_$username PrimaryGroupID $uid
          dscl /Local/Default -create Groups/_$username RealName "$realname"
          dscl /Local/Default -create Groups/_$username RecordName _$username $username

          dscl /Local/Default -create Users/_$username
          dscl /Local/Default -create Users/_$username NFSHomeDirectory /var/empty
          dscl /Local/Default -create Users/_$username Password \*
          dscl /Local/Default -create Users/_$username PrimaryGroupID $uid
          dscl /Local/Default -create Users/_$username RealName "$realname"
          dscl /Local/Default -create Users/_$username RecordName _$username $username
          dscl /Local/Default -create Users/_$username UniqueID $uid
          dscl /Local/Default -create Users/_$username UserShell /usr/bin/false

          dscl /Local/Default -delete /Users/_$username AuthenticationAuthority
          dscl /Local/Default -delete /Users/_$username PasswordPolicyOptions
          break
        fi
    fi
done

echo -e "Created system user $username (uid/gid $uid):\n"

dscl /Local/Default -read Users/_$username

echo -e "\nYou can undo the creation of this user by issuing the following commands:\n"
echo "sudo dscl /Local/Default -delete Users/_$username"
echo "sudo dscl /Local/Default -delete Groups/_$username"

Вот версия сценария Дейва, которая также проверяет, существует ли пользователь / группа перед его созданием:

#! / Bin / ш
# создает учетную запись пользователя службы аналогично команде adduser для Linux
# для просмотра существующих пользователей и идентификаторов попробуйте:
# dscl . -readall / Пользователи UniqueID | сортировка -nk 2

умереть () {
    echo >&2 "$@"
    выход 1
}

echo "Использование: sudo $0 username uid realname"
echo "ЗАМЕЧАНИЯ: имя пользователя не должно начинаться с подчеркивания (оно будет добавлено скриптом)"
echo "проверьте, что пользователь не существует и получите бесплатный идентификационный номер в диапазоне 1000"
echo "например, с помощью dscl . -readall /Users UniqueID | sort -nk 2"
эхо ""

# Проверьте, что мы суперпользователь (т. Е. $(Id -u) равен нулю)
[ `id -u` -eq 0 ] || die "Этот скрипт должен запускаться с правами root"

["$ #" -eq 3] || die "Ошибка: требуется 3 аргумента: имя пользователя, идентификатор пользователя и имя пользователя"

имя пользователя _=$1
UID _=$2
RealName_=$3
nfs_homedir="/ Var / TMP"
user_shell="/ USR / бен / ложь"

echo "Проверка, существует ли пользователь / группа: \c"

check_uuid = `dscl. -поиск / Users UniqueID $ uid_`
check_upgid = `dscl. -search / Users PrimaryGroupID $ uid_`
check_urn = `dscl. -search / Users RecordName _ $ username_`
check_grn = `dscl. -search / Groups RecordName _ $ username_`


[$ {# check_uuid} = 0] || die "не удалось!\nERROR: неуникальный уникальный идентификатор пользователя:\n\n`dscl . -read /Users/_$username_ RecordName PrimaryGroupID RealName` \n\n Для просмотра существующих пользователей / идентификаторов выполните: dscl . -readall /Users UniqueID | сортировать -nk 2"
[ ${#check_upgid} = 0 ] || die "fail!\nERROR: неуникальный идентификатор пользователя PrimaryGroupID\n\n`dscl . -read /Users/_$username_ RecordName PrimaryGroupID RealName` \n\n Чтобы просмотреть существующих пользователей / идентификаторов, выполните: dscl . -readall /Users UniqueID | сортировка -nk 2"
[ ${#check_urn} = 0 ] || die "не удалось!\nERROR: неуникальное имя пользователя RecordName\n\n`dscl . -read /Users/_$username_ RecordName PrimaryGroupID RealName` \n\n Для просмотра существующих пользователей / идентификаторов выполните: dscl . -readall /Users UniqueID | сорт-нк 2"
[ ${#check_grn} = 0 ] || умереть "не удалось!\nERROR: неуникальное имя записи группы \n\n`dscl . -read /Groups/_$username_ RecordName PrimaryGroupID RealName` \n\n Для просмотра существующих пользователей / идентификаторов выполните: dscl . -readall /Users UniqueID | сортировка -nk 2 "

эхо "мы в порядке!"

# echo "Продолжить (да / нет)? "
# читать ввод
# [ "$input_" = "y" ] || умри "как пожелаешь..." 

echo "Создание пользователя: \c"

доктор наук -создать / Группы / _ $ username_
доктор наук -создать / Группы /_$username_ PrimaryGroupID $uid_
доктор наук -создать / Группы /_$username_ RecordName _$username_ $username_
доктор наук -создать / Группы /_$username_ RealName "$realname_"
доктор наук -создать / Группы / _ $ имя_пользователя_ Пароль \*

доктор наук -создать / Пользователи / _ $ username_
доктор наук -create /Users/_$username_ NFSHomeDirectory $nfs_homedir
доктор наук -создать / Пользователи / _ $ username_ Пароль \*
доктор наук -create /Users/_$username_ PrimaryGroupID $uid_
доктор наук -create /Users/_$username_ RealName "$realname_"
доктор наук -создать / Пользователи /_$username_ RecordName _$username_ $username_
доктор наук -создать / Пользователи /_$username_ UniqueID $uid_
доктор наук -create /Users/_$username_ UserShell $user_shell
доктор наук -delete /Users/_$username_ PasswordPolicyOptions
доктор наук -delete /Users/_$username_ AuthenticationAuthority

эхо "сделано!"

и скрипт для удаления пользователя:

#! / Bin / ш
# удалить сервисного пользователя, похожего на команду Linux userdel, но оставив файлы без изменений
# для просмотра существующих пользователей и идентификаторов попробуйте:
# dscl . -readall / Пользователи UniqueID | сортировка -nk 2

умереть () {
    echo >&2 "$@"
    выход 1
}

# Проверьте, что мы суперпользователь (т. Е. $(Id -u) равен нулю)
[ `id -u` -eq 0 ] || die "Этот скрипт должен запускаться с правами root"
[ "$#" -eq 1 ] || die "Ошибка: требуются аргументы имени пользователя!"

имя пользователя _=$1

доктор наук -delete / Пользователи / $ username_ 
доктор наук -delete / Группы / $ username_ 

эхо "сделано!"

Вот статья, которая объясняет, как использовать dscl для создания учетной записи пользователя.

статья osxdaily.com

Другие вопросы по тегам