Adicionar conta daemon no OS X

9

Estou tentando instalar manualmente um daemon (Oracle Grid Engine) em minha máquina e gostaria que ele fosse executado em uma conta isolada. Qual é a maneira preferida, usando o Directory Services, para adicionar uma conta de "sistema" à máquina local no OS X? Muitos deles existem em / etc / passwd ( _www , _dovecot , etc.), mas os comentários no topo desse arquivo dizem que ele não é usado, exceto no modo de usuário único.

Estou usando o 10.6 e não preciso de nenhum gerenciamento especial de contas em rede. Eu estou esperando por algo simples - o equivalente a useradd em quase todos os outros SOs parecidos com Unix.

    
por Tim Yates 17.09.2010 / 21:29

5 respostas

3

dscl é o comando que você está procurando.

    
por 17.09.2010 / 21:35
12

Eu tentei o script de par e encontrei alguns problemas. Então eu modifiquei para um userid específico e para o OS X Mavericks (10.9).

Descobri que havia alguns registros externos adicionados à conta do Usuário em Mavericks - um PasswordPolicyOptions e um registro AuthenticationAuthority - que precisavam ser removidos para imitar corretamente outras contas de usuário do serviço interno (como _www).

Também adicionei os registros de senha e nome real à conta do grupo.

Eu criei um script personalizado, exclusivo, apenas para uma conta de serviço WSGI. Aqui está o script atualizado.

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

Note que depois de executar este script, os arquivos / etc / passwd e / etc / groups não são atualizados. Eu acredito que eles são atualizados na reinicialização.

    
por 21.12.2013 / 19:07
11

EDIT: Atualizado 9 de janeiro de 2014 para o OS X Mavericks (sugestões de Dave, obrigado!)

Eu escrevi um script bash para fazer isso. Ele usará o primeiro uid não usado que é menor ou igual a 500 (uids da conta do daemon no Mac OS X) que também tem um gid não usado idêntico.

Salve o script em um arquivo chamado add_system_user.sh e configure-o como executável com chmod 755 add_system_user.sh .

Então, digamos que você queira adicionar um daemon / usuário do sistema chamado par . Você executaria este script assim:

sudo add_system_user.sh par

E você receberá um usuário do sistema chamado _par , que tem o alias de par (o nome que você solicitou) e tem um uid e gid correspondente (por exemplo, 499 ou o que for encontrado).

Aqui está o script:

#!/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"
    
por 22.08.2013 / 10:23
2

Este é um artigo que explica como usar o dscl para criar uma conta de usuário.

artigo do osxdaily.com

    
por 18.09.2010 / 00:06
2

Aqui está uma versão do script de Dave, que também verifica se o usuário / grupo existe antes de criá-lo:

#!/bin/sh
# creates service account user similar to Linux adduser command
# to view existing users and ids try:
# dscl . -readall /Users UniqueID | sort -nk 2

die () {
    echo >&2 "$@"
    exit 1
}

echo "Usage: sudo $0 username uid realname"
echo "NOTES: username shouldn't start with the underscore (it will be appended by the script)"
echo "       check that the user does not exist and get the free ID number in 1000 range"
echo "       e.g. with dscl . -readall /Users UniqueID | sort -nk 2"
echo ""

# Check that we are superuser (i.e. $(id -u) is zero)
[ 'id -u' -eq 0 ] || die "This script needs to run as root"

[ "$#" -eq 3 ] || die "Error: 3 arguments required: username, uid and realname"

username_=$1
uid_=$2
realname_=$3
nfs_homedir="/var/tmp"
user_shell="/usr/bin/false"

echo "Checking if the user/group exists: \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 "failed!\nERROR: Non-unique User UniqueID:\n\n'dscl . -read /Users/_$username_ RecordName PrimaryGroupID RealName' \n\nTo view existing users/ids run: dscl . -readall /Users UniqueID | sort -nk 2"
[ ${#check_upgid} = 0 ] || die "failed!\nERROR: Non-unique User PrimaryGroupID\n\n'dscl . -read /Users/_$username_ RecordName PrimaryGroupID RealName' \n\nTo view existing users/ids run: dscl . -readall /Users UniqueID | sort -nk 2"
[ ${#check_urn} = 0 ] || die "failed!\nERROR: Non-unique User RecordName\n\n'dscl . -read /Users/_$username_ RecordName PrimaryGroupID RealName' \n\nTo view existing users/ids run: dscl . -readall /Users UniqueID | sort -nk 2"
[ ${#check_grn} = 0 ] || die "failed!\nERROR: Non-unique Group RecordName\n\n'dscl . -read /Groups/_$username_ RecordName PrimaryGroupID RealName' \n\nTo view existing users/ids run: dscl . -readall /Users UniqueID | sort -nk 2"

echo "we're good to go!"

# echo "Continue (y/n) ? "
# read input_
# [ "$input_" = "y" ] || die "as you wish..." 

echo "Creating User: \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

echo "done!"

e um script para excluir usuário:

#!/bin/sh
# delete service user similar to Linux userdel command, but leaving the files intact
# to view existing users and ids try:
# dscl . -readall /Users UniqueID | sort -nk 2

die () {
    echo >&2 "$@"
    exit 1
}

# Check that we are superuser (i.e. $(id -u) is zero)
[ 'id -u' -eq 0 ] || die "This script needs to run as root"
[ "$#" -eq 1 ] || die "Error: username arguments is required!"

username_=$1

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

echo "done!"
    
por 21.03.2015 / 01:01