Aggiungi account demone su OS X


9

Sto cercando di installare manualmente un demone (Oracle Grid Engine) sul mio computer e vorrei che funzionasse con un account isolato. Qual è il modo preferito, utilizzando Directory Services, per aggiungere un account "di sistema" al computer locale su OS X? Un sacco di loro esiste in / etc / passwd ( _www, _dovecot, ecc), ma i commenti nella parte superiore del file dire che non viene utilizzato se non in modalità utente singolo.

Sono in esecuzione su 10.6 e non richiede alcuna gestione account in rete speciale. Spero in qualcosa di semplice - l'equivalente di useraddquasi tutti gli altri sistemi operativi simili a Unix.

Risposte:


3

dscl è il comando che stai cercando.


+1 perché questa è la risposta definitiva. Se vuoi una GUI, puoi scaricare gli Strumenti del server e indirizzare Workgroup Manager sul tuo computer per fare essenzialmente la stessa cosa.
Johnnie Odom,

12

Ho provato la sceneggiatura alla pari e ho riscontrato alcuni problemi. Quindi l'ho modificato per uno userid specifico e per OS X Mavericks (10.9).

Ho scoperto che c'erano un paio di record estranei aggiunti all'account utente in Mavericks - un PasswordPolicyOptions e un record AuthenticationAuthority - che dovevano essere rimossi per imitare correttamente altri account utente del servizio integrato (come _www).

Ho anche aggiunto i record Password e RealName all'account del gruppo.

Ho creato uno script personalizzato, una tantum, solo per un account del servizio WSGI. Ecco lo script aggiornato.

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

Nota che dopo aver eseguito questo script i file / etc / passwd e / etc / groups non vengono aggiornati. Credo che vengano aggiornati al riavvio.


1
Grazie Dave. Ho aggiornato il mio script (di seguito) per utilizzare le scoperte di Mavericks e prendere un parametro facoltativo di nome reale.
Par

11

EDIT: aggiornato il 9 gennaio 2014 per OS X Mavericks (suggerimenti di Dave, grazie!)

Ho scritto uno script bash per farlo. Userà il primo uid inutilizzato che è inferiore o uguale a 500 (uid account demone su Mac OS X) che ha anche un identico gid inutilizzato.

Salvare lo script in un file denominato add_system_user.she impostarlo come eseguibile chmod 755 add_system_user.sh.

Quindi supponiamo che tu voglia aggiungere un utente demone / sistema chiamato par . Eseguiresti questo script in questo modo:

sudo add_system_user.sh par

E otterrai un utente di sistema chiamato _parche è alias par(il nome che hai richiesto) e ha un uid e un gid corrispondenti (ad esempio 499 o qualunque cosa abbia trovato).

Ecco la sceneggiatura:

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

Questo ha funzionato bene per me il 10.9. Grazie!
jbyler,

2

Ecco un articolo che spiega come utilizzare dscl per creare un account utente.

articolo osxdaily.com


Grazie. Le pagine man ti dicono quali comandi puoi usare, ma non ti danno alcun aiuto su quali campi usare e su cosa impostarli. Stavo per copiare la configurazione da un altro account, ma questo dà un buon esempio.
Tim Yates,

Per un account di sistema nascosto, dai un'occhiata ad alcuni account di sistema esistenti per esempi migliori. Ad esempio dscl /Local/Default -read /Users/_sshd ( dscl /Local/Default -ls /Usersti fornirà un elenco di account locali). Si noti che non è necessario impostare tutti gli attributi; GeneratedUID viene generato in modo casuale e RecordType è metadati automatici. Inoltre, la maggior parte degli account di sistema di OS X ha un nome account principale che inizia con il trattino basso e un alias senza di esso per compatibilità con le versioni precedenti; Consiglio di usare la convenzione di sottolineatura, ma non preoccuparti del semplice alias a meno che non sia necessario.
Gordon Davisson,

2

Ecco una versione dello script di Dave, che controlla anche se l'utente / gruppo esiste prima di crearlo:

#! / Bin / sh
# crea un account utente del servizio simile al comando adduser Linux
# per visualizzare gli utenti e gli ID esistenti provare:
# dscl. -readall / Users UniqueID | ordina -nk 2

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

echo "Utilizzo: sudo $ 0 nome utente uid realname"
echo "NOTE: il nome utente non deve iniziare con il carattere di sottolineatura (verrà aggiunto dallo script)"
echo "verifica che l'utente non esista e ottieni il numero ID gratuito nell'intervallo 1000"
echo "ad es. con dscl. -readall / Users UniqueID | sort -nk 2"
eco ""

# Verifica che siamo superutente (ovvero $ (id -u) è zero)
[`id -u` -eq 0] || die "Questo script deve funzionare come root"

["$ #" -eq 3] || die "Errore: 3 argomenti richiesti: username, uid e realname"

nome utente _ = $ 1
uid = $ _ 2
realname _ = $ 3
nfs_homedir = "/ var / tmp"
user_shell = "/ usr / bin / false"

echo "Verifica dell'esistenza dell'utente / gruppo: \ c"

check_uuid = `dscl. -search / Users UniqueID $ uid_`
check_upgid = `dscl. -search / Users PrimaryGroupID $ uid_`
check_urn = `dscl. -search / Nome record utenti _ $ nome_utente_`
check_grn = `dscl. -search / Gruppi RecordName _ $ username_`


[$ {# check_uuid} = 0] || die "fallito! \ nERROR: ID utente univoco non unico: \ n \ n`dscl. -read / Users / _ $ nome_utente Nome record ID gruppo primario Nome reale` \ n \ nPer visualizzare gli utenti / ID esistenti eseguire: dscl. -readall / Users UniqueID | sort -nk 2 "
[$ {# check_upgid} = 0] || die "fallito! \ nERROR: ID gruppo primario utente non unico \ n \ n`dscl. -read / Users / _ $ nome_utente Nome record ID gruppo primario Nome reale` \ n \ nPer visualizzare gli utenti / ID esistenti eseguire: dscl. -readall / Users UniqueID | ordina -nk 2 "
[$ {# check_urn} = 0] || die "fallito! \ nERROR: RecordName utente non univoco \ n \ n`dscl. -read / Users / _ $ username_ RecordName PrimaryGroupID Nome reale` \ n \ nPer visualizzare gli utenti / ID esistenti eseguire: dscl. -readall / Users UniqueID | ordina -nk 2 "
[$ {# check_grn} = 0] || die "fallito! \ nERROR: RecordName di gruppo non univoco \ n \ n`dscl. -read / Groups / _ $ username_ RecordName PrimaryGroupID Nome reale` \ n \ nPer visualizzare gli utenti / ID esistenti eseguire: dscl. -readall / Users UniqueID | ordina -nk 2 "

echo "siamo pronti per partire!"

# echo "Continua (sì / no)?"
# leggi input_
# ["$ input_" = "y"] || muori "come desideri ..."

echo "Creazione utente: \ 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 "fatto!"

e uno script per eliminare l'utente:

#! / Bin / sh
# elimina l'utente del servizio simile al comando userdel di Linux, ma lasciando intatti i file
# per visualizzare gli utenti e gli ID esistenti provare:
# dscl. -readall / Users UniqueID | ordina -nk 2

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

# Verifica che siamo superutente (ovvero $ (id -u) è zero)
[`id -u` -eq 0] || die "Questo script deve funzionare come root"
["$ #" -eq 1] || die "Errore: sono richiesti argomenti nome utente!"

nome utente _ = $ 1

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

echo "fatto!"

Sei un mago, grazie mille! Funziona in macOS 10.13.
Dmitry Verkhoturov,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.