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
测试然后如下:
