Додати обліковий запис демона в 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).

Я також додав записи пароля та 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

EDIT: Оновлено 9 січня 2014 року для OS X Mavericks (пропозиції від Дейва, спасибі!)

Я написав баш сценарій для цього. Він використовуватиме перший невикористаний 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"

Це добре працювало для мене 10.9. Дякую!
jbyler

2

Ось стаття, яка пояснює, як використовувати dscl для створення облікового запису користувача.

стаття osxdaily.com


Дякую. Сторінки довідників розповідають, якими командами ви можете користуватися, але не надаєте вам жодної допомоги щодо того, які поля використовувати та для чого їх встановлювати. Я просто збирався скопіювати конфігурацію з іншого облікового запису, але це дає хороший приклад.
Тім Йейтс

Для прихованих облікових записів системи перегляньте деякі існуючі системні облікові записи, щоб отримати кращі приклади. Наприклад dscl /Local/Default -read /Users/_sshd ( dscl /Local/Default -ls /Usersотримає список місцевих облікових записів). Зверніть увагу, що вам не потрібно встановлювати всі атрибути; GeneratedUID генерується випадковим чином, а RecordType - автоматичними метаданими. Крім того, більшість системних облікових записів OS X мають основне ім’я облікового запису, яке починається з підкреслення, і псевдонім без нього для зворотної сумісності; Я рекомендую використовувати умову підкреслення, але не турбуйтеся з простим псевдонімом, якщо цього не потрібно.
Гордон Девіссон

2

Ось версія сценарію Дейва, яка також перевіряє, чи існує користувач / група перед його створенням:

#! / бін / ш
# створює користувача облікового запису служби, подібного до команди adduser Linux
# для перегляду наявних користувачів та ідентифікаторів спробуйте:
# dscl. -readall / Користувачі UniqueID | сортувати -nk 2

die () {
    echo> & 2 "$ @"
    вихід 1
}

echo "Використання: sudo $ 0 ім'я користувача uid realname"
echo "ПРИМІТКИ: ім'я користувача не повинно починатися з підкреслення (воно буде додане сценарієм)"
echo "перевірте, чи не існує користувача, і отримайте безкоштовний ідентифікаційний номер у межах 1000"
echo ", наприклад, з dscl. -readall / Користувачі UniqueID | Сортувати -nk 2"
відлуння ""

# Перевірте, що ми суперпользователь (тобто $ (id -u) дорівнює нулю)
[`id -u` -eq 0] || die "Цей сценарій потрібно запустити як root"

["$ #" -eq 3] || die "Помилка: потрібні 3 аргументи: ім'я користувача, uid та справжнє ім'я"

ім'я користувача _ = $ 1
uid _ = $ 2
справжнє ім'я _ = 3 $
nfs_homedir = "/ var / tmp"
user_shell = "/ usr / bin / false"

echo "Перевірка наявності користувача / групи: \ c"

check_uuid = `dscl. -search / Користувачі UniqueID $ uid_`
check_upgid = `dscl. -search / Користувачі PrimaryGroupID $ uid_`
check_urn = `dscl. -search / Користувач RecordName _ $ username_`
check_grn = `dscl. -search / Групи RecordName _ $ username_`


[$ {# check_uuid} = 0] || die "не вдалося! \ nERROR: Неповторний UniqueID користувача: \ n \ n`dscl. -read / Користувачі / _ $ username_ RecordName PrimaryGroupID RealName` \ n \ nПереглянути існуючих користувачів / id ID: dscl. -readall / Користувачі UniqueID | сортувати -nk 2 "
[$ {# check_upgid} = 0] || die "не вдалося! \ n ПОМИЛКУ: Неповторний User PrimaryGroupID \ n \ n`dscl. -read / Users / _ $ username_ RecordName PrimaryGroupID RealName` \ n \ nДля перегляду існуючих користувачів / id виконуються: dscl. -readall / Користувачі UniqueID | сортувати -nk 2 "
[$ {# check_urn} = 0] || die "не вдалося! \ n ПОМИЛКУ: Неповторне ім'я користувача RecordName \ n \ n`dscl. -read / Users / _ $ username_ RecordName PrimaryGroupID RealName` \ n \ nПереглянути існуючих користувачів / id ID: dscl. -readall / Користувачі UniqueID | сортувати -nk 2 "
[$ {# check_grn} = 0] || die "не вдалося! \ n ПОМИЛКА: Не унікальна група RecordName \ n \ n`dscl. -read / Групи / _ $ username_ RecordName PrimaryGroupID RealName` \ n \ nДля перегляду існуючих користувачів / id запускається: dscl. -readall / Користувачі UniqueID | сортувати -nk 2 "

відлуння "нам добре їхати!"

# echo "Продовжити (у / п)?"
# читати введення_
# ["$ input_" = "y"] || померти "як хочеш ..."

echo "Створення користувача: \ c"

dscl. -create / Групи / _ $ ім'я_користувача_
dscl. -create / Групи / _ $ username_ PrimaryGroupID $ uid_
dscl. -create / Групи / _ $ username_ RecordName _ $ username_ $ username_
dscl. -create / Групи / _ $ username_ RealName "$ realname_"
dscl. -create / Групи / _ $ ім'я_користувача_ Пароль \ *

dscl. -create / Користувачі / _ $ ім'я_користувача_
dscl. -create / Users / _ $ username_ NFSHomeDirectory $ nfs_homedir
dscl. -create / Користувачі / _ $ ім'я_користувача_ пароль \ *
dscl. -create / Користувачі / _ $ username_ PrimaryGroupID $ uid_
dscl. -create / Users / _ $ username_ RealName "$ realname_"
dscl. -create / Користувачі / _ $ username_ RecordName _ $ username_ $ username_
dscl. -create / Користувачі / _ $ username_ UniqueID $ uid_
dscl. -create / Users / _ $ username_ UserShell $ user_shell
dscl. -delete / Користувачі / _ $ username_ PasswordPolicyOptions
dscl. -delete / Користувачі / _ $ username_ AuthenticationAuthority

відлуння "зроблено!"

та сценарій для видалення користувача:

#! / бін / ш
# видалити користувача сервісу, аналогічного команді Linux userdel, але файли залишати недоторканими
# для перегляду наявних користувачів та ідентифікаторів спробуйте:
# dscl. -readall / Користувачі UniqueID | сортувати -nk 2

die () {
    echo> & 2 "$ @"
    вихід 1
}

# Перевірте, що ми суперпользователь (тобто $ (id -u) дорівнює нулю)
[`id -u` -eq 0] || die "Цей сценарій потрібно запустити як root"
["$ #" -qq 1] || die "Помилка: потрібні аргументи користувача!"

ім'я користувача _ = $ 1

dscl. -delete / Користувачі / $ username_
dscl. -delete / Групи / $ username_

відлуння "зроблено!"

Ти чарівник, велике спасибі! Працює в macOS 10.13.
Дмитро Верхотуров
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.