Я пытаюсь вручную установить демон (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 для создания учетной записи пользователя.
Вот версия сценария Дейва, который также проверяет, существует ли пользователь / группа перед ее созданием:
#!/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!"