Добавить пользователя в систему *, только если он не существует *

47

Я запускаю useradd {user}команду для добавления пользователей в свою систему, хотя планирую запустить ее в автоматизированной среде, и она может снова запуститься, даже если пользователь уже существует.

Есть ли способ, которым я могу запустить это, только если пользователь еще не существует? У пользователя нет домашней папки.

tarnfeld
источник
adduserобычно предпочтительнее в системах Debian / Ubuntu.
Фахим Митха
@FaheemMitha В автоматизированных сценариях, вероятно, лучше использовать более согласованные useradd.
Парень со шляпой

Ответы:

69

id -u somename возвращает ненулевой код завершения, когда пользователь не существует.

Вы можете проверить это довольно просто ... ( &>/dev/nullпросто подавляет нормальный вывод / предупреждение)

id -u somename &>/dev/null || useradd somename 
Peter.O
источник
1
Переносимым способом: «id -u somename> / dev / null 2> & 1 || useradd somename»
Тристан,
13

попробуй это:

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

или даже это:

useradd {user} || true
sebaszw
источник
Это сохраняет чек, поскольку он безопасно завершается, если пользователь уже существует.
CoverosGene
8

Если у вас есть только небольшое количество систем, вы задаете неправильный вопрос. Ответ вовсе не в том, чтобы запускать useradd, а в том, чтобы оставить эту работу для решения по управлению конфигурациями, такого как puppet или chef. Это позволит централизовать ваши определения пользователей и не позволит вам запускать циклы и использовать ssh с пользователями root для настройки ваших систем. У вас всегда будут системы в известном состоянии конфигурации.

Документация для кукол доступна на http://docs.puppetlabs.com

Как пример в марионетке:

user { "bob" : 
  password   => "$1$yv3n066X$Vpb05Ac/fHTicNdT9T5vz1", # generated with `openssl passwd -1`
  ensure     => present,                              # ensure => absent to remove
  managehome => true,
}
Аарон Браун
источник
4
Кукольный большой проект, но вы не можете сделать предположение о том , что OP действительно прошу :)
rahmu
1
ОП объяснил цель очень четко - автоматизирован и может быть запущен снова, даже если пользователь существует (идемпотентность). Это точные случаи использования инструмента управления конфигурацией. Когда кто-то не знает, что инструменты для решения этих проблем уже существуют, он склонен задавать вопросы, которые включают решение очень конкретной, узко сфокусированной проблемы, когда есть более обширная концепция, которую нужно понять.
Аарон Браун
Я уже использую Chef.
Тарнфельд
1
Шеф-повар будет добавлять пользователей только в том случае, если пользователь не существует. Вот что такое идемпотентность, поэтому я не понимаю вопроса (через 1,5 года).
Аарон Браун
4

useradd не будет добавлять пользователя снова, если он уже существует, он намерен убедиться, что номер uid и логин uid уникальны. Если вы планируете запустить пакет, убедитесь, что используемые идентификаторы уникальны; useradd будет жаловаться на проблемные записи, и вам нужно перехватить ошибки / stderr, чтобы увидеть, какие учетные записи пользователей имели проблемы при входе в системы учетных записей (/ etc / passwd, group, shadow).

Никхил Мулли
источник