Добавить учетную запись демона в 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.
Дмитрий Верхотуров
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.