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


9

我正在尝试在计算机上手动安装守护程序(Oracle Grid Engine),并且希望它在一个独立帐户下运行。使用目录服务将“系统”帐户添加到OS X上的本地计算机的首选方法是什么?/ etc / passwd(_www_dovecot等等)中存在大量这些文件,但是该文件顶部的注释说只有单用户模式才使用该文件。

我运行的是10.6,不需要任何特殊的网络帐户管理。我希望有一些简单的东西- useradd几乎在所有其他类似Unix的操作系统上都可以实现。

Answers:


3

dscl是您要查找的命令。


+1,因为这是确定的答案。如果你想有一个图形用户界面,你可以在你自己的机器基本上做同样的事情下载服务器工具和点工作组管理..
杜琪峰奥多姆

12

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


1
谢谢戴夫。我更新了我的脚本(如下),以使用您的Mavericks发现并接受一个可选的实名参数。
2014年

11

编辑: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"

这对我来说在10.9上效果很好。谢谢!
jbyler 2014年

2

本文介绍了如何使用dscl创建用户帐户。

osxdaily.com文章


谢谢。手册页告诉您可以使用哪些命令,但对于使用哪些字段以及将其设置为什么没有提供任何帮助。我只是打算从另一个帐户复制配置,但这提供了一个很好的例子。
蒂姆·耶茨

对于隐藏的系统帐户,请查看一些现有的系统帐户以获取更好的示例。例如dscl /Local/Default -read /Users/_sshddscl /Local/Default -ls /Users将为您提供本地帐户列表)。请注意,您不必设置所有属性。GeneratedUID是随机生成的,RecordType是自动元数据。而且,大多数OS X系统帐户都有一个以下划线开头的主帐户名,以及一个不带别名的别名,以实现向后兼容。我建议使用下划线约定,但是除非您需要,否则请不要使用纯别名。
戈登·戴维森

2

这是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_

回声“完成!”

您是魔术师,非常感谢!在macOS 10.13中工作。
德米特里·韦克霍图洛夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.