*仅在用户不存在时将其添加到系统中*


46

useradd {user}尽管我计划在自动化环境中运行此命令,但是我一直在运行将该命令添加到系统中的命令,即使用户已经存在,它也可能最终再次运行。

有没有一种方法可以仅在用户不存在的情况下运行?用户没有主文件夹。


adduser通常在Debian / Ubuntu系统上是首选。
Faheem Mitha 2012年

@FaheemMitha在自动脚本中,最好使用更一致的useradd
帽子的家伙

Answers:


68

id -u somename 当用户不存在时,返回非零退出代码。

您可以非常简单地对其进行测试...(&>/dev/null只是限制了正常的输出/警告)

id -u somename &>/dev/null || useradd somename 

1
以一种可移植的方式:“ id -u somename> / dev / null 2>&1 || useradd somename”
Tristan

13

尝试这个:

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

甚至这个:

useradd {user} || true

这样可以节省检查,因为如果用户已经存在,检查会安全失败。
CoverosGene

8

除非只有少数几个系统,否则您会问错问题。答案是根本不运行useradd,而是将这项工作留给诸如puppet或Chef的配置管理解决方案。这将使您的用户定义集中化,并防止您运行循环并与root用户一起使用ssh来配置系统。您将始终使系统处于已知配置状态。

有关puppet的文档,请访问http://docs.puppetlabs.com。

以in为例:

user { "bob" : 
  password   => "$1$yv3n066X$Vpb05Ac/fHTicNdT9T5vz1", # generated with `openssl passwd -1`
  ensure     => present,                              # ensure => absent to remove
  managehome => true,
}

4
Puppet是一个很棒的项目,但是您无法对OP真正询问的内容做出假设:)
rahmu 2012年

1
OP非常清楚地说明了该目标-自动化并且即使用户存在也可以再次运行(幂等)。这些是配置管理工具的确切用例。当某人不知道已经存在解决这些问题的工具时,他们往往会提出一些问题,这些问题涉及解决一个非常具体的,关注范围狭窄的问题,而这是一个更大的概念需要掌握。
亚伦·布朗

我已经在用Chef。
tarnfeld 2013年

1
如果用户不存在,Chef只会添加用户。那就是幂等,所以我不明白这个问题(现在已有1.5年了)。
亚伦·布朗

4

如果用户已经存在,则useradd不会再次添加该用户,这是为了确保uid号和uid登录名是唯一的。如果您打算分批运行,请确保使用的uid是唯一的;useradd会抱怨条目有问题,您需要捕获错误/ stderr,以查看哪些用户帐户在进入帐户系统时遇到问题(/ etc / passwd,group,shadow)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.