1、用户管理

  • 系统为何要有用户
  • 用户相关文件
  • 用户相关命令:增、删、改、查
  • sudo授权管理

题外话:3Q(IQ智商、EQ情商、AQ逆商)

IQ智商:与之前学历、智力水平

EQ情商:与人相处、人与人之间关系、在意别人

AQ逆商:在逆境对抗能力

1.1 用户管理概述

1)概述

Linux系统是一个多用户系统

2)UID、GID

Linux中的用户有一个标记,类似于身份号码一样的东西,叫做UID和GID。一般情况下,UID和GID要唯一

UID:user id,用户的id号,类似于身份证号码

GID:group id,用户组的id号,户口本号码

3)用户分类

root: uid是0,系统的最高管理员 普通用户: uid>=1000(C7之后)(原来的系统C5、C6>=500),手动创建,无法对系统进行更改,只能在当 前家目录有权限 虚拟用户 : uid<1000,也叫傀儡用户,用于服务、进程运行使用的用户,无法直接使用。

1.2 用户相关的文件

Linux下创建1个用户,一般会影响下面几个文件:

/etc/passwd      存放用户信息,不是存放密码
/etc/shadow      存放密码信息
/etc/group       用户组信息
/etc/gshadow     用户组密码信息,几乎不会给用户组设置密码

1) /etc/passwd 每一列含义

该文件内容如下:

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

共有7列,以:号分割

第1列:为用户名
第2列:x,密码标记,密码信息存放在/etc/shadow中
第3列:UID,用户id
第4列:GID,用户组id
第5列:用户说明信息,创建用户的时候指定的,如不指定则为空
第6列:用户的家目录,创建用户的时候指定的,如不指定则为空
第7列:用户使用的命令解释器shell

其中,shell有:

/bin/sh:正常可以使用

/bin/bash:正常可以使用

/sbin/nologin :虚拟用户/傀儡用户

bash、sh解释器:

[root@linux-87-01 ~]# echo hostname
hostname
[root@linux-87-01 ~]# echo hostname | bash
linux-87-01
[root@linux-87-01 ~]# echo hostname | sh
linux-87-01
[root@linux-87-01 ~]#

Ubuntu的解释器:/bin/dash、/bin/bash

Unix的解释器:csh、tcsh

命令解释器是/bin/bash一般表示这个用户可以远程登录

案例1:统计当前系统命令解释器是/bin/bash的用户数量

[root@linux-87-01 ~]# grep '/bin/bash' /etc/passwd | wc -l
1
[root@linux-87-01 ~]#

案例2:统计当前系统命令解释器不是/bin/bash的用户数量

[root@linux-87-01 ~]# grep -v '/bin/bash' /etc/passwd | wc -l
21
[root@linux-87-01 ~]#

-v :取反(排除)

2) /etc/shadow

该文件内容如下:

root:$6$Sqf8t4ZTUkcgh5QV$ig9Fxi9.CSOdsiPYaZZKCQxdU2Jqy1wRfok7Wcp6MuJbkJf.ttpJUgGzcjMwkmV7wdL1Oc2er0LTQQXj7tUut1::0:99999:7:::
bin:*:18353:0:99999:7:::

共有9列,以:号分割

第1列:用户名

第2列:用户的密码,加密后的密文,6开头的,表明是用SHA-512加密的,1表明是用MD5加密的 ,2是用Blowfish加密的, 5 是用 SHA-256加密的

第3列:上次修改口令的时间;这个时间是从1970年01月01日算起到最近一次修改口令的时间间隔(天数),您可以通过passwd 来修改用户的密码,然后查看/etc/shadow中此字段的变化

第4列:两次修改口令间隔最少的天数;如果这个字段的值为空,帐号永久可用

第5列:两次修改口令间隔最多的天数;如果这个字段的值为空,帐号永久可用

第6列:提前多少天警告用户口令将过期;如果这个字段的值为空,帐号永久可用

第7列:在口令过期之后多少天禁用此用户;如果这个字段的值为空,帐号永久可用

第8列:用户过期日期;此字段指定了用户作废的天数(从1970年的1月1日开始的天数),如果这个字段的值为空,帐号永久可用

第9列:保留字段,目前为空

3)/etc/group文件

该文件内容如下:

root:x:0:
bin:x:1:
daemon:x:2:

共4列,以:号分割

第1列:用户组的名称

第2列:密码,x表示密码保存在/etc/gshadow中

第3列:GID

第4列:用户列表,表示该组中有哪些用户,每个用户之间用,号分割;如果为空,则表示用户为GID的用户名

1.3 用户管理
1)增加

创建用户的命令:useradd [选项] 用户名

红帽系统中:useradd、adduser是一样的

Debian、Ubuntu中:adduser(添加的是,普通用户)、useradd(添加的是,虚拟用户,不创建家目录)

选项:
-u  指定用户uid
-s  指定命令解释器,默认是/bin/bash
-M  不创建家目录

设置用户密码:passwd 用户名

选项:
--stdin  非交互式设置密码

查看用户id:id 用户名

案例1:创建普通用户oldboy

[root@linux-87-01 ~]# useradd oldboy
[root@linux-87-01 ~]# grep 'oldboy' /etc/passwd
oldboy:x:1000:1000::/home/oldboy:/bin/bash
[root@linux-87-01 ~]# 

为oldboy用户设置密码:

案例2:创建用户mysql,指定uid为1314,指定命令解释器为/sbin/nologin,不创建家目录

[root@linux-87-01 ~]# useradd -u 1314 -s /sbin/nologin -M mysql

案例3:查看mysql用户id

[root@linux-87-01 ~]# id mysql
uid=1314(mysql) gid=1314(mysql) groups=1314(mysql)
[root@linux-87-01 ~]# 

案例4:使用非交互式为oldboy用户设置密码

[root@linux-87-01 ~]# echo 123 | passwd --stdin oldboy 
Changing password for user oldboy.
passwd: all authentication tokens updated successfully.
[root@linux-87-01 ~]#

切换用户:su – 用户名

退出当前用户:ctrl + d #相当于logout命令

su : switch user,切换用户

su – 与 su

-、-l、--login:切换用户的时候更新用户的环境变量(用户信息)

不使用-选项,切换用户:

[root@linux-87-01 ~]# whoami
root
[root@linux-87-01 ~]# su oldboy
[oldboy@linux-87-01 root]$ whoami
oldboy
[oldboy@linux-87-01 root]$ pwd
/root
[oldboy@linux-87-01 root]$ 

虽然,用户切换了,但是用户的环境没有更新,还是在root家目录中。没有

使用-选项:

[root@linux-87-01 ~]# su - oldboy
Last login: Sat May  6 23:23:38 CST 2023 on pts/0
[oldboy@linux-87-01 ~]$ whoami
oldboy
[oldboy@linux-87-01 ~]$ pwd
/home/oldboy
[oldboy@linux-87-01 ~]$

家目录已经切换。

因此,切换用户要使用-选项。以避免其他情况发生。

随机生成字符命令:uuidgen(系统自带)、mkpasswd(需安装expect)

[root@linux-87-01 ~]# yum install expect  -y
[root@linux-87-01 ~]# mkpasswd
kb8J[8Imq
[root@linux-87-01 ~]# uuidgen 
388e784e-9752-4925-a412-b0474b4ff755
[root@linux-87-01 ~]#

mkpasswd -l 指定长度

可以运行两个命令的结果设置为用户的密码。

使用Keepass软件保存密码:

版本:KeePass-2.50

打开–>文件—>新建:

设置密码:

然后,进入:

直接点击OK,,进入:

点击跳过,重新打开Keepass,登录后如下:

根据实际,选择相关选项,比如,选择“常规”,右键添加记录:

点击open password。。。生成随机密码。再点击…就可以看到了

最后,点击OK即可:

点击右键就可以复制密码

2)删除

实际中,不建议删除用户,可以在文件中(/etc/passwd)注释掉

删除用户命令:userdel [选项] 用户名

默认不会删除家目录和相关的文件,比如邮箱

选项:
  -r      删除用户及家目录

例如:

[root@linux-87-01 ~]# userdel -r oldboy 
[root@linux-87-01 ~]#
3)修改

修改用户密码:passwd 用户

修改用户信息:usermod,用户必须事先存在。

[root@linux-87-01 ~]# useradd oldboy
[root@linux-87-01 ~]# grep 'oldboy' /etc/passwd
oldboy:x:1315:1315::/home/oldboy:/bin/bash
[root@linux-87-01 ~]# 

案例01:修改oldboy用户的shell为/sbin/nologin

[root@linux-87-01 ~]# usermod -s /sbin/nologin oldboy 
[root@linux-87-01 ~]# grep 'oldboy' /etc/passwd
oldboy:x:1315:1315::/home/oldboy:/sbin/nologin
[root@linux-87-01 ~]# 

案例02:修改oldboy属于root组

[root@linux-87-01 ~]# usermod -G root oldboy 
[root@linux-87-01 ~]# id oldboy 
uid=1315(oldboy) gid=1315(oldboy) groups=1315(oldboy),0(root)
[root@linux-87-01 ~]# 

注意,-G选项是修改附加组,即原来的组并没有变,而是额外添加一个组

案例03:把oldboy从root组中删除

[root@linux-87-01 ~]# usermod -G '' oldboy 
[root@linux-87-01 ~]# id oldboy 
uid=1315(oldboy) gid=1315(oldboy) groups=1315(oldboy)
[root@linux-87-01 ~]# 
4)查看

id:查看用户的uid、gid,检查用户是否存在

whoami:查询当前用户的名字

w:查看当前登录的用户的信息(不包含切换的用户)

last:用户的登录情况

lastlog:所有用户最近1次登陆情况。

案例01:id命令使用

[root@linux-87-01 ~]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[root@linux-87-01 ~]# id oldboy 
uid=1315(oldboy) gid=1315(oldboy) groups=1315(oldboy)
[root@linux-87-01 ~]# id test
id: test: no such user
[root@linux-87-01 ~]# 

案例02:whoami使用

[root@linux-87-01 ~]# whoami
root
[root@linux-87-01 ~]# 

案例03:w命令使用

[root@linux-87-01 ~]# w
 19:54:31 up  3:19,  1 user,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.10.1     19:16    7.00s  0.40s  0.00s w
[root@linux-87-01 ~]# 

如果是本地登录,则from为空

案例04:last命令使用

[root@linux-87-01 ~]# last
root     pts/0        192.168.10.1     Sun May  7 19:16   still logged in   
root     pts/0        192.168.10.1     Sat May  6 21:16 - 23:54  (02:37)   
reboot   system boot  3.10.0-1160.el7. Sat May  6 21:15 - 19:54  (22:39)   
root     pts/1        192.168.10.1     Fri May  5 21:20 - 22:11  (00:50)  

案例05:lastlog命令

[root@linux-87-01 ~]# lastlog 
Username         Port     From             Latest
root             pts/0    192.168.10.1     Sun May  7 19:16:53 +0800 2023
bin                                        **Never logged in**
daemon                                     **Never logged in**
adm                                        **Never logged in**
lp                                         **Never logged in**
5)密码

密码工具:chpasswd(批量修改密码),mkpasswd,uuidgen…

1.3 用户组命令

创建用户组:groupadd [-g] 组名

-g:指定gid

例如:

[root@linux-87-01 ~]# groupadd -g 1314 mysql
[root@linux-87-01 ~]# useradd -u 1314 -g mysql -s /sbin/nologin mysql
[root@linux-87-01 ~]# id mysql
uid=1314(mysql) gid=1314(mysql) groups=1314(mysql)
[root@linux-87-01 ~]# 
1.4 命令行故障:-bash-4.2$

命令故障:命令行变成了:-bash-4.2$

比如:切换到oldboy用户,执行rm -rf /* 命令。再切换回来,再切换回去

[oldboy@linux-87-01 ~]$ rm -rf /*
[oldboy@linux-87-01 ~]$ logout
[root@linux-87-01 ~]# su - oldboy 
Last login: Sun May  7 20:20:28 CST 2023 on pts/1
-bash-4.2$ 

命令故障了:

0)/etc/skel目录

该目录是Linux新用户家目录的一个模版

每当我们创建用户的时候,系统会把/etc/skel/下所有的内容,复制到新用户的家目录

1)原因

用户家目录没有了,用户家目录下面的配置文件没有了,~/.bashrc    ~/.bash_profile

2)解决

通过复制/etc/skel/.bah* 文件到用户的家目录中即可

然后重新登录即可。

-bash-4.2$ cp /etc/skel/.bash* ~
-bash-4.2$ 

重新登录后即可:

[root@linux-87-01 ~]# su - oldboy 
Last login: Sun May  7 20:23:11 CST 2023 on pts/1
[oldboy@linux-87-01 ~]$ 

3)复现故障

#在oldboy用户下操作:
\rm -fr ~/.bash*
cp /etc/skel/.bash* ~

2、权限管理

1)概述

实际中,由于root用户权限太大,操作有风险,所以一般不使用root用户,登录普通用户操作,但有些时候需要root权限才可以操作,这时候就需要使用sudo进行提权了。

2)sudo概述

用于给普通用户配置的命令,配置了sudo权限后,普通用户可以以root权限运行命令。

3)sudo授权与使用

a)root用户授权

修改/etc/sudoers文件

b)普通用户使用

sudo 命令

案例01:授予oldboy用户,以root权限运行cat、head、tail、more、less、grep命令

在/etc/sudoers文件最后面添加:

oldboy ALL=(ALL) /bin/cat,/bin/head,/bin/tail,/bin/less,/bin/grep,/bin/more
ALL=(ALL) 
=左边的ALL:表示可以在哪些机子运行,ALL表示全部
(ALL):可以成为哪些用户,ALL表示所有

修改如下:

[root@linux-87-01 ~]# vim /etc/sudoers
oldboy ALL=(ALL)        /bin/cat,/bin/head,/bin/tail,/bin/less,/bin/grep,/bin/more

或者直接运行visudo命令:

[root@linux-87-01 ~]# visudo

添加后:

oldboy用户就可以以root权限运行上述命令了:

输入oldboy用户密码即可。

运行sudo -l 可以查看用户有哪些权限:

案例02:授予oldboy运行所有命令且不需要输入密码

[root@linux-87-01 ~]# visudo 

修改为:

oldboy  ALL=(ALL)       NOPASSWD:ALL

清空缓存:sudo -k

[oldboy@linux-87-01 ~]$ sudo -k

排除某些命令:

oldboy  ALL=(ALL)        /bin/*,!/bin/vi,!/bin/vim

测试然后如下: