Добавить учетную запись демона в OS X
Я пытаюсь вручную установить демон (Oracle Grid Engine) на свою машину и хочу, чтобы он работал под изолированной учетной записью. Каков предпочтительный способ, используя службы каталогов, добавить "системную" учетную запись на локальный компьютер в OS X? Их много в / etc / passwd (_www
, _dovecot
и т. д.), но комментарии вверху этого файла говорят, что он не используется, кроме как в однопользовательском режиме.
Я работаю на 10.6, и не требую никакого специального сетевого управления учетными записями. Я надеюсь на что-то простое - эквивалент useradd
почти на любой другой Unix-подобной ОС.
5 ответов
Я попробовал скрипт из 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 для создания учетной записи пользователя.