Ajouter un utilisateur au système * seulement s'il n'existe pas *

47

J'exécute la useradd {user}commande pour ajouter des utilisateurs à mon système, bien que je prévoie de l'exécuter dans un environnement automatisé, qui pourrait éventuellement être réexécuté, même si l'utilisateur existe déjà.

Existe-t-il un moyen de ne pouvoir l'exécuter que si l'utilisateur n'existe pas déjà? L'utilisateur n'a pas de dossier personnel.

Tarnfeld
la source
adduserest généralement préféré sur les systèmes Debian / Ubuntu.
Faheem Mitha
@FaheemMitha Dans les scripts automatisés, il est probablement préférable d'utiliser le plus cohérent useradd.
Le gars avec le chapeau

Réponses:

69

id -u somename renvoie un code de sortie différent de zéro lorsque l'utilisateur n'existe pas.

Vous pouvez le tester tout simplement ... ( &>/dev/nullsupprime simplement la sortie normale / avertissement)

id -u somename &>/dev/null || useradd somename 
Peter.O
la source
1
De manière portable: "id -u somename> / dev / null 2> & 1 || useradd somename"
Tristan
13

essaye ça:

useradd {user} || echo "User already exists."

ou même ceci:

useradd {user} || true
sebaszw
la source
Cela enregistre le contrôle car il échoue en toute sécurité si l'utilisateur existe déjà.
CoverosGene
8

À moins que vous n'ayez qu'une poignée de systèmes, vous posez la mauvaise question. La solution n'est pas d'exécuter useradd du tout, mais de laisser ce travail à une solution de gestion de la configuration telle que marionnette ou chef. Cela permettra de centraliser vos définitions d'utilisateurs et vous empêchera d'exécuter des boucles et d'utiliser ssh avec les utilisateurs root afin de configurer vos systèmes. Vous aurez toujours des systèmes dans un état de configuration connu.

La documentation pour les marionnettes est disponible à http://docs.puppetlabs.com

Par exemple dans la marionnette:

user { "bob" : 
  password   => "$1$yv3n066X$Vpb05Ac/fHTicNdT9T5vz1", # generated with `openssl passwd -1`
  ensure     => present,                              # ensure => absent to remove
  managehome => true,
}
Aaron Brown
la source
4
Puppet est un très bon projet, mais vous ne pouvez pas vous attendre à ce que le PO demande vraiment :)
rahmu
1
Le PO expliquait très clairement l'objectif - automatisé et pouvant être exécuté à nouveau même si l'utilisateur existe (idempotency). Ce sont les cas d'utilisation exacts d'un outil de gestion de la configuration. Quand quelqu'un ne se rend pas compte que des outils existent déjà pour résoudre ces problèmes, il a tendance à poser des questions impliquant la résolution d'un problème très spécifique, étroitement ciblé, lorsqu'un concept plus large doit être saisi.
Aaron Brown
J'utilise déjà Chef.
Tarnfeld
1
Chef ajoutera des utilisateurs uniquement si l'utilisateur n'existe pas. C'est ce qu'est idempotency, alors je ne comprends pas la question (dans un an et demi).
Aaron Brown
4

Si useradd n'ajoute pas l'utilisateur s'il existe déjà, il a l'intention de s'assurer que le numéro et le nom d'utilisateur sont uniques. Si vous prévoyez de parcourir un lot, assurez-vous que les UID utilisés sont uniques. useradd se plaindrait pour les entrées problématiques et vous devez capturer les erreurs / stderr pour voir quels comptes d'utilisateurs ont eu des problèmes pour accéder aux systèmes de comptes (/ etc / passwd, groupe, shadow).

Nikhil Mulley
la source