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!"