用户管理

基本概述

用户,又称使用者,是指使用电脑或网络服务的人,通常拥有一个用户账号,并以用户名识别。
正常登录Linux或Windows系统,本质都是登陆系统,但是Linux支持同一时间多个用户同时登陆windows默认不支持,但是修改组策略的情况下也是可以多用户登录的。

Linux下的用户的作用

  1. 系统上的每一个进程(运行的程序),都需要一个特定的用户运行
  2. 通常在公司是使用普通用户管理服务器,因为root权限过大,容易造成故障。
  3. 每一个文件都有特定的用户拥有,所以访问一个文件或目录受到用户的限制
  4. 进程能够以何种方式访问某一个文件或目录,与进程所关联的用户有关

查看系统中所存在的用户

1.查看当前登录的用户信息

[root@localhost ~]# id     #查看当前登录用户信息
uid=0(root)       gid=0(root)       groups=0(root) 
UserID:用户id号|GroupID:用户组ID号|该用户的所有组信息

2.每一个进程都会由一个用户身份运行

[root@localhost ~]# ps aux|less     #下面结果的第一列就是用户名称
root      33782  0.0  0.0      0     0 ?        R    02:46   0:00 [kworker/u256:0]
root      35637  0.0  0.0      0     0 ?        R    05:11   0:03 [kworker/0:2]

系统用户相关的配置文件

 用户信息配置文件
 /etc/passwd

 用户密码存储文件
 /etc/shadow

 用户组信息配置文件
 /etc/group

 用户组密码存储文件
 /etc/gshadow

Linux系统会将用户的信息存放在/etc/passwd,记录了用户的信息,但没有密码信息,密码被存放在/etc/shadow中。

1./etc/passwd 配置文件解释如下图

2./etc/shadow 配置文件解释如下图

用户分类(约定、规范CentOS7)

用户UID 系统中含义
0 超级管理员用户
1-200 系统用户,用来运行系统自带的进程,默认已创建
201~999 系统用户,用来运行用户安装的程序,所以此类用户无需登录系统
1000+ 普通用户,正常可以登陆系统的用户权限比较小能执行的任务有限

chage命令修改用户信息

-d      设置最近一次更改密码时间, 0下次登陆系统强制修改密码
-m      设置用户两次改变密码之间使用"最小天数"12
-M      设置用户两次改变密码之间使用"最大天数"
-W      设置密码更改警告时间将过期警告天数设为“警告天数”
-I      设置密码过期天数后, 密码为失效状态
-E      设置用户过期时间, 账户失效后无法登陆
-l      显示用户信息

-d 设置最近一次更改密码时间, 0下次登陆系统强制修改密码

-m:设置用户两次改变密码之间使用的最小天数

-M :设置用户两次改变密码之间使用最大天数

-W:设置密码更改警告天数,将过期天数设为警告天数

-I:设置密码过期天数后密码为失效状态

-E:设置用户过期时间,账户失效后无法登录

-l:显示用户信息

用户操作命令

用户创建

useradd adduser

注意:创建用户在默认不指定组的情况下,会同时创建出跟该用户名相同的组,跟uid相同的gid,除非-g指定组,则不会创建同名组

## 语法
useradd [选项]... 用户名

## 选项
-u:创建用户时指定用户的uid
-g:创建用户时指定用户的gid 指定用户组名(该组必须存在)
-G:创建用户时指定用户的附加组(该组必须存在)
-c:创建用户时指定用户的描述信息
-d:创建用户时指定用户的家目录(该目录可以不存在,会自动创建)
-m:修改用户时迁移用户的家目录,必须配合-d使用
-M:创建用户时不创建用户的家目录
-s:创建用户时指定用户登录的shell(默认是/bin/bash)
-r:创建用户时指定用户为系统用户

创建用户

[root@localhost ~]# useradd lw

-u -g创建用户时指定用户的gid 指定用户组名(该组必须存在)

[root@localhost ~]# useradd lw1 -u 666 -g root
[root@localhost ~]# id lw1uid=666(zls1) gid=0(root) groups=0(root)

-G:创建用户时指定用户的附加组(该组必须存在)

[root@localhost ~]# useradd lw -G root,zhujiao
[root@localhost ~]# id lw
uid=1001(lw) gid=1001(lw) groups=1001(lw),0(root),1000(zhujiao)[root@localhost ~]# useradd lw1 -g zhujiao
[root@localhost ~]# id lw1
uid=1002(lw1) gid=1000(zhujiao) groups=1000(zhujiao

修改用户

usermod  modify
## 语法
usermod [选项] 用户名

## 选项
-u:修改用户时指定用户的uid
-g:修改用户时指定用户的gid 指定用户组名(该组必须存在)
-G:修改用户时指定用户的附加组,会覆盖原来的附加组(该组必须存在)
-a:修改用户附加组的时候,配合-a追加使用
-c:修改用户时指定用户的描述信息
-d:修改用户时指定用户的家目录(该目录可以不存在,会自动创建)
-M:修改用户时不创建用户的家目录
-s:修改用户时指定用户登录的shell(默认是/bin/bash)
-r:修改用户时指定用户为系统用户
---------------------------------------
-l:更改用户登录名
-L:锁定用户
-U:解锁用

## 报错
[root@localhost ~]# usermod lw -l lw1
usermod: user lw is currently used by process 70107
原因:lw用户当前正在被PID为70107进程占用,所以无法修改

删除用户

userdel   delete
注意:删除用户,默认情况下,只删除用户本身,其他相关目录文件不会删除

## 语法
userdel [选项]... 用户名

## 选项
-r:递归删除,用户所有相关文件

## 警告
[root@localhost ~]# useradd test
useradd: warning: the home directory already exists.Not copying any file from skel directory into it.Creating mailbox file: File exists

原因:创建用户时,该用户以前创建过,但是在删除时没有加-r选项,没有删干净(用户同样可以创建出来)

记录:useradd mysql -s /sbin/nologin -M

查看用户其他命令

## 查看当前系统登录了哪些用户
[root@localhost ~]# who
#用户   #终端#登录时间        #从哪里连接过来
root     tty1         2022-03-1416:47
root     pts/0        2022-04-0111:00 (10.0.0.1)
root     pts/1        2022-03-2312:22 (10.0.0.1)
root     pts/2        2022-03-2109:16 (10.0.0.1)
root     pts/3        2022-03-2312:22 (10.0.0.1)
lw       pts/4        2022-04-0111:13 (10.0.0.1)
lw2      pts/5        2022-04-0112:00 (10.0.0.1)

## 查看当前系统有那些登录的用户详细信息
[root@localhost ~]# w
12:09:03 up 11 days,  5:20,  6 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    10.0.0.1         11:00    7.00s  0.77s  0.09s tail -f/var/log/messages
root     pts/1    10.0.0.1         23Mar22  7.00s  0.51s  0.00s w
root     pts/2    10.0.0.1         21Mar22  8days  0.04s  0.04s -bash
root     pts/3    10.0.0.1         23Mar22  8days  0.06s  0.06s -bash
lw      pts/4    10.0.0.1         11:13   54:15   0.08s  0.08s -bash
lw2     pts/5    10.0.0.1         12:00    8:29   0.06s  0.06s  -bash
## 查看当前登录的用户
[root@localhost ~]# whoami
root

用户的创建流程

1./etc/login.defs 是设置用户帐号限制的文件。该文件里的配置对root用户无效。/etc/login.defs 文件用于在Linux创建用户时,对用户的一些基本属性做默认设置,例如指定用户 UID 和 GID 的范围,用户的过期时间,密码的最大长度,等等。

2.需要注意的是,该文件的用户默认配置对 root 用户无效。并且,当此文件中的配置与 /etc/passwd 和 /etc/shadow 文件中的用户信息有冲突时,系统会以/etc/passwd 和 /etc/shadow 为准。

3.如果/etc/shadow文件里有相同的选项,则以/etc/shadow里的设置为准,也就是说/etc/shadow的配置优先级高于/etc/login.defs

查看配置文件

[root@localhost ~]# less /etc/login.defs

拓展:
  过滤空行: # grep -Ev '^#|^$' /etc/login.d
设置项 含义
MAIL_DIR/var/spool/mai 指定创建用户时,默认邮件文件位置
PASS_MAX_DAYS 99999 创建用户默认密码最大使用天数
PASS_MIN_DAYS 0 创建用户默认密码最少使用天数(0代表无限)
PASS_MIN_LEN 5 密码最短位数
PASS_WARN_AGE 7 密码过期前七天警告
UID_MIN 1000 普通用户最小UID是1000
UID_MAX 60000 普通用户最大UID是60000
SYS_UID_MIN 201 系统用户最小UID是201
SYS_UID_MAX 999 系统用户最大UID是999
GID_MIN 1000 普通用户最小GID是1000
GID_MAX 60000 普通用户最大GID是60000
SYS_GID_MIN 201 系统用户,最小GID是201
SYS_GID_MAX 999 系统用户,最大GID是999
CREATE_HOME yes 默认创建用户的家目录
UMASK 077 UMASK 077 指定用户创建家目录的默认权限
USERGROUPS_ENAB yes 创建用户时,如果不用-g指定组,那么会默认创建出该用户的同名组
ENCRYPT_METHOD SHA5 用户密码的加密方式 SHA51

查看useradd配置文件

# cat /etc/default/usera
如果login.defs文件中的USERGROUPS_ENAB yes是no,该行配置才会生效
如果创建用户不创建同名组,默认会将该用户加入GID为100的系统组中(users)GROUP=100
# 指定用户默认创建家目录的位置
HOME=/home
# 用户账户停权 -1永远不过期
INACTIVE=-1
# 账号终止时间的设置,不设置不终止
EXPIRE=
# 用户默认创建登录
shellSHELL=/bin/bash
# 该目录下存放的是,用户的环境变量初始配置文件
SKEL=/etc/skel
# 创建用户的同时,创建该用户的邮箱文件
CREATE_MAIL_SPOOL=yes

用户的环境变量初始配置文件

当使用useradd创建用户时,创建的用户家目录下会存在.bash_*环境变量相关的文件,这些环境变量默认文件在/etc/skel目录中拷贝。这个默认拷贝环境变量位置是由/etc/defaults/useradd配置文件中定义
案例:
#在当前用户的家目录下,想要删除所有文件,执行了如下命令
[root@db04 ~]# rm -fr .*
#结果再次登录时
-bash-4.1#

#解决办法
-bash-4.1# cp /etc/skel/.bash* .
#再次登录 即可恢复
[root@db04 ~]#

用户密码管理

创建完账户后,默认是没有设置密码的,所以该账户是没有办法登陆操作系统。只有使用passwd设置好密码后方可登录系统。

注意:

  1. 普通用户只能更改自己的密码(密码必须满足8位字符)
  2. 管理员用户能更改任何人的密码(密码长度无限制)
语法:
passwd [用户名]
如果不加用户名,则修改当前登录用户的密码,只有root用户能在passwd命令后加用户名

## 免交互方式
stdin:标准输入
stdout:标准输出
stderr:错误输出
[root@localhost ~]# echo '123@qqdianCOM'|passwd --stdin zls1001Changing password for user zls1001.passwd: all authentication tokens updated successf

随机密码生成

tee:管道命令
-a:append 追加
[root@localhost ~]# echo $RANDOM|tee -a /tmp/pass.txt |passwd --stdin zls

Linux用户权限

为什么Linux目录默认权限755,而文件默认权限为644呢,这是因为Linux权限掩码umask导致。

每个Linux终端都拥有一个umask属性,umask熟悉可以用来确定新建文件、目录的默认权限,默认系统权限掩码为022。在系统中每创建一个文件或者目录,文件默认权限是666,而目录权限则为777,权限对外开放比较大,所以设置了权限掩码之后,默认的文件和目录权限减去umask值才是真实的文件和目录的权限。

对应目录权限为:777-022=755;

对应文件权限为:666-022=644;

执行umask命令可以查看当前默认的掩码,umask -S 023可以设置默认的权限掩码。

Linux权限可以将rwx用二进制来表示,其中有权限用1表示,没有权限用0表示;

Linux权限用二进制显示如下:

rwx=111

r-x=101

rw-=110

r--=100

依次类推,转化为十进制,对应十进制结果显示如下:

rwx=111=4+2+1=7

r-x=101=4+0+1=5

rw-=110=4+4+0=6

r--=100=4+0+0=4

得出结论,用r=4,w=2,x=1来表示权限。

awk批量创建用户习题剖析

需求:

1.批量创建100个用户

2.给这100个用户随机生成密码

3.将100个用户的密码保存到文件中

例如:创建100用户 zls001-zls100用户名:密码

cat /tmp/pass.txt

zls001:71297391

zls002:1892319283

zls003:182372873

步骤一:先将命令逐个写出来

# 需求:
1.批量创建100个用户
  useradd zls001
2.然后给这100个用户随机密码
  echo$RANDOM|passwd --stdin zls001mima=$RANDOM
3.将100个用户的密码保存到文件中
  echo zls001:$RANDOM >> /tmp/pass.txt

步骤二:命令进行拼接

方式一:
useradd zls001;echo 123|passwd --stdin zls001;echo zls001:123 >> /tmp/pass.txt

方式二:
useradd zls001 && echo123|passwd --stdin zls001 && echo zls001:123 >> /tmp/pass.txt

步骤三:使用 awk 命令


[root@localhost ~]# seq -w 5|awk '{print $1}

把命令当成字符串,放入awk中:
[root@localhost ~]# seq -w 5|awk '{print "useradd zls001;echo 123|passwd --stdinzls001;echo zls001:123 >> /tmp/pass.txt

用$1替换001部分(001部分是写死的部分,不能批量创建)
[root@localhost ~]# seq -w 5|awk '{print "useradd zls$1;echo 123|passwd --stdinzls$1;echo zls$1:123 >> /tmp/pass.txt"}'

 把$1放在双引号的外面(不放在外面,则表示它自己)
 [root@localhost ~]# seq -w 5|awk '{print "useradd zls"$1";echo 123|passwd --stdinzls"$1";echo zls"$1":123 >> /tmp/pass.txt}'

 密码要设置变量(变量输出结果给到变量名)
 mima=echo $RANDOM

 # 最终命令,塞到awk里
 mima=echo $RANDOM;useradd zls5;echo $mima|passwd --stdin zls5;echo zls5:$mima >>/tmp/pass.txt

山林不向四季起誓 荣枯随缘