我正在尝试手动在我的计算机上安装守护程序 (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_ 回显“完成!”