Answers:
我从par尝试了脚本,发现了一些问题。因此,我为一个特定的用户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文件不会更新。我相信它们会在重启后更新。
编辑:2014年1月9日更新了OS X Mavericks(来自Dave的建议,谢谢!)
我写了一个bash脚本来做到这一点。它将使用小于或等于500的第一个未使用uid(在Mac OS X中为守护程序帐户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"
本文介绍了如何使用dscl创建用户帐户。
dscl /Local/Default -read /Users/_sshd
(dscl /Local/Default -ls /Users
将为您提供本地帐户列表)。请注意,您不必设置所有属性。GeneratedUID是随机生成的,RecordType是自动元数据。而且,大多数OS X系统帐户都有一个以下划线开头的主帐户名,以及一个不带别名的别名,以实现向后兼容。我建议使用下划线约定,但是除非您需要,否则请不要使用纯别名。
这是Dave脚本的一个版本,该脚本还在创建用户/组之前检查该用户/组是否存在:
#!/ bin / sh #创建类似于Linux adduser命令的服务帐户用户 #查看现有用户和ID的方法: #dscl。-readall /用户唯一ID | 排序-nk 2 死 () { 回声>&2“ $ @” 1号出口 } 回声“用法:sudo $ 0用户名uid实名” echo“注释:用户名不应以下划线开头(它将由脚本附加)” echo“,检查用户是否不存在,并获取1000范围内的免费ID号” echo“例如,使用dscl。-readall / Users UniqueID | sort -nk 2” 回声“” #检查我们是超级用户(即$(id -u)为零) [`id -u` -eq 0] || die“此脚本需要以根用户身份运行” [“ $#” -eq 3] || die“错误:需要3个参数:用户名,uid和实名” username _ = $ 1 uid _ = $ 2 实名== $ 3 nfs_homedir =“ / var / tmp” user_shell =“ / usr / bin / false” echo“检查用户/组是否存在:\ c” check_uuid =`dscl。-搜索/用户UniqueID $ uid_` check_upgid =`dscl。搜索/ Users PrimaryGroupID $ uid_` check_urn =`dscl。-搜索/用户RecordName _ $ username_` check_grn =`dscl。搜索/ Groups RecordName _ $ username_` [$ {#check_uuid} = 0] || \ n错误:非唯一用户唯一ID:\ n \ n`dscl。-read / Users / _ $ username_ RecordName PrimaryGroupID RealName` \ n \ n要查看现有用户/ id,请运行:dscl。-readall / Users UniqueID |排序-nk 2“ [$ {#check_upgid} = 0] || \ n错误:非唯一用户PrimaryGroupID \ n \ n`dscl。-read / Users / _ $ username_ RecordName PrimaryGroupID RealName` \ n \ n要查看现有用户/ id,请运行:dscl。-readall / Users UniqueID | -nk 2排序 [$ {#check_urn} = 0] || \ n错误:非唯一用户RecordName \ n \ n`dscl。-read / Users / _ $ username_ RecordName PrimaryGroupID RealName` \ n \ n要查看现有用户/ id,请运行:dscl。-readall / Users UniqueID | -nk 2排序 [$ {#check_grn} = 0] || \ n错误:非唯一组RecordName \ n \ n`dscl。-read / Groups / _ $ username_ RecordName PrimaryGroupID RealName` \ n \ n要查看现有用户/ id,请运行:dscl。-readall / Users UniqueID | -nk 2排序 回声“我们很好!” #echo“继续(y / n)吗?” #读取输入 #[“ $ input_” =“ y”] || 死于“如你所愿...” 回显“创建用户:\ c” dscl。-创建/ Groups / _ $ username_ dscl。-创建/ Groups / _ $ username_ PrimaryGroupID $ uid_ dscl。-创建/ Groups / _ $ username_ RecordName _ $ username_ $ username_ dscl。-创建/ Groups / _ $ username_ RealName“ $ realname_” dscl。-创建/ Groups / _ $ username_密码\ * dscl。-创建/ Users / _ $ username_ dscl。-创建/ Users / _ $ username_ NFSHomeDirectory $ nfs_homedir dscl。-创建/ Users / _ $ username_密码\ * dscl。-创建/ Users / _ $ username_ PrimaryGroupID $ uid_ dscl。-create / Users / _ $ username_ RealName“ $ realname_” dscl。-创建/ Users / _ $ username_ RecordName _ $ username_ $ username_ dscl。-创建/ Users / _ $ username_ UniqueID $ uid_ dscl。-创建/ Users / _ $ username_ UserShell $ user_shell dscl。-删除/ Users / _ $ username_ PasswordPolicyOptions dscl。-删除/ Users / _ $ username_ AuthenticationAuthority 回声“完成!”
以及删除用户的脚本:
#!/ bin / sh #删除服务用户,类似于Linux userdel命令,但保留文件完整 #查看现有用户和ID的方法: #dscl。-readall /用户唯一ID | 排序-nk 2 死 () { 回声>&2“ $ @” 1号出口 } #检查我们是超级用户(即$(id -u)为零) [`id -u` -eq 0] || die“此脚本需要以根用户身份运行” [“ $#” -eq 1] || die“错误:需要用户名参数!” username _ = $ 1 dscl。-删除/ Users / $ username_ dscl。-删除/ Groups / $ username_ 回声“完成!”