前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Shell编程中关于用户操作的两个报错

Shell编程中关于用户操作的两个报错

原创
作者头像
哎呀_编号89757
修改2024-10-31 16:23:09
980
修改2024-10-31 16:23:09
举报
文章被收录于专栏:Shell编程读书笔记
报错一、用户无法登录
1 背景

通过命令useradd进行了用户的创建,并且同时赋值了密码:

代码语言:shell
复制
[root@instance-jgzzg4xl home]# useradd -g developer -u 1020 -p 985211_rev songj
[root@instance-jgzzg4xl home]# ll
total 8
drwx------ 4 jiangms jiangms   4096 Aug 19 14:45 jiangms
drwx------ 2 songj   developer 4096 Oct 31 11:26 songj

尝试登录:

明显这并不是密码输入错误的问题,而且在很多书中或者科普文章中并不会跟大家讲的问题,接下来我们来仔细了解下关于用户新增useradd的命令参数。

2 useradd 常用命令参数

基本语法:

代码语言:shell
复制
useradd [选项] 用户名

常用选项

  • -c:为新用户添加注释信息,通常用户填写用户的全名或其他描述
  • -d:指定用户的家目录。如果不指定,系统会使用默认的家目录路径,通过是/home/user
  • -m:自动创建用户的家目录,如果家目录不存在的话
  • -s:指定用户登录后使用的shell
  • -g:只用用户的主组。如果组不存在,useradd会尝试创建这个组
  • -G:指定用户所属的一个或多个附加组
  • -u:指定用户的UID(用户id),如果不指定系统会自动分配一个未被使用的UID
  • -o:允许为新用户指定一个已经存在的UID,及时它与另一个用户的UID相同。
  • -r:创建一个系统用户

上述参数中提请大家注意的有如下几点:

  1. -u参数如果不指定,默认从1000开始,系统用户的UID为1-999范围区间
  2. -r参数在创建系统用户时是必须指定的参数,即第1点中提到的uid在1-499范围区间的用户;若创建普通用户,则可不加该参数
  3. -p参数指定用户登录的密码,但是该密码如果是明文设置,则会失效。这也是我在文首遇到的无法登录的情况。
3 解决办法

解决办法不止一种,这里用一种相对较简单的方式来处理:

代码语言:shell
复制
passwd songj

结果:

代码语言:shell
复制
Last failed login: Thu Oct 31 11:28:25 CST 2024 from 222.**.**.** on ssh:notty
There was 1 failed login attempt since the last successful login.
[songj@instance-jgzzg4xl ~]$ 

这样一来,就解决了新建用户无法报错的问题了。

报错二、新建用户报错Creating mailbox file: File exists
1 背景

当我们新建了一个用户发现有问题,想要删除该用户并再次新增相同的用户时:

代码语言:shell
复制
[root@instance-jgzzg4xl home]# userdel luzs
[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 luzs
drwx------ 4 songj   developer 4096 Oct 31 13:24 songj
[root@instance-jgzzg4xl home]# useradd luzs
useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.
Creating mailbox file: File exists

我们可以看到,在我们删除后,在/home/文件夹下依然存在/luzs/主目录,猜测的原因是因为在删除的时候未把相关信息删除干净。那么我们把主目录给删除掉看看效果:

代码语言:shell
复制
[root@instance-jgzzg4xl home]# rm -rf /home/luzs/
[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 luzs
useradd: user 'luzs' already exists

我们发现同样出现报错,遇事不决,还是得从基础知识点入手。

2 userdel 常用命令参数

基础语法:

代码语言:shell
复制
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 解决办法

当我们在删除用户没有删除干净的情况下,我们可以使用

代码语言:shell
复制
userdel -r luzs

强制删除,这种情况在出现错误:useradd: user 'luzs' already exists 时比较好用,如果报错:Creating mailbox file: File exists,我们就将/var/spool/mail/luzs文件给删掉,这样的两套组合拳下来,就可以将问题解决。当然了,最好的解决方式,如果确定用户不用了,要使用userdel -r luzs -k 保留用户的主目录,并删除用户的其他相关信息为最佳选择。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 报错一、用户无法登录
    • 1 背景
      • 2 useradd 常用命令参数
        • 3 解决办法
        • 报错二、新建用户报错Creating mailbox file: File exists
          • 1 背景
            • 2 userdel 常用命令参数
              • 3 解决办法
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档