dscl é o comando que você está procurando.
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.
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.
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"
Este é um artigo que explica como usar o dscl para criar uma conta de usuário.
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!"