Agregar cuenta de daemon en OS X

9

Estoy tratando de instalar manualmente un daemon (Oracle Grid Engine) en mi máquina, y me gustaría que se ejecute bajo una cuenta aislada. ¿Cuál es la forma preferida, utilizando los servicios de directorio, para agregar una cuenta de "sistema" a la máquina local en OS X? Muchos de ellos existe en / etc / passwd ( _www, _dovecot, etc.), pero los comentarios en la parte superior de esa digamos archivo que no se usa excepto en el modo de un solo usuario.

Estoy ejecutando 10.6 y no necesito ninguna administración especial de cuentas en red. Espero algo simple: el equivalente de useraddcasi todos los demás sistemas operativos tipo Unix.

Tim Yates
fuente

Respuestas:

3

dscl es el comando que está buscando.

Sven
fuente
+1 porque esta es la respuesta definitiva. Si desea una GUI, puede descargar las Herramientas del servidor y señalar Workgroup Manager en su propia máquina para hacer esencialmente lo mismo ..
Johnnie Odom
12

Probé el script desde el par y encontré algunos problemas. Así que lo modifiqué para un ID de usuario específico y para OS X Mavericks (10.9).

Descubrí que había un par de registros extraños agregados a la cuenta de usuario en Mavericks, un PasswordPolicyOptions y un registro AuthenticationAuthority, que debían eliminarse para imitar correctamente otras cuentas de usuario de servicios incorporados (como _www).

También agregué los registros de Contraseña y RealName a la cuenta del Grupo.

Creé un script personalizado, único, solo para una cuenta de servicio WSGI. Aquí está el script actualizado.

#! /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

Tenga en cuenta que después de ejecutar este script, los archivos / etc / passwd y / etc / groups no se actualizan. Creo que se actualizan al reiniciar.

Dave Hein
fuente
1
Gracias Dave Actualicé mi script (a continuación) para usar sus descubrimientos de Mavericks y tomar un parámetro opcional de nombre real.
par
11

EDITAR: actualizado el 9 de enero de 2014 para OS X Mavericks (sugerencias de Dave, ¡gracias!)

Escribí un script bash para hacer esto. Utilizará el primer UID no utilizado que sea menor o igual a 500 (Uid de cuenta de demonio en Mac OS X) que también tiene un GID idéntico no utilizado.

Guarde el script en un archivo llamado add_system_user.shy configúrelo ejecutable con chmod 755 add_system_user.sh.

Entonces, digamos que desea agregar un daemon / usuario del sistema llamado par . Ejecutarías este script así:

sudo add_system_user.sh par

Y obtendrá un usuario del sistema llamado _parque tiene un alias par(el nombre que solicitó) y tiene un uid y gid coincidentes (por ejemplo, 499 o lo que sea que haya encontrado).

Aquí está el guión:

#!/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"
par
fuente
Esto funcionó bien para mí en 10.9. ¡Gracias!
jbyler
2

Aquí hay un artículo que explica cómo usar dscl para crear una cuenta de usuario.

Artículo de osxdaily.com

Joe Block
fuente
Gracias. Las páginas de manual le dicen qué comandos puede usar, pero no le brindan ayuda sobre qué campos usar y en qué configurarlos. Solo iba a copiar la configuración de otra cuenta, pero esto es un buen ejemplo.
Tim Yates
Para una cuenta de sistema oculta, eche un vistazo a algunas cuentas de sistema existentes para obtener mejores ejemplos. Por ejemplo dscl /Local/Default -read /Users/_sshd ( dscl /Local/Default -ls /Usersle conseguirá una lista de cuentas locales). Tenga en cuenta que no tiene que establecer todos los atributos; GeneratedUID se genera aleatoriamente, y RecordType es metadatos automáticos. Además, la mayoría de las cuentas del sistema OS X tienen un nombre de cuenta principal que comienza con un guión bajo y un alias sin él para compatibilidad con versiones anteriores; Recomiendo usar la convención de subrayado, pero no se moleste con el alias simple a menos que lo necesite.
Gordon Davisson el
2

Aquí hay una versión del script de Dave, que también comprueba si el usuario / grupo existe antes de crearlo:

#! / bin / sh
# crea un usuario de cuenta de servicio similar al comando adduser de Linux
# para ver los usuarios e identificadores existentes intente:
# dscl. -readall / Users UniqueID | sort -nk 2

morir () {
    echo> & 2 "$ @"
    salida 1
}

echo "Uso: sudo $ 0 username uid realname"
echo "NOTAS: el nombre de usuario no debe comenzar con el guión bajo (será agregado por el script)"
echo "compruebe que el usuario no existe y obtenga el número de identificación gratuito en el rango 1000"
echo "por ejemplo, con dscl. -readall / Users UniqueID | sort -nk 2"
eco ""

# Compruebe que somos superusuario (es decir, $ (id -u) es cero)
[`id -u` -eq 0] || morir "Este script debe ejecutarse como root"

["$ #" -eq 3] || die "Error: se requieren 3 argumentos: nombre de usuario, uid y nombre real"

nombre de usuario _ = $ 1
uid _ = $ 2
nombre real _ = $ 3
nfs_homedir = "/ var / tmp"
user_shell = "/ usr / bin / false"

echo "Comprobando si el usuario / grupo existe: \ c"

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


[$ {# check_uuid} = 0] || die "falló! \ nERROR: Usuario no único UniqueID: \ n \ n`dscl. -read / Users / _ $ username_ RecordName PrimaryGroupID RealName` \ n \ nPara ver los usuarios / identificadores existentes ejecute: dscl. -readall / Users UniqueID | ordenar -nk 2 "
[$ {# check_upgid} = 0] || die "falló! \ nERROR: Usuario no exclusivo PrimaryGroupID \ n \ n`dscl. -read / Users / _ $ username_ RecordName PrimaryGroupID RealName` \ n \ nPara ver los usuarios / identificadores existentes ejecute: dscl. -readall / Users UniqueID | ordenar -nk 2 "
[$ {# check_urn} = 0] || die "falló! \ nERROR: Nombre de registro de usuario no exclusivo \ n \ n`dscl. -read / Users / _ $ username_ RecordName PrimaryGroupID RealName` \ n \ nPara ver usuarios / id existentes ejecute: dscl. -readall / Users UniqueID | ordenar -nk 2 "
[$ {# check_grn} = 0] || die "falló! \ nERROR: Nombre de registro de grupo no único \ n \ n`dscl. -read / Groups / _ $ username_ RecordName PrimaryGroupID RealName` \ n \ nPara ver los usuarios / identificadores existentes ejecute: dscl. -readall / Users UniqueID | ordenar -nk 2 "

echo "estamos listos para irnos"

# echo "¿Continuar (sí / no)?"
# leer input_
# ["$ input_" = "y"] || muere "como quieras ..."

echo "Creación de usuario: \ c"

dscl. -create / Grupos / _ $ username_
dscl. -create / Groups / _ $ username_ PrimaryGroupID $ uid_
dscl. -create / Grupos / _ $ username_ RecordName _ $ username_ $ username_
dscl. -create / Grupos / _ $ 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

echo "hecho!"

y un script para eliminar usuario:

#! / bin / sh
# eliminar usuario de servicio similar al comando userdel de Linux, pero dejando los archivos intactos
# para ver los usuarios e identificadores existentes intente:
# dscl. -readall / Users UniqueID | sort -nk 2

morir () {
    echo> & 2 "$ @"
    salida 1
}

# Compruebe que somos superusuario (es decir, $ (id -u) es cero)
[`id -u` -eq 0] || morir "Este script debe ejecutarse como root"
["$ #" -eq 1] || die "Error: ¡se requieren argumentos de nombre de usuario!"

nombre de usuario _ = $ 1

dscl. -delete / Users / $ username_
dscl. -delete / Grupos / $ username_

echo "hecho!"
Alex Popov
fuente
Eres un mago, muchas gracias! Funciona en macOS 10.13.
Dmitry Verkhoturov