Centos7系统上创建用户时出现“useradd: user 'xxxx' already exists”错误
背景:
Centos7上需要创建一个用户leojiang
,而用户时间不纯在系统上,但是还是报错说用户已经存在。
1、假设您正在尝试添加一个名为“leojiang”的用户并且您收到以下错误。
[root@leo]# useradd -m -d /home/addmunx -s /bin/sh leojiang
useradd: user 'leojiang' already exists
2、调查,先查看系统上是否存在这个用户leojiang
[root@leo]# cat /etc/passwd |grep leojiang
[root@leo]#
-
/etc/shadow 文件,用于存储 Linux 系统中用户的密码信息,又称为“影子文件”。
-
/etc/shadow 文件只有 root 用户拥有读权限,其他用户没有任何权限,这样就保证了用户密码的安全性。
并没有返回结果,代表这个用户并不在密码文件中
3、运行getent命令从名称服务切换库(Name Service Switch)中获取
- getent命令可以用来察看系统的数据库中的相关记录
[root@leo]# getent passwd leojiang
leojiang:*:1136335162:1782600513:ADDM account to scan Unix server:/home/leojiang:/bin/bash
可以看到此用户已经存在名称服务(Name Service Switch)库的某个地方。是否注意到输出的第二列中有一些不寻常的地方?用 * 代替 x 清楚地表明用户的密码没有存储在 /etc/shadow 文件中。
4、来让我们找到它,深入研究名称服务切换库配置文件。
先了解什么是sssd:
- sssd是一款用以取代ldap和AD的软件,ldap客户端部署sssd,是用来启用ldap认证。
- /etc/nsswitch.conf 来告诉name service switch需要查找那些地方来给登录的用户服务。
- files sss 表示先查找/etc/passwd, /etc/group等文件,没有的话再查找sss模块。
[root@leo]# cat /etc/nsswitch.conf | grep passwd
#passwd: db files nisplus nis
passwd: files sss
通过上面提到的 sss ,NSS 库被指示在 LDAP 中搜索用户(sss被配置为 LDAP 客户端)。现在很清楚,LDAP 中存在用户leojiang
,这就是您无法在系统中创建相同用户的原因。
5、解决方案
现在我们找到了问题的根本原因。现在您可以执行以下操作之一来解决问题:
- 5.1. 从 ldap 服务器中删除用户。
- 5.2. 从 /etc/nsswitch.conf 文件中删除 ldap 引用,以便 NSS 库不会在 ldap 服务器中查找用户。
- 5.3. 将用户原样保留在 ldap 中,但在系统中创建相同的用户!让我解释一下我们是如何做的。
- 5.4. 关闭sssd ladp客户端服务,之后便可创建用户,创建完成后再启动sssd即可
5.3、使用方法
在某些情况下,即使 ldap 中存在相同的用户名,您仍然需要创建系统用户。是的,我们可以使用 luseradd 命令来完成。
[root@leo]# yum install libuser
[root@leo]# luseradd -m -d /home/addmunx -s /bin/sh leojiang
注意:CentOS/Redhat 默认安装了这个命令。如果找不到,请尝试使用上述命令安装它。
5.4、使用方法
[root@leo]# systemctl status sssd && systemctl stop sssd
# 停止sssd服务后再创建用户即可
[root@leo]# luseradd -m -d /home/addmunx -s /bin/sh leojiang
# 创建完成后再启动sssd服务
[root@leo]# systemctl start sssd