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

9

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

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

Тим Йейтс
источник

Ответы:

3

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

Свен
источник
+1, потому что это окончательный ответ. Если вам нужен графический интерфейс, вы можете загрузить серверные инструменты и настроить Диспетчер рабочих групп на своем компьютере, чтобы сделать по сути то же самое ..
Джонни Одом
12

Я попробовал скрипт из номинала и обнаружил несколько проблем. Поэтому я изменил его для одного конкретного идентификатора пользователя и для 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 не обновляются. Я считаю, что они обновляются при перезагрузке.

Дейв Хейн
источник
1
Спасибо, Дейв. Я обновил свой скрипт (ниже), чтобы использовать ваши открытия Mavericks и принять необязательный параметр реального имени.
номинальная
11

РЕДАКТИРОВАТЬ: Обновлено 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

И вы получите системного пользователя с именем _paraliased 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"
паритет
источник
Это работало хорошо для меня на 10,9. Спасибо!
Jbyler
2

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

статья osxdaily.com

Джо Блок
источник
Спасибо. Страницы руководства говорят вам, какие команды вы можете использовать, но не дают никакой помощи в том, какие поля использовать и для чего их устанавливать. Я просто собирался скопировать конфиг с другого аккаунта, но это хороший пример.
Тим Йейтс
Для скрытой системной учетной записи, посмотрите на некоторые существующие системные учетные записи для лучших примеров. Например dscl /Local/Default -read /Users/_sshd ( dscl /Local/Default -ls /Usersвы получите список локальных учетных записей). Обратите внимание, что вам не нужно устанавливать все атрибуты; GeneratedUID генерируется случайным образом, а RecordType - это автоматические метаданные. Кроме того, большинство системных учетных записей OS X имеют имя основной учетной записи, которое начинается с подчеркивания, и псевдоним без него для обратной совместимости; Я рекомендую использовать соглашение о подчеркивании, но не беспокойтесь простым псевдонимом, если вам не нужно.
Гордон Дэвиссон
2

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

#! / 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 | сортировка -nk 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_ Пароль \ *

доктор наук -создать / Пользователи / _ $ username_
доктор наук -create / Users / _ $ username_ NFSHomeDirectory $ nfs_homedir
доктор наук -создать / Пользователи / _ $ username_ Пароль \ *
доктор наук -create / Users / _ $ username_ PrimaryGroupID $ uid_
доктор наук -create / Users / _ $ username_ RealName "$ realname_"
доктор наук -создать / Пользователи / _ $ username_ RecordName _ $ username_ $ username_
доктор наук -create / Users / _ $ 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_

эхо "сделано!"
Алекс Попов
источник
Ты волшебник, большое спасибо! Работает в macOS 10.13.
Дмитрий Верхотуров