在 OS X 上添加守护程序帐户

Tim*_*tes 9 directory-services user-management mac-osx

我正在尝试在我的机器上手动安装一个守护进程(Oracle Grid Engine),我希望它在一个独立的帐户下运行。使用目录服务将“系统”帐户添加到 OS X 上的本地计算机的首选方法是什么?其中很多存在于 /etc/passwd ( _www, _dovecot, 等) 中,但该文件顶部的注释说它除了在单用户模式下不被使用。

我在 10.6 上运行,不需要任何特殊的网络帐户管理。我希望有一些简单的东西——相当于useradd几乎所有其他类 Unix 操作系统。

par*_*par 12

编辑:2014 年 1 月 9 日更新了 OS X Mavericks(来自 Dave 的建议,谢谢!)

我写了一个 bash 脚本来做到这一点。它将使用第一个小于或等于 500(Mac OS X 上的守护程序帐户 uid)的未使用 uid,它也具有相同的未使用 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"
Run Code Online (Sandbox Code Playgroud)


小智 12

我尝试了par 中的脚本,发现了一些问题。因此,我针对一个特定的用户 ID 和 OS X Mavericks (10.9) 对其进行了修改。

我发现在 Mavericks 下的用户帐户中添加了一些无关的记录——一个 PasswordPolicyOptions 和一个 AuthenticationAuthority 记录——需要删除它们以正确模仿其他内置服务用户帐户(如 _www)。

我还将 Password 和 RealName 记录添加到 Group 帐户。

我为 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
Run Code Online (Sandbox Code Playgroud)

请注意,运行此脚本后,/etc/passwd 和 /etc/groups 文件不会更新。我相信它们会在重新启动时更新。


Sve*_*ven 3

dscl 是您正在寻找的命令。