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.

Respostas:


3

dscl é o comando que você está procurando.


+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.


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"

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


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

Você é um mágico, muito obrigado! Funciona no macOS 10.13.
— Dmitry Verkhoturov 28/01
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.