Ajouter un compte démon sur OS X

9

J'essaie d'installer manuellement un démon (Oracle Grid Engine) sur ma machine, et je voudrais qu'il s'exécute sous un compte isolé. Quelle est la meilleure façon, en utilisant les services d'annuaire, d'ajouter un compte "système" à la machine locale sous OS X? Beaucoup d'entre eux existent dans / etc / passwd ( _www, _dovecot, etc.), mais les commentaires en haut de ce mot de fichier qu'il ne soit pas utilisé , sauf en mode mono-utilisateur.

J'exécute sur 10.6 et ne nécessite aucune gestion de compte en réseau spéciale. J'espère quelque chose de simple - l'équivalent de useraddsur presque tous les autres systèmes d'exploitation de type Unix.

Tim Yates
la source

Réponses:

3

dscl est la commande que vous recherchez.

Sven
la source
+1 parce que c'est la réponse définitive. Si vous voulez une interface graphique, vous pouvez télécharger les outils serveur et diriger le gestionnaire de groupe de travail sur votre propre machine pour faire essentiellement la même chose.
Johnnie Odom
12

J'ai essayé le script du pair et j'ai trouvé quelques problèmes. Je l'ai donc modifié pour un ID utilisateur spécifique et pour OS X Mavericks (10.9).

J'ai constaté qu'il y avait quelques enregistrements étrangers ajoutés au compte d'utilisateur sous Mavericks - un mot de passePolicyOptions et un enregistrement AuthenticationAuthority - qui devaient être supprimés pour imiter correctement d'autres comptes d'utilisateurs de services intégrés (comme _www).

J'ai également ajouté les enregistrements Password et RealName au compte Group.

J'ai créé un script personnalisé unique pour un compte de service WSGI. Voici le script mis à jour.

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

Notez qu'après avoir exécuté ce script, les fichiers / etc / passwd et / etc / groups ne sont pas mis à jour. Je pense qu'ils sont mis à jour au redémarrage.

Dave Hein
la source
1
Merci Dave. J'ai mis à jour mon script (ci-dessous) pour utiliser vos découvertes Mavericks et prendre un paramètre de nom réel facultatif.
par
11

EDIT: Mis à jour le 9 janvier 2014 pour OS X Mavericks (suggestions de Dave, merci!)

J'ai écrit un script bash pour ce faire. Il utilisera le premier UID inutilisé qui est inférieur ou égal à 500 (UID de compte démon sur Mac OS X) qui a également un GID inutilisé identique.

Enregistrez le script dans un fichier nommé add_system_user.shet définissez-le exécutable avec chmod 755 add_system_user.sh.

Supposons ensuite que vous souhaitiez ajouter un utilisateur démon / système appelé par . Vous exécuteriez ce script comme ceci:

sudo add_system_user.sh par

Et vous obtiendrez un utilisateur système appelé _parqui a un alias pour par(le nom que vous avez demandé) et a un uid et un gid correspondants (par exemple 499 ou tout ce qu'il a trouvé).

Voici le 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
la source
Cela a bien fonctionné pour moi sur 10,9. Merci!
jbyler
2

Voici un article qui explique comment utiliser dscl pour créer un compte utilisateur.

article osxdaily.com

Joe Block
la source
Merci. Les pages de manuel vous indiquent quelles commandes vous pouvez utiliser, mais ne vous donnent aucune aide sur les champs à utiliser et sur quoi les définir. J'allais juste copier la config d'un autre compte, mais cela donne un bon exemple.
Tim Yates
Pour un compte système masqué, consultez certains comptes système existants pour de meilleurs exemples. Par exemple dscl /Local/Default -read /Users/_sshd ( dscl /Local/Default -ls /Usersvous obtiendrez une liste des comptes locaux). Notez que vous n'avez pas besoin de définir tous les attributs; GeneratedUID est généré de manière aléatoire et RecordType est des métadonnées automatiques. De plus, la plupart des comptes système OS X ont un nom de compte principal qui commence par un trait de soulignement et un alias sans celui-ci pour une compatibilité descendante; Je recommande d'utiliser la convention de soulignement, mais ne vous embêtez pas avec l'alias simple, sauf si vous en avez besoin.
Gordon Davisson
2

Voici une version du script de Dave, qui vérifie également si l'utilisateur / le groupe existe avant de le créer:

#! / bin / sh
# crée un utilisateur de compte de service similaire à la commande Linux adduser
# pour afficher les utilisateurs et identifiants existants, essayez:
# dscl. -readall / Users UniqueID | sort -nk 2

mourir () {
    echo> & 2 "$ @"
    sortie 1
}

echo "Utilisation: sudo $ 0 username uid realname"
echo "REMARQUES: le nom d'utilisateur ne doit pas commencer par le trait de soulignement (il sera ajouté par le script)"
echo "vérifiez que l'utilisateur n'existe pas et obtenez le numéro d'identification gratuit dans la plage 1000"
echo "par exemple avec dscl. -readall / Users UniqueID | sort -nk 2"
écho ""

# Vérifiez que nous sommes superutilisateur (ie $ (id -u) est nul)
[`id -u` -eq 0] || die "Ce script doit s'exécuter en tant que root"

["$ #" -eq 3] || die "Erreur: 3 arguments requis: nom d'utilisateur, uid et realname"

nom d'utilisateur _ = $ 1
uid _ = $ 2
realname _ = $ 3
nfs_homedir = "/ var / tmp"
user_shell = "/ usr / bin / false"

echo "Vérification de l'existence de l'utilisateur / groupe: \ 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 "a échoué! \ nERREUR: ID unique de l'utilisateur non unique: \ n \ n`dscl. -read / Users / _ $ username_ RecordName PrimaryGroupID RealName` \ n \ nPour afficher les utilisateurs / identifiants existants, exécutez: dscl. -readall / Users UniqueID | sort -nk 2 "
[$ {# check_upgid} = 0] || die "a échoué! \ nERREUR: utilisateur non unique PrimaryGroupID \ n \ n`dscl. -read / Users / _ $ username_ RecordName PrimaryGroupID RealName` \ n \ nPour afficher les utilisateurs / identifiants existants exécutez: dscl. -readall / Users UniqueID | sort -nk 2 "
[$ {# check_urn} = 0] || die "a échoué! \ nERREUR: utilisateur non unique RecordName \ n \ n`dscl. -read / Users / _ $ username_ RecordName PrimaryGroupID RealName` \ n \ nPour afficher les utilisateurs / identifiants existants exécutez: dscl. -readall / Users UniqueID | sort -nk 2 "
[$ {# check_grn} = 0] || die "a échoué! \ nERREUR: nom d'enregistrement de groupe non unique \ n \ n`dscl. -read / Groups / _ $ username_ RecordName PrimaryGroupID RealName` \ n \ nPour afficher les utilisateurs / identifiants existants, exécutez: dscl. -readall / Users UniqueID | sort -nk 2 "

écho "nous sommes prêts à partir!"

# echo "Continuer (o / n)?"
# read input_
# ["$ input_" = "y"] || mourir "comme vous le souhaitez ..."

echo "Création d'un utilisateur: \ c"

dscl. -créer / Groupes / _ $ username_
dscl. -créer / Groupes / _ $ username_ PrimaryGroupID $ uid_
dscl. -créer / Groupes / _ $ username_ RecordName _ $ username_ $ username_
dscl. -créer / Groupes / _ $ username_ RealName "$ realname_"
dscl. -créer / Groupes / _ $ username_ Password \ *

dscl. -créer / Utilisateurs / _ $ username_
dscl. -créer / Utilisateurs / _ $ nom_utilisateur_ NFSHomeDirectory $ nfs_homedir
dscl. -créer / Utilisateurs / _ $ username_ Password \ *
dscl. -créer / Utilisateurs / _ $ username_ PrimaryGroupID $ uid_
dscl. -créer / Utilisateurs / _ $ username_ RealName "$ realname_"
dscl. -créer / Utilisateurs / _ $ username_ RecordName _ $ username_ $ username_
dscl. -créer / Utilisateurs / _ $ username_ UniqueID $ uid_
dscl. -créer / Utilisateurs / _ $ username_ UserShell $ user_shell
dscl. -delete / Users / _ $ username_ PasswordPolicyOptions
dscl. -delete / Users / _ $ username_ AuthenticationAuthority

écho "terminé!"

et un script pour supprimer l'utilisateur:

#! / bin / sh
# delete service user similaire à la commande Linux userdel, mais en laissant les fichiers intacts
# pour afficher les utilisateurs et identifiants existants, essayez:
# dscl. -readall / Users UniqueID | sort -nk 2

mourir () {
    echo> & 2 "$ @"
    sortie 1
}

# Vérifiez que nous sommes superutilisateur (ie $ (id -u) est nul)
[`id -u` -eq 0] || die "Ce script doit s'exécuter en tant que root"
["$ #" -eq 1] || die "Erreur: des arguments de nom d'utilisateur sont requis!"

nom d'utilisateur _ = $ 1

dscl. -delete / Users / $ username_
dscl. -supprimer / Groupes / $ username_

écho "terminé!"
Alex Popov
la source
Vous êtes magicien, merci beaucoup! Fonctionne sous macOS 10.13.
Dmitry Verkhoturov