Shell编程中关于用户操作报错`用户无法登录`

83 阅读3分钟
1 背景

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

 [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

尝试登录:

2024-10-31_112841.png

自己检查了登录名,以及主机ip,又检查了密码输入是否错误,发现上述三者均没有问题,那么问题出在哪儿了呢?我们来回顾一下useradd的常用命令参数的基础知识。

2 useradd 常用命令参数

基本语法:

 useradd [选项] 用户名

常用选项

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

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

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

通过在命令参数-p处,我们知道了,密码是需要密文设置,如果明文设置,密码设置会生效,如下:

 [root@instance-jgzzg4xl ~]# cat /etc/shadow
 ...
 linc:123456:20031:0:99999:7:::

但是这种情况下,在客户端(比如说xshell等)登录时,客户端是需要密文登录的,因此出现了我们上文中无法登录的情况。解决办法不止一种,这里用一种相对较简单的方式来处理:

 passwd [用户名]

结果:

[root@instance-jgzzg4xl home]# passwd linc
Changing password for user linc.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.

这样一来,我们就保证了用户的密文密码的问题,就解决了明文的用户无法登录的问题了,看来一切症结还是在基础知识上。