Назад | Перейти на главную страницу

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

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

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

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

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

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

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

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"

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

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

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

статья на osxdaily.com

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

#!/bin/sh
# creates service account user similar to Linux adduser command
# to view existing users and ids try:
# dscl . -readall /Users UniqueID | sort -nk 2

die () {
    echo >&2 "$@"
    exit 1
}

echo "Usage: sudo $0 username uid realname"
echo "NOTES: username shouldn't start with the underscore (it will be appended by the script)"
echo "       check that the user does not exist and get the free ID number in 1000 range"
echo "       e.g. with dscl . -readall /Users UniqueID | sort -nk 2"
echo ""

# Check that we are superuser (i.e. $(id -u) is zero)
[ `id -u` -eq 0 ] || die "This script needs to run as root"

[ "$#" -eq 3 ] || die "Error: 3 arguments required: username, uid and realname"

username_=$1
uid_=$2
realname_=$3
nfs_homedir="/var/tmp"
user_shell="/usr/bin/false"

echo "Checking if the user/group exists: \c"

check_uuid=`dscl . -search /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 "failed!\nERROR: Non-unique User UniqueID:\n\n`dscl . -read /Users/_$username_ RecordName PrimaryGroupID RealName` \n\nTo view existing users/ids run: dscl . -readall /Users UniqueID | sort -nk 2"
[ ${#check_upgid} = 0 ] || die "failed!\nERROR: Non-unique User PrimaryGroupID\n\n`dscl . -read /Users/_$username_ RecordName PrimaryGroupID RealName` \n\nTo view existing users/ids run: dscl . -readall /Users UniqueID | sort -nk 2"
[ ${#check_urn} = 0 ] || die "failed!\nERROR: Non-unique User RecordName\n\n`dscl . -read /Users/_$username_ RecordName PrimaryGroupID RealName` \n\nTo view existing users/ids run: dscl . -readall /Users UniqueID | sort -nk 2"
[ ${#check_grn} = 0 ] || die "failed!\nERROR: Non-unique Group RecordName\n\n`dscl . -read /Groups/_$username_ RecordName PrimaryGroupID RealName` \n\nTo view existing users/ids run: dscl . -readall /Users UniqueID | sort -nk 2"

echo "we're good to go!"

# echo "Continue (y/n) ? "
# read input_
# [ "$input_" = "y" ] || die "as you wish..." 

echo "Creating User: \c"

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 $nfs_homedir
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 $user_shell
dscl . -delete /Users/_$username_ PasswordPolicyOptions
dscl . -delete /Users/_$username_ AuthenticationAuthority

echo "done!"

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

#!/bin/sh
# delete service user similar to Linux userdel command, but leaving the files intact
# to view existing users and ids try:
# dscl . -readall /Users UniqueID | sort -nk 2

die () {
    echo >&2 "$@"
    exit 1
}

# Check that we are superuser (i.e. $(id -u) is zero)
[ `id -u` -eq 0 ] || die "This script needs to run as root"
[ "$#" -eq 1 ] || die "Error: username arguments is required!"

username_=$1

dscl . -delete /Users/$username_ 
dscl . -delete /Groups/$username_ 

echo "done!"