在 OS X 上添加守护进程账户

在 OS X 上添加守护进程账户

我正在尝试手动在我的计算机上安装守护程序 (Oracle Grid Engine),并希望它在独立帐户下运行。使用目录服务,在 OS X 上向本地计算机添加“系统”帐户的首选方法是什么?/etc/passwd(_www_dovecot等)中有很多这样的帐户,但该文件顶部的注释表明,除了在单用户模式下,它不会使用。

我使用的是 10.6,不需要任何特殊的网络帐户管理。我希望它简单一些——与useradd几乎所有其他类 Unix 操作系统相当。

答案1

dscl 是您正在寻找的命令。

答案2

我尝试了脚本平价,并发现了一些问题。所以我针对一个特定的用户 ID 和 OS X Mavericks (10.9) 进行了修改。

我发现 Mavericks 下的用户帐户中添加了一些多余的记录 - PasswordPolicyOptions 和 AuthenticationAuthority 记录 - 需要将其删除才能正确模仿其他内置服务用户帐户(如 _www)。

我还将密码和真实姓名记录添加到了群组帐户。

我为 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 文件不会更新。我相信它们会在重启时更新。

答案3

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

我编写了一个 bash 脚本来执行此操作。它将使用第一个未使用的 uid,该 uid 小于或等于 500(Mac OS X 上的守护进程帐户 uid),并且还具有相同的未使用的 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"

答案4

这是 Dave 脚本的一个版本,它还会在创建用户/组之前检查该用户/组是否存在:

/bin/sh #!/bin/sh 复制代码
# 创建类似于 Linux adduser 命令的服务账户用户
# 要查看现有用户和 ID,请尝试:
# dscl . -readall /用户唯一 ID | sort -nk 2

死 () {
    回显 >&2 "$@"
    出口 1
}

echo "用法:sudo $0 用户名 uid 真实名称"
echo“注意:用户名不应该以下划线开头(它将被脚本附加)”
echo "检查用户是否存在,并获取1000范围内的免费ID号"
echo“例如使用 dscl . -readall /Users UniqueID | sort -nk 2”
回显“”

# 检查我们是否是超级用户(即 $(id -u) 为零)
[`id -u`-eq 0]|| die“此脚本需要以root身份运行”

[ "$#" -eq 3 ] || die "错误:需要 3 个参数:用户名、uid 和 realname"

用户名_=$1
uid_=$2
真实姓名_=$3
nfs_homedir="/var/tmp"
user_shell="/usr/bin/false"

echo "检查用户/组是否存在:\c"

check_uuid=`dscl.-search/用户唯一ID $uid_`
check_upgid=`dscl.-search/用户主要组ID $uid_`
check_urn=`dscl.-search/用户记录名称_$username_`
check_grn=`dscl.-search/Groups RecordName_$username_`


[ ${#check_uuid} = 0 ] || die "失败!\n错误:非唯一用户 UniqueID:\n\n`dscl . -read /Users/_$username_ RecordName PrimaryGroupID RealName` \n\n要查看现有用户/ID,请运行:dscl . -readall /Users UniqueID | sort -nk 2"
[ ${#check_upgid} = 0 ] || die "失败!\n错误:非唯一用户 PrimaryGroupID\n\n`dscl . -read /Users/_$username_ RecordName PrimaryGroupID RealName` \n\n要查看现有用户/ID,请运行:dscl . -readall /Users UniqueID | sort -nk 2"
[ ${#check_urn} = 0 ] || die "失败!\n错误:非唯一用户 RecordName\n\n`dscl . -read /Users/_$username_ RecordName PrimaryGroupID RealName` \n\n要查看现有用户/ID,请运行:dscl . -readall /Users UniqueID | sort -nk 2"
[ ${#check_grn} = 0 ] || die "失败!\n错误:非唯一组 RecordName\n\n`dscl . -read /Groups/_$username_ RecordName PrimaryGroupID RealName` \n\n要查看现有用户/ID,请运行:dscl . -readall /Users UniqueID | sort -nk 2"

回声“我们准备好了!”

# echo "继续 (y/n)?"
# 读取输入
# [ "$input_" = "y" ] || die "如你所愿..."

echo "创建用户:\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_ 密码 \*

dscl .-create /用户/_$用户名_
dscl . -create /Users/_$username_ NFSHomeDirectory $nfs_homedir
dscl . -create /Users/_$username_ 密码 \*
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

回显“完成!”

以及删除用户的脚本:

/bin/sh #!/bin/sh 复制代码
# 删除服务用户,类似于 Linux 的 userdel 命令,但保留文件完整
# 要查看现有用户和 ID,请尝试:
# dscl . -readall /用户唯一 ID | sort -nk 2

死 () {
    回显 >&2 "$@"
    出口 1
}

# 检查我们是否是超级用户(即 $(id -u) 为零)
[`id -u`-eq 0]|| die“此脚本需要以root身份运行”
[ "$#" -eq 1 ] || die "错误:需要用户名参数!"

用户名_=$1

dscl .-delete /用户/$用户名_
dscl .-delete /Groups/$username_

回显“完成!”

相关内容