1 背景
新建了一个用户linc,后来发现有一些问题,将该用户删除,脚本如下:
userdel linc
随后我再次新建一个相同名称的用户,麻烦来了,报错:Creating mailbox file: File exists,如下:
[root@instance-jgzzg4xl home]# userdel linc
[root@instance-jgzzg4xl home]# ll
total 16
drwx------ 2 huar huar 4096 Oct 31 13:25 huar
drwx------ 4 jiangms jiangms 4096 Aug 19 14:45 jiangms
drwx------ 2 488 1003 4096 Oct 31 13:25 linc
drwx------ 4 songj developer 4096 Oct 31 13:24 songj
[root@instance-jgzzg4xl home]# useradd linc
useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.
Creating mailbox file: File exists
我们可以看到,在我们删除后,在/home/文件夹下依然存在/luzs/主目录,猜测的原因是因为在删除的时候未把相关信息删除干净。那么我们把主目录给删除掉看看效果:
[root@instance-jgzzg4xl home]# rm -rf /home/linc/
[root@instance-jgzzg4xl home]# ll
total 12
drwx------ 2 huar huar 4096 Oct 31 13:25 huar
drwx------ 4 jiangms jiangms 4096 Aug 19 14:45 jiangms
drwx------ 4 songj developer 4096 Oct 31 13:24 songj
[root@instance-jgzzg4xl home]# useradd linc
useradd: user 'luzs' already exists
我们发现同样出现报错,但是却报了不同的错误。遇事不决,还是得从基础知识点入手。
2 userdel 常用命令参数
基础语法:
userdel [选项] 用户名
常用选项
-r:删除用户账号及其家目录和邮件槽-f:强制删除用户(当用户已登录Linux系统时,此选项仍旧生效)-R:后跟一个目录名(CHROOT_DIR),表示在指定目录中执行userdel操作,并且使用指定目录下的配置文件-P:后跟一个目录名(PREFIX_DIR),表示在指定目录中执行userdel操作,并且使用指定目录下的配置文件,但该选项不会进行chroot操作,旨在为交叉编译目标准备环境-Z:删除与用户相关的SELinux用户映射-k:保留家目录,家目录留作进行手工处理
而新建用户后,其主要的信息会保留在以下文件中:
/etc/group:用户组信息。/etc/login.defs:为 shadow 密码套件提供的配置信息。/etc/passwd:用户账户信息。/etc/shadow:用户账户的安全信息,包含密码的散列值及账户有效期等,只能由 root 账户读取。/etc/subgid:存储每个用户辅助组ID信息。/etc/subuid:存储每个用户的辅助用户ID信息。
3 解决办法
基于基础知识,当我们在删除用户没有删除干净的情况下,我们可以使用
userdel -r linc
上述脚本,会强制删除用户linc及其相关信息,这种情况在出现错误:useradd: user 'linc' already exists 时比较好用;
如果报错:Creating mailbox file: File exists,我们就将/var/spool/mail/luzs文件给删掉,这样就会排除这个报错。
这样的两套组合拳下来,新增之前存在客户出现的报错问题就会迎刃而解。当然了,最好的解决方式是避免这种物理删除用户的行为。如果确定用户不用了,要使用userdel -r luzs -k 保留用户的主目录,并删除用户的其他相关信息为最佳选择。