Adicionar conta daemon no OS X

9

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

Estou executando o 10.6 e não preciso de nenhum gerenciamento de contas em rede especial. Espero algo simples - o equivalente useradda quase todos os outros sistemas operacionais semelhantes ao Unix.

Tim Yates
fonte

Respostas:

3

dscl é o comando que você está procurando.

Sven
fonte
+1 porque esta é a resposta definitiva. Se você quer um GUI, você pode baixar as ferramentas de servidor e ponto Workgroup gerente em sua própria máquina de fazer essencialmente a mesma coisa ..
Johnnie Odom
12

Eu tentei o script do par e encontrei alguns problemas. Então, modifiquei-o para uma identificação de usuário específica e para o OS X Mavericks (10.9).

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

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

Criei um script único e personalizado 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

Observe que após a execução desse script, os arquivos / etc / passwd e / etc / groups não são atualizados. Eu acredito que eles são atualizados na reinicialização.

Dave Hein
fonte
1
Obrigado Dave. Atualizei meu script (abaixo) para usar suas descobertas do Mavericks e usar um parâmetro opcional de nome real.
Par
11

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

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

Salve o script em um arquivo nomeado add_system_user.she defina-o como executável chmod 755 add_system_user.sh.

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

sudo add_system_user.sh par

E você receberá um usuário do sistema chamado _paralias par(o nome que você solicitou) e que possui 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"
par
fonte
Isso funcionou bem para mim no 10.9. Obrigado!
Jbyler #
2

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

artigo de osxdaily.com

Joe Block
fonte
Obrigado. As páginas do manual informam quais comandos você pode usar, mas não dão nenhuma ajuda sobre quais campos usar e em que defini-los. Eu estava apenas indo para copiar a configuração de outra conta, mas isso dá um bom exemplo.
Tim Yates
Para uma conta oculta do sistema, consulte algumas contas existentes do sistema para obter melhores exemplos. Por exemplo dscl /Local/Default -read /Users/_sshd ( dscl /Local/Default -ls /Usersvocê receberá uma lista de contas locais). Observe que você não precisa definir todos os atributos; GeneratedUID é gerado aleatoriamente e RecordType são metadados automáticos. Além disso, a maioria das contas do sistema OS X tem um nome de conta principal que começa com sublinhado e um alias sem ele para compatibilidade com versões anteriores; Eu recomendo usar a convenção de sublinhado, mas não se preocupe com o alias simples, a menos que você precise.
Gordon Davisson
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
# cria usuário de conta de serviço semelhante ao comando Linux adduser
# para visualizar usuários e IDs existentes, tente:
# dscl. -readall / Usuários UniqueID | sort -nk 2

die () {
    eco> & 2 "$ @"
    saída 1
}

eco "Uso: sudo $ 0 nome de usuário uid nome real"
eco "OBSERVAÇÕES: o nome de usuário não deve começar com o sublinhado (será anexado pelo script)"
echo "verifique se o usuário não existe e obtenha o número de identificação gratuito no intervalo de 1000"
echo "por exemplo, com dscl. -readall / Users UniqueID | sort -nk 2"
eco ""

# Verifique se somos superusuário (ou seja, $ (id -u) é zero)
[`id -u` -eq 0] || die "Este script precisa ser executado como root"

["$ #" -eq 3] || die "Erro: são necessários 3 argumentos: nome de usuário, uid e nome real"

nome de usuário _ = $ 1
uid _ = $ 2
realname _ = $ 3
nfs_homedir = "/ var / tmp"
user_shell = "/ usr / bin / false"

echo "Verificando se o usuário / grupo existe: \ c"

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


[$ {# check_uuid} = 0] || die "falhou! \ nERROR: ID exclusivo do usuário não exclusivo: \ n \ n`dscl. -read / Users / _ $ nome_do_usuário RecordName PrimaryGroupID RealName` \ n \ nPara exibir os usuários / IDs existentes, execute: dscl. -readall / Users UniqueID | sort -nk 2 "
[$ {# check_upgid} = 0] || morre "falhou! \ nERROR: Usuário não exclusivo PrimaryGroupID \ n \ n`dscl. -read / Users / _ $ username_ RecordName PrimaryGroupID RealName` \ n \ nPara exibir os usuários / IDs existentes, execute: dscl. -readall / Users UniqueID | classificar -nk 2 "
[$ {# check_urn} = 0] || morre "falhou! \ nERRO: Usuário não exclusivo RecordName \ n \ n`dscl. -read / Users / _ $ nome_do_usuário RecordName PrimaryGroupID RealName` \ n \ nPara exibir os usuários / IDs existentes, execute: dscl. -readall / Users UniqueID | classificar -nk 2 "
[$ {# check_grn} = 0] || die "falhou! \ nERROR: Nome de registro de grupo não exclusivo \ n \ n`dscl. -read / Groups / _ $ nome_do_usuário RecordName PrimaryGroupID RealName` \ n \ nPara exibir os usuários / IDs existentes, execute: dscl. -readall / Users UniqueID | classificar -nk 2 "

eco "estamos prontos para ir!"

# echo "Continuar (s / n)?"
# leia input_
# ["$ input_" = "y"] || morra "como você deseja ..."

eco "Criando usuário: \ c"

dscl. -criar / Grupos / _ $ username_
dscl. -criar / Grupos / _ $ nomedeusuário_ PrimaryGroupID $ uid_
dscl. -criar / Grupos / _ $ nomedeusuário_ RecordName _ $ nomedeusuário_ $ nomedeusuário_
dscl. -criar / Grupos / _ $ username_ RealName "$ realname_"
dscl. -criar / Grupos / _ $ username_ Senha \ *

dscl. -criar / Usuários / _ $ username_
dscl. -criar / Usuários / _ $ nomedeusuário NFSHomeDirectory $ nfs_homedir
dscl. -criar / Usuários / _ $ username_ Senha \ *
dscl. -criar / Usuários / _ $ username_ PrimaryGroupID $ uid_
dscl. -criar / Usuários / _ $ username_ RealName "$ realname_"
dscl. -criar / Usuários / _ $ nomedeusuário_ RecordName _ $ nomedeusuário_ $ nomedeusuário_
dscl. -criar / Usuários / _ $ username_ UniqueID $ uid_
dscl. -criar / Usuários / _ $ username_ UserShell $ user_shell
dscl. -delete / Users / _ $ username_ PasswordPolicyOptions
dscl. -delete / Users / _ $ username_ AuthenticationAuthority

eco "pronto!"

e um script para excluir o usuário:

#! / bin / sh
# delete user user similar ao comando Linux userdel, mas deixando os arquivos intactos
# para visualizar usuários e IDs existentes, tente:
# dscl. -readall / Usuários UniqueID | sort -nk 2

die () {
    eco> & 2 "$ @"
    saída 1
}

# Verifique se somos superusuário (ou seja, $ (id -u) é zero)
[`id -u` -eq 0] || die "Este script precisa ser executado como root"
["$ #" -eq 1] || die "Erro: argumentos de nome de usuário são necessários!"

nome de usuário _ = $ 1

dscl. -delete / Usuários / $ nome_de_usuário
dscl. -delete / Groups / $ nome_de_usuário

eco "pronto!"
Alex Popov
fonte
Você é um mágico, muito obrigado! Funciona no macOS 10.13.
Dmitry Verkhoturov 28/01