正如主题所说,我正在尝试添加一个新用户。当我运行命令时,它说该用户已经存在。但查看 /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
显示系统在何处查找用户。常见的默认值是files
和compat
,但更复杂的设置可能有多个值,包括诸如ldap
、dns
和之类的值winbind
。files
表示包括的标准文件/etc/passwd
。
我不太清楚 的确切含义compat
,但我阅读手册页表明它是和nsswitch.conf
的组合。是files
nis
nis
网络信息服务虽然现在已被广泛采用,但可能会影响您的系统。
答案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 类型的设置中搜索用户。如果是,您可以执行以下操作之一来解决问题:
从 ldap 服务器中删除用户。
从 /etc/nsswitch.conf 文件中删除 ldap 引用,以便 NSS 库不会在 ldap 服务器中查找用户。
保持 ldap 中的用户原样,但使用 luseradd 命令在系统中创建相同的用户。
luseradd myuser
看看这篇文章https://www.easyaslinux.com/quick-fix/user-already-exists-error-when-user-doesnt-exist-on-the-system/了解详细步骤。