linux用户管理
一、初识Linux系统用户管理
Linux系统中存在三种用户
- 第一种超级管理用户 root用户,此用户唯一,UID是0 (其他用户其实也可以通过更改UID来成为超级管理员用户,但是此法很危险,不提倡)
- 第二种是虚拟用户 虚拟用户的UID是1~499 虚拟用户是不能登录到系统的,虚拟用户的作用是用来管理某个软件的进程启动运行的。
- 第三种是普通用户 ,这一类用户是有超级管理员创建,可以登陆系统,但是权限较小。此用户的UID CentOS6为500起 CentOS7为1000起。
在Linux系统中,和用户用户组直接相关的文件主要有/etc/passwd(用户文件),/etc/shadow(用户密码所在文件),/etc/group(用户组所在文件),/etc/gshadow(用户组密码文件(废弃基本不用))这四个配置文件。
每当我们创建或删除用户和用户组就是修改这四个文件,我们来测试一下
先用MD5sum给这四个文件做文件计算和检测(指纹识别)
[root@node ~]# md5sum /etc/passwd /etc/shadow /etc/group /etc/gshadow
b8eae63b201fb5f36b0d968921402323 /etc/passwd
1ffe5fff81b6a26c9908847d497c5f9c /etc/shadow
f6517909c59eecb857592278970d94ee /etc/group
eb6c3c1496582ccb6cadcf4a3192aec9 /etc/gshadow
我们创建一个用户看看有没有没变化
[root@node ~]# useradd chj
[root@node ~]# md5sum /etc/passwd /etc/shadow /etc/group /etc/gshadow
e6c2c322801138625928355671e8285d /etc/passwd
b96d24230f85569a56fac49d3e93250f /etc/shadow
674673bb205813dacf83f62af17be137 /etc/group
8871d3e4ca9869d6e63bec33374ad044 /etc/gshadow
我们可以看到指纹识别码已经发生变化了,证明这四个文件被修改过
[root@node ~]# grep chj /etc/passwd /etc/shadow /etc/group /etc/gshadow
/etc/passwd:chj:x:1003:1003::/home/chj:/bin/bash
/etc/shadow:chj:!!:18365:0:99999:7:::
/etc/group:chj:x:1003:
/etc/gshadow:chj:!::
1.1.1 用户所在文件/etc/passwd
[root@node ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
root | :0 | :0 | root | :/root | :/bin/bash |
---|---|---|---|---|---|
用户名称 | :用户密码 | :用户UID | :用户GID | :用户说明 | :用户家目录 |
1.1.2存储用户密码信息文件/etc/shadow
[root@node ~]# cat /etc/shadow
root:$6$1a5VFSee0goEi1Hn$AiJBbeR63N5wY24m8Rd54HZXOh.uJdmXRBFEmLmcHCD1iYwoIA15E/WrX3VONe0qc21rxKhsSVXNKO7GTQVKz.::0:99999:7:::
chj:!!:18365:0:99999:7:::
root | :!! | :18365 | :0 | :99999 | :7 | : | : | : |
---|---|---|---|---|---|---|---|---|
用户名称 | 用户密码 | 最近更改密码时间 | 禁止修改密码文件的天数 | 用户必须修改密码的天数 | 警告更改密码的期限 | 不活动时间 | 失效时间 | 标志 |
1.1.3 用户组文件/etc/group
[root@node ~]# cat /etc/group
root:x:0:
bin:x:1:
root | :x | :0 | : |
---|---|---|---|
用户组名称 | 用户组密码 | 用户组ID | 用户组成员 |
1.1.4 组密码文件/etc/gshadow
[root@node ~]# cat /etc/gshadow
root:::
root | : | : | : |
---|---|---|---|
用户组名 | 用户组密码 | 用户组管理员用户 | 用户组成员 |
二、Linux用户命令介绍
- useradd命令使用
参数 | 说明 |
---|---|
-u | 指定uid |
-s | 指定登录的shell解释器 |
-M | 不创建家目录 |
-g | 指定用户组 |
-e | 设定登录截止日期 |
[root@node ~]# useradd -u 888 jiaoji -s /sbin/nologin -M
[root@node ~]# tail -1 /etc/passwd
jiaoji:x:888:1004::/home/jiaoji:/sbin/nologin
查看用户登录截止日期
[root@node ~]# chage -l test
Last password change : Apr 12, 2020
Password expires : never
Password inactive : never
Account expires : never #看这里(如果你设施截止登录日期这里就会出现日期)
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
指定用户组
[root@node ~]# useradd test1 -g incahome
[root@node ~]# id test1
uid=1004(test1) gid=1001(incahome) groups=1001(incahome)
useradd 命令的配置文件
[root@node ~]# ll /etc/default/useradd
-rw-r--r-- 1 root root 119 Aug 6 2019 /etc/default/useradd
[root@node ~]# cat /etc/default/useradd
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
Linux添加用户要用到的文件
创建普通用户的默认配置文件
[root@node ~]# ll /etc/default/useradd
创建用户时拷贝普通用户的环境变量(拷贝到普通用户的家目录下)
[root@node ~]# ll /etc/skel
登录文件 (了解即可)
[root@node ~]# ll /etc/login.defs
-rw-r--r-- 1 root root 2027 Aug 6 2019 /etc/login.defs
2.1.5 userdel 删除用户
-r 递归删除家目录及以下内容
[root@node ~]# userdel -r test1
[root@node ~]# userdel -r test
[root@node ~]# ls /home/
chj oldboy oldgirl
[root@node ~]# userdel -r chj
[root@node ~]# ls /home/
oldboy oldgirl
2.1.6 usermod 修改用户属性
参数 | 说明 |
---|---|
-u | 指定uid |
-s | 指定登录的shell解释器 |
-M | 不创建家目录 |
-g | 指定用户组 |
-e | 设定登录截止日期 |
[root@node ~]# useradd -u 1012 -s /sbin/nologin -M -g incahome -e "2020/5/1" chj
[root@node ~]# grep chj /etc/passwd
chj:x:1012:1001::/home/chj:/sbin/nologin
[root@node ~]# id chj
uid=1012(chj) gid=1001(incahome) groups=1001(incahome)
[root@node ~]# chage -l chj
Last password change : Apr 15, 2020
Password expires : never
Password inactive : never
Account expires : May 01, 2020
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
[root@node ~]# usermod -u 8888 -s /bin/bash -g root -e "2021/5/1" chj
[root@node ~]# id chj
uid=8888(chj) gid=0(root) groups=0(root)
[root@node ~]# chage -l chj
Last password change : Apr 15, 2020
Password expires : never
Password inactive : never
Account expires : May 01, 2021
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
[root@node ~]# grep chj /etc/passwd
chj:x:8888:0::/home/chj:/bin/bash
2.1.7 passwd 添加或修改用户密码
参数 | 说明 |
---|---|
--stdin | 从标准输入接受密码并设置 |
root 给其它用户设置密码
[root@node ~]# passwd chj
Changing password for user chj.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
普通用户自己设置密码
[oldboy@node ~]$ passwd
Changing password for user oldboy.
Changing password for oldboy.
(current) UNIX password:
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
非交互设置密码--stdin
[root@node ~]# echo "123456"|passwd --stdin oldgirl
Changing password for user oldgirl.
passwd: all authentication tokens updated successfully.
也可以这样
[root@node ~]# passwd --stdin oldgirl <pass
Changing password for user oldgirl.
passwd: all authentication tokens updated successfully.
2.1.8 chpasswd 批量修改用户密码(从标准输入更改用户密码)
[root@node ~]# tail -4 /etc/passwd|awk -F ":" '{print $1":123456"}'
oldgirl:123456
ntp:123456
jiaoji:123456
chj:123456
[root@node ~]# tail -4 /etc/passwd|awk -F ":" '{print $1":123456"}'>pass.log
[root@node ~]# cat pass
pass pass.log
[root@node ~]# cat pass.log
oldgirl:123456
ntp:123456
jiaoji:123456
chj:123456
出现以下报错:
[root@node ~]# chpasswd <pass.log
chpasswd: cannot lock /etc/passwd; try again later.
解决方法:
[root@node ~]# ps -axu|grep chpasswd
root 2011 0.0 0.0 125520 932 pts/0 T 20:47 0:00 chpasswd
root 2111 0.0 0.0 112712 968 pts/0 R+ 21:03 0:00 grep --color=auto chpasswd
[root@node ~]# kill -9 2011
[root@node ~]# chpasswd <pass.log
其实最简单的就是直接管道然后接chpasswd命令(前提你要保证管道之前的内容是正确的)
[root@node ~]# tail -4 /etc/passwd|awk -F ":" '{print $1":123456"}'|chpasswd
三、用户组命令介绍
3.1.1 groupadd 添加一个组
[root@node ~]# groupadd sa
[root@node ~]# grep sa /etc/group
sa:x:1005:
参数
参数 | 说明 |
---|---|
-g | 指定组id |
[root@node ~]# groupadd -g 1235 sa1
[root@node ~]# grep sa1 /etc/group
sa1:x:1235:
3.1.2 groupdel 删除一个组
[root@node ~]# groupdel sa
[root@node ~]# grep sa /etc/group
3.1.3 chage 查看和修改密码属性
参数
参数 | 说明 |
---|---|
-l | 显示一个用户的密码信息 |
-E | 修改账户过期时间 |
[root@node ~]# chage -l oldboy
Last password change : Apr 15, 2020 #最近密码修改的时间
Password expires : never #密码过期时间
Password inactive : never #密码停权日期
Account expires : never #账户过期时间
Minimum number of days between password change : 0 #两次密码修改的时间间隔 0(随时可以)
Maximum number of days between password change : 99999 #密码使用期限
Number of days of warning before password expires : 7 #过期前第七天提示用户修改密码
[root@node ~]# chage -E "2023/10/1" oldboy
[root@node ~]# chage -l oldboy
Last password change : Apr 15, 2020
Password expires : never
Password inactive : never
Account expires : Oct 01, 2023
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
四、用户查询相关的命令
4.1.1 whoami 查看当前用户
[root@node ~]# whoami
root
4.1.2 id 查看当前用户
[root@node ~]# id
uid=0(root) gid=0(root) groups=0(root)
4.1.3 w 查看当前登录的所有用户
[root@node ~]# w
22:21:36 up 2:27, 1 user, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.36.1 19:55 0.00s 0.26s 0.00s w
[root@node ~]# su - oldboy
Last login: Wed Apr 15 20:20:48 CST 2020 on pts/0
[oldboy@node ~]$
[root@node ~]# w
22:23:47 up 2:29, 2 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.36.1 19:55 3.00s 0.27s 0.00s w
root pts/1 192.168.36.1 22:23 11.00s 0.02s 0.01s -bash
[root@node ~]# who
root pts/0 2020-04-15 19:55 (192.168.36.1)
root pts/1 2020-04-15 22:23 (192.168.36.1)
4.1.4 显示登陆过的用户信息列表
[root@node ~]# last
root pts/1 192.168.36.1 Wed Apr 15 22:23 still logged in
root pts/1 192.168.36.1 Wed Apr 15 21:11 - 21:33 (00:22)
root pts/0 192.168.36.1 Wed Apr 15 19:55 still logged in
reboot system boot 3.10.0-1062.18.1 Thu Apr 16 03:54 - 22:31 (-5:-22)
root pts/0 192.168.36.1 Thu Apr 16 03:08 - crash (00:45)
reboot system boot 3.10.0-1062.18.1 Thu Apr 16 03:07 - 22:31 (-4:-36)
root pts/0 192.168.36.1 Tue Apr 14 17:19 - down (07:48)
4.1.4 查看用户最近登录时间
[root@node ~]# lastlog
Username Port From Latest
root pts/1 192.168.36.1 Wed Apr 15 22:23:30 +0800 2020
bin **Never logged in**
daemon **Never logged in**
五、su 的功能讲解
su 是Linux用户身份切换的工具。
参数 | 说明 |
---|---|
- | 加载切换用户自己的环境变量 |
-c | 指定一个用户身份执行命令而不用切换到用户 |
[root@node ~]# su - oldboy
Last login: Wed Apr 15 22:23:43 CST 2020 on pts/1
[oldboy@node ~]$
[oldboy@node ~]$ whoami
oldboy
[root@node ~]# su -l oldboy
Last login: Thu Apr 16 17:05:05 CST 2020 on pts/0
[oldboy@node ~]$ whoami
oldboy
注意加“-” 是携带环境变量登录 -l也可以
如果我们不加-或-l就会出现环境变量还是原来用户的。
[root@node ~]# env|grep root
USER=root
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
HOME=/root
LOGNAME=root
[oldboy@node /root]$ env|grep root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
MAIL=/var/spool/mail/root
PWD=/root
#环境变量还是root的
加“-”
[root@node ~]# su - oldboy
Last login: Thu Apr 16 17:09:16 CST 2020 on pts/0
[oldboy@node ~]$ env|grep oldboy
USER=oldboy
MAIL=/var/spool/mail/oldboy
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/oldboy/.local/bin:/home/oldboy/bin
PWD=/home/oldboy
HOME=/home/oldboy
LOGNAME=oldboy
-c 指定一个用户身份执行命令而不用切换到用户
[root@node ~]# su - oldboy -c pwd
/home/oldboy
[root@node ~]# su - oldboy -c whoami
oldboy
5.1.1 在企业生产环境中怎么使用su
不能直接登录root账户,先登录普通用户,没事的时候就是用普通用户,只有执行的任务需要root权限的时候,才允许你登录root。
六、sudo命令的使用
sodu 这个命令可以在普通用户在执行某个命令的时候赋予root权限(前提你得赋予普通用户执行这个命令的权限),这要做的目的是最小化权限控制管理,防止意外错误发生。
6.1.1 在生产过程中如何配置sudo权限
[root@node ~]# visudo或者[root@node ~]# vim /etc/sudoers (语法严格,不太推荐,如果一定要用,配置完成,要检查语法)
[root@node ~]# visudo -c
/etc/sudoers: parsed OK
6.1.2 授权oldboy用户可以使用ls命令访问root目录
1.首先oldboy 对/root 目录是没有访问权限的
[oldboy@node ~]$ ls /root
ls: cannot open directory /root: Permission denied
[root@node ~]# visudo
100 root ALL=(ALL) ALL
# 用户 主机=(角色) 命令
101 oldboy ALL=(ALL) /bin/ls #添加oldboy用户以及授权的命令
#oldboy ALL=(ALL) NOPASSWD: /bin/ls
#不用每五分钟输入一次验证密码
切换到oldboy用户 先查看是否有权限(首次输入需要oldboy密码。时效5分钟,如果你嫌麻烦授权的时候这样配置:oldboy ALL=(ALL) NOPASSWD: /bin/ls)
[oldboy@node ~]$ sudo -l
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
[sudo] password for oldboy:
Matching Defaults entries for oldboy on node:
!visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME
HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE
LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE",
env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin:/bin:/usr/sbin:/usr/bin
User oldboy may run the following commands on node:
(ALL) /bin/ls (用于执行ls的权限)
[oldboy@node ~]$ sudo ls /root
90 anaconda-ks.cfg a.txt b.txt d.txt oldboy.txt oldgirl.txt pass pass.log passwd.sh test
不需要root密码普通用户直接切换到root用户
[root@node ~]# visudo
oldboy ALL=(ALL) NOPASSWD: ALL
[root@node ~]# sudo su - root
Last login: Thu Apr 16 17:45:44 CST 2020 from 192.168.36.1 on pts/2
[root@node ~]#