当用户不存在时,adduser 会说用户存在

当用户不存在时,adduser 会说用户存在

正如主题所说,我正在尝试添加一个新用户。当我运行命令时,它说该用户已经存在。但查看 /etc/passwd、/etc/group 和 /etc/shadow 时显示该用户不存在。

在我的本地机器上运行该命令很好。我在两台机器上都运行着 Ubuntu 11.10。

这是我的终端命令和输出:

root@ws-prod-www-01:~# useradd -s /sbin/nologin -m -d /var/www/html/atc -g 33 -u 10141 atc
useradd: user 'atc' already exists
root@ws-prod-www-01:~# grep atc /etc/passwd
speech-dispatcher:x:111:29:Speech Dispatcher,,,:/var/run/speech-dispatcher:/bin/sh
root@ws-prod-www-01:~# grep atc /etc/shadow
speech-dispatcher:!:15259:0:99999:7:::
root@ws-prod-www-01:~# grep atc /etc/group
root@ws-prod-www-01:~# 

我也尝试过:

root@ws-prod-www-01:~# adduser --shell /sbin/nologin --home /var/www/html/atc --gid 33 --uid 10141 atc
Warning: The home dir /var/www/html/atc you specified already exists.
adduser: The user `atc' already exists.
root@ws-prod-www-01:~# 

有什么想法吗?

答案1

你指定 uid 而不是让系统为你选择一个,有什么理由吗?你可以通过执行 来查看你选择的 id 是否正在使用grep '10141' /etc/passwd。如果是这种情况,那么错误消息肯定有点误导 :/

您的系统也很有可能识别出不在 中的用户/etc/passwd- 例如通过使用 LDAP。一种快速测试方法是执行id atc并查看系统是否识别它。另一种方法是getent passwd atc这也将向您显示系统识别出的不在 中的用户/etc/passwd。或者您可以再次检查 uid 是否正在使用getent passwd 10141。(您也可以运行getent passwd以获取完整的条目列表。)关于 getent 的更多信息

要了解这些用户可能来自哪里,您可以查看/etc/nsswitch.conf手册页) - 开头的行将passwd显示系统在何处查找用户。常见的默认值是filescompat,但更复杂的设置可能有多个值,包括诸如ldapdns和之类的值winbindfiles表示包括的标准文件/etc/passwd

我不太清楚 的确切含义compat,但我阅读手册页表明它是和nsswitch.conf的组合。是filesnisnis网络信息服务虽然现在已被广泛采用,但可能会影响您的系统。

答案2

尝试在终端中输入以下内容

sudo userdel -r atc

这应该会删除用户的所有实例

答案3

在我的例子中,/etc/nsswitch.conf 中有这样的密码:

passwd:     files winbind

该用户位于 Active Directory 中,因此 winbind 在 AD 中看到“现有”用户帐户。

Running:   # service winbind stop

然后运行 ​​useradd 允许我添加用户帐户。

答案4

按照上述答案之一的建议,查看您的 NSS 库文件 /etc/nsswitch.conf,检查系统是否在 LDAP 类型的设置中搜索用户。如果是,您可以执行以下操作之一来解决问题:

  1. 从 ldap 服务器中删除用户。

  2. 从 /etc/nsswitch.conf 文件中删除 ldap 引用,以便 NSS 库不会在 ldap 服务器中查找用户。

  3. 保持 ldap 中的用户原样,但使用 luseradd 命令在系统中创建相同的用户。

    luseradd myuser

看看这篇文章https://www.easyaslinux.com/quick-fix/user-already-exists-error-when-user-doesnt-exist-on-the-system/了解详细步骤。

相关内容