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

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

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

dscl是您正在查找的命令。

我尝试了这个脚本,发现了一些问题。 所以我修改了一个特定用户标识和OS X Mavericks(10.9)。

我发现有几个无关的logging被添加到小牛下的用户帐户 – 一个PasswordPolicyOptions和一个AuthenticationAuthoritylogging – 需要被删除,以正确模仿其他内置的服务用户帐户(如_www)。

我还将密码和实名logging添加到组帐户。

我为WSGI服务帐户创build了一个自定义的脚本。 这里是更新的脚本。

 #! /bin/bash # # Check that we are superuser (ie $(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小牛(戴夫的build议,谢谢!)

我写了一个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的系统用户,它的别名(你要求的名字)有一个匹配的uid和gid(例如499或任何find的)。

这是脚本:

 #!/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来创build用户帐户。

osxdaily.com文章

以下是Dave的脚本的一个版本,它在创build之前还检查用户/组是否存在:

 #!/ bin / sh的
 #创build类似于Linux adduser命令的服务帐户用户
 #查看现有用户和ID请尝试:
 #dscl。  -readall /用户UniqueID | 整理2

死 () {
     echo>&2“$ @”
    出口1
 }

回声“用法:sudo $ 0用户名uid真实姓名”
回声“注意:用户名不应该以下划线开始(它将被脚本附加)”
回声“检查用户不存在,并获得1000范围内的免费身份证号码”
回声“例如与dscl。-readall /用户UniqueID | sort -nk 2”
回声“”

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

 [“$#”-eq 3] || 死“错误:需要3个参数:用户名,用户名和真实姓名”

用户名_ = $ 1
 UID _ = $ 16
实名_ = $ 3
 nfs_homedir = “/ var / tmp中”
 user_shell = “在/ usr /斌/假”

回声“检查用户/组是否存在:\ c”

 check_uuid =`dscl。 search/用户UniqueID $ uid_`
 check_upgid =`dscl。 search/用户PrimaryGroupID $ uid_`
 check_urn =`dscl。  -search / Users RecordName _ $ username_`
 check_grn =`dscl。  -search / Groups RecordName _ $ username_`


 [$ {#check_uuid} = 0] || 死亡“失败!\ nERROR:非唯一用户唯一ID:\ n \ n`dscl。-read / Users / _ $ username_ RecordName PrimaryGroupID RealName` \ n \ n查看现有用户/ ids运行:dscl。-readall / Users UniqueID | sort -nk 2“
 [$ {#check_upgid} = 0] || 死亡“失败!\ nERROR:非唯一用户PrimaryGroupID \ n \ n`dscl。-read / Users / _ $ username_ RecordName PrimaryGroupID RealName` \ n \ n查看现有用户/ ids运行:dscl。-readall / Users UniqueID |分拣2“
 [$ {#check_urn} = 0] ||  die“失败!\ nERROR:非唯一用户logging名\ n \ n \ dscl。-read / Users / _ $ username_ RecordName PrimaryGroupID RealName` \ n \ n查看现有用户/ ids运行:dscl。-readall / Users UniqueID |分拣2“
 [$ {#check_grn} = 0] || 死亡“失败!\ nERROR:非唯一组logging名\ n \ n \ dscl。-read / Groups / _ $ username_ RecordName PrimaryGroupID RealName` \ n \ n查看现有用户/ ids运行:dscl。-readall / Users UniqueID |分拣2“

回声“我们很好走!”

 #echo“Continue(y / n)?”
 #read input_
 #[“$ input_”=“y”] || 死“如你所愿......” 

回声“创build用户:\ 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_ Password \ *

 dscl。  -create / Users / _ $ username_
 dscl。  -create / Users / _ $ username_ NFSHomeDirectory $ nfs_homedir
 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 $ user_shell
 dscl。  -delete / Users / _ $ username_ PasswordPolicyOptions
 dscl。  -delete / Users / _ $ username_ AuthenticationAuthority

回声“完成!”

和一个脚本来删除用户:

 #!/ bin / sh的
 #删除类似于Linux userdel命令的服务用户,但保持文件不变
 #查看现有用户和ID请尝试:
 #dscl。  -readall /用户UniqueID | 整理2

死 () {
     echo>&2“$ @”
    出口1
 }

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

用户名_ = $ 1

 dscl。  -delete / Users / $ username_ 
 dscl。  -delete / Groups / $ username_ 

回声“完成!”