用户的管理
用户组及配置文件
用户的类型
Linux是一个多用户、多任务的操作系统,如果要使用系统资源,就必须向系统管理员申请一个用户,通过这个用户进入系统,通过建立不同属性的用户实现
不同的作用或权限,可以合理利用和控制系统资源。
Linux系统中用户角色分为三类:
1、管理员用户
默认是root用户,它的UID 和GID均为0,系统安装完成后自动生成的,默认通过它就可以登录系统,拥有最高的管理权限。
2、普通用户
由系统管理员root创建的,创建完成后可以登录系统,但默认无法创建、修改和删除任何管理员下的文件;UID从500-65535
3、虚拟用户(系统用户)
安装系统后默认生成的用户,大多数不能登录系统,但它们是系统正常运行不可缺少的,它们的存在主要是为了方便系统管理,满足相应的系统进程对文件所属用户的要求;UID从 1-499
类型 UID
root 0
虚拟用户 1-499
虚拟用户时为了满足系统中每个服务/进程在运行的时候都要有一个用户和家庭。
普通用户 500+
常用的命令解释器
/bin/bash 普通用户默认的命令解释器
/sbin/nologin 虚拟用户(傀儡用户)使用
[root@nfsnobody ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
用户及组配置文件
[root@nfsnobody ~]# ll /etc/passwd /etc/shadow /etc/group /etc/gshadow
-rw-r--r-- 1 root root 648 Sep 12 12:05 /etc/group 用户组信息
---------- 1 root root 529 Sep 12 12:05 /etc/gshadow 用户组密码
-rw-r--r-- 1 root root 1271 Sep 12 12:05 /etc/passwd 用户信息
---------- 1 root root 936 Sep 12 12:09 /etc/shadow 用户密码
/etc/passwd
/etc/passwd 存放用户信息
存储用户信息,每一行表示一个用户信息,有多少行就表示多少个用户信息。
[root@nfsnobody ~]# cat /etc/passwd 存放用户信息
root:x:0:0:root:/root:/bin/bash
root :x :0 :0 :root :/root :/bin/bash
nobody :x :99 :99 :Nobody :/ :/sbin/nologin
nfsnobody :x :500 :500 : :/home/nfsnobody :/bin/bash
用户名 原来密码的位置 UID GID 用户的说明信息 用户的家目录 命令解释器
/etc/shadow
存储用户密码信息文件
[root@nfsnobody ~]# cat /etc/shadow
LH : ! !: 17751: 0: 99999: 7: : :
此文件由9个字段的数据组成,字段之间用“:”分隔,格式如下:
1用户名 2 密码 3 最近改动密码的日期 4 密码不可被更动的天数 5 密码需要重新变更的天数 6 密码需要变更期限前的警告期限 7 密码过期的恕限时间
8账号失效日期 9 保留
/etc/group
主要存储组相关信息的文件
[root@nfsnobody ~]# cat /etc/group
nfsnobody : x : 500 :
组名 组密码 组ID(GID) 组成员
此文件由4个字段的数据组成,字段之间用“:”分隔
/etc/gshadow
主要用来存储组密码信息
[root@nfsnobody ~]# cat /etc/gshadow
nfsnobody : ! : :
组名 组密码 组管理员 用户组成员
此文件由4个字段的数据组成,字段之间用“:”分隔
/etc/skel
/etc/skel目录是在linux下面添加一个新用户使用的用户老家的模板。和创建用户相关的目录
此目录用来存放新用户需要的所有基础环境变量文件的目录。
用户家目录缺少.bash开头的文件 会出现的错误
[nfsnobody@nfsnobody ~]$ rm -f .bash* 删除用户家目录下的环境变量后,退出
-bash-4.1$ 重新登录
新用户家目录中的三个隐藏文件,与/etc.skel中的相同。
[root@nfsnobody skel]# useradd alex888
[root@nfsnobody skel]# su - alex888
[alex888@nfsnobody ~]$ ll -a
total 20
drwx------ 2 alex888 alex888 4096 Sep 12 10:18 .
drwxr-xr-x. 6 root root 4096 Sep 12 10:18 ..
-rw-r--r-- 1 alex888 alex888 18 Mar 23 08:15 .bash_logout
-rw-r--r-- 1 alex888 alex888 176 Mar 23 08:15 .bash_profile
-rw-r--r-- 1 alex888 alex888 124 Mar 23 08:15 .bashrc
.bash_logout 用户登出的时候运行这个文件里的内容
.bash_profile 环境变量
.bashrc 存放用户的别名数
模拟故障
通过故障 了解/etc/skel 文件的作用
[f:\~]$ ssh 10.0.0.200 22 本地shell使用ssh登录进nfsnobody用户
[nfsnobody@nfsnobody ~]$ ls -a ls -a 查看下家目录下的文件 包括隐藏文件
. .. .bash_history .bash_logout .bash_profile .bashrc .viminfo
[nfsnobody@nfsnobody ~]$ rm -rf .bash* 删除.bash开头的文件 模拟故障
[nfsnobody@nfsnobody ~]$ exit 退出 重新登录
logout
如果模拟故障不成功,
原因分析:1、vim /etc/profile 2、注释掉PS=那行 3、 source /etc/profile
[f:\~]$ ssh 10.0.0.200 22 重新登录
-bash-4.1$ ls -a 命令行 变了 出现故障
. .. .bash_history .viminfo
-bash-4.1$ cp /etc/skel/.bash* ~ 把/etc/skel目录下.bash开头的文件 复制一份到家目录
-bash-4.1$ exit 退出 重新登录
logout
[f:\~]$ ssh 10.0.0.200 22
[nfsnobody@nfsnobody ~]$ ls -a 命令行恢复 故障解决
. .. .bash_history .bash_logout .bash_profile .bashrc .viminfo
useradd工作原理
useradd命令工作原理有以下几步完成:
1、不带任何参数使用添加用户时,首先读/etc/login.defs /etc/default/useradd 预先定义的规则
2、根据设置的规则添加用户,同时会向/etc/passwd /etc/group文件添加新建的用户和组,但/etc/shadow /etc/gshadow也会同步生成记录
3、同时系统会根据/etc/login.defs /etc/default/useradd文件中配置的信息建立用户的家目录,并复制/etc/skel中所有隐藏的环境配置文件到新用户的家目录中,以完成对用户环境的初始化设置。
/etc/login.defs 控制用户的默认信息
/etc/login.defs文件定义了与/etc/password和/etc/shadow配套的用户限制设定。这个文件是需要的,缺失并不会影响系统的使用,但是也许会产生意想不到的错误。
如果/etc/shadow文件里有相同的选项,则以/etc/shadow里的设置为准,也就是说/etc/shadow的配置优先级高于/etc/login.defs。
用户相关命令
useradd
useradd 命令创建用户
语法格式:useradd [options] [login]
useradd [选项] [用户名]
参数:
-n 不创建以用户名为名的组
-c 创建用户时,添加个人信息
-u 用户ID值,这个值必须是唯一的
-s 用户登录后使用的shell
-g 指定用户对应的组,对应的组必须在系统中存在
useradd命令不使用参数
useradd 命令创建用户
xshell不允许用户无密码登录
[root@nfsnobody ~]# useradd LH 创建一个新用户
[root@nfsnobody ~]# tail -1 /etc/passwd 创建后的用户 信息都是默认的 没有密码
LH:x:502:502::/home/LH:/bin/bash 创建成功 /etc/passwd 可以查到
[root@nfsnobody ~]# grep LH /etc/group 使用grep 过滤下LH的组信息
LH:x:502: 创建了一个以用户名为名的组
useradd -n
-n 不创建以用户名为名的组
[root@nfsnobody ~]# useradd -n LH1 创建一个用户
[root@nfsnobody ~]# grep LH1 /etc/passwd 过滤检验下 创建成功
LH1:x:503:100::/home/LH1:/bin/bash
[root@nfsnobody ~]# grep LH1 /etc/group 过滤下组信息 没有同名的组
LH:x:502:
[root@nfsnobody ~]# id LH1 使用id命令看下 LH1这个用户在users这个组里
uid=503(LH1) gid=100(users) groups=100(users)
useradd -c
-c 创建用户时,添加个人信息
创建用户的同时,添加agan2用户的个人信息,个人信息使用逗号隔开
[root@localhost ~]# useradd -c nfsnobody,15810516499,河北LH 格式
[root@localhost ~]# grep "LH" /etc/passwd 过滤下信息查看
LH:x:506:506:nfsnobody,15810516499,河北:/home/LH:/bin/bash
useradd -u
-u 用户ID值,这个值必须是唯一的
创建用户的同时,修改用户默认的UID
[root@localhost ~]# useradd -u 888 LH 格式规范
[root@localhost ~]# grep "LH" /etc/passwd 过滤下信息查看
LH:x:888:888::/home/LH:/bin/bash
useradd -s
-s指定用户登录后的shell
/sbinlogin 表示禁止登录
此例在企业中部署nginx、mysql等服务时经常用到
[root@localhost ~]# useradd -s /sbinlogin tian
[root@localhost ~]# grep -w "tian" /etc/passwd
tian:x:8892:8892::/home/tian:/sbinlogin
useradd -g
-g 指定用户对应的组,对应的组必须在系统中存在
-G参数会把修改记录在/etc/group
让用户,隶属于到edu组,这里通过id 命令来查看用户,所属于的组。
因为使用-g 组信息记录在/etc/passwd中。事实上系统确认一个用户的所属组的时候是根据/etc/passwd的组ID。
因此,useradd -g仅仅修改/etc/passwd,而不会修改/etc/group。
加"-G"参数会把修改记录在/etc/group
[root@nfsnobody ~]# groupadd HH 创建一个新的组
[root@nfsnobody ~]# tail -1 /etc/group 查看新建的组信息
HH:x:503:
[root@nfsnobody ~]# useradd -g HH LH2 使用-g创建一个新用户使他属于HH这个组
[root@nfsnobody ~]# id LH2 查看
uid=504(LH2) gid=503(HH) groups=503(HH)
[root@nfsnobody ~]# grep LH2 /etc/passwd 查看下用户的信息
LH2:x:504:503::/home/LH2:/bin/bash
[root@nfsnobody ~]# tail -1 /etc/group
查看下组的信息 虽然加入了组 但是在group这个文件里 并没有显示出来
HH:x:503:
[root@nfsnobody ~]# useradd -G HH LH3 用-G创建一个新用户 并加入到这个组
[root@nfsnobody ~]# grep LH3 /etc/group 查看LH3的组信息 可以发现同时属于两个组
HH:x:503:LH3
LH3:x:505:
[root@nfsnobody ~]# grep LH3 /etc/passwd 过滤下LH3用户信息
LH3:x:505:505::/home/LH3:/bin/bash
[root@nfsnobody ~]# id LH3 -G创建的LH3 同时属于两个组
uid=505(LH3) gid=505(LH3) groups=505(LH3),503(HH)
[root@nfsnobody ~]# id LH2 -g创建的LH2 属于HH这个组
uid=504(LH2) gid=503(HH) groups=503(HH)
[root@nfsnobody ~]# grep HH /etc/group
HH:x:503:LH3
usermod
usermod 修改系统已经存在的用户信息
语法:usermod [options] [login]
usermod [选项] [用户名]
参数:
-c 修改用户的个人信息,同useradd 的-c功能
-g 修改用户对应的用户组,同 useradd的-d功能
-s 修改用户登录后使用的shell名称,同useradd的-s功能
-u 修改用户的uid ,同useradd 的-u功能
-l 修改用户的名称
usermod
格式
usermod -l u1 LH
新名 已存在的名
把LH的用户名改为u1
[root@nfsnobody ~]# ls /home/ 查看一下信息
LH LH1 LH2 LH3 nfsnobody www
[root@nfsnobody ~]# id LH LH的ID信息
uid=502(LH) gid=502(LH) groups=502(LH)
[root@nfsnobody ~]# usermod -l u1 LH 修改名字
[root@nfsnobody ~]# id u1 查看u1的ID
uid=502(u1) gid=502(LH) groups=502(LH)
[root@nfsnobody ~]# id LH 查看LH的
id: LH: No such user 修改成LH已经不存在了
[root@nfsnobody ~]# ls /home/ 查看家目录
LH LH1 LH2 LH3 nfsnobody www
[root@nfsnobody ~]# su - u1 切换到u1用户
[u1@nfsnobody ~]$ pwd u1用户的家目录还是LH 家目录名称没有变
/home/LH
useradd与usermod的区别
useradd与usermod 有很多相同的参数
命令不同之处
useradd是对新用户(要创建的用户)作用/配置
usermod是对已存在的用户配置
userdel
userdel 删除用户
语法:userdel [options] [login]
userdel [选项] [用户名]
参数:
-f 强制删除用户
-r 删除用户的同时,删除与用户相关的所有文件(包含邮箱信息)
userdel可以直接删除参数 注意需要加-r参数 不然会删除不彻底(不干净)会导致以后创建同名的用户无法创建
彻底删除用户
userdel -rf 彻底删除删除与用户相关的所有文件(包含邮箱信息)
可以不加f 但是想彻底删除一个用户 必须要加-r
[root@nfsnobody ~]# ls /home/
LH1 LH2 LH3 nfsnobody www
[root@nfsnobody ~]# userdel -rf LH1 -rf 彻底删除一个用户
[root@nfsnobody ~]# id LH1
id: LH1: No such user
[root@nfsnobody ~]# ls /home/
LH2 LH3 nfsnobody www
[root@nfsnobody ~]# ls /var/spool/mail/
LH2 LH3 nfsnobody root www
未彻底删除补救方法
未彻底删除导致的问题
[root@nfsnobody ~]# ls /home/ 查看下用户家目录信息
LH2 LH3 nfsnobody www
[root@nfsnobody ~]# userdel LH2 未使用参数删除用户
[root@nfsnobody home]# id LH2 确实已经删除了 id也查询不到
id: LH2: No such user
[root@nfsnobody ~]# useradd LH2 但是创建同名用户显示用户已存在
useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.
Creating mailbox file: File exists 大概意思是用户已存在
补救方法
[root@nfsnobody ~]# cd /var/spool/mail/ 进入到用户的邮箱 删除LH2的邮箱
[root@nfsnobody mail]# ls 先看一下
LH2 LH3 nfsnobody root www
[root@nfsnobody mail]# rm -rf LH2
[root@nfsnobody mail]# cd /home/ 进入到/home目录 这是普通用户的家目录
[root@nfsnobody home]# ls
LH2 LH3 nfsnobody www
[root@nfsnobody home]# rm -rf LH2 删除LH2这个目录
[root@nfsnobody home]# ls /home/ 检查是否删除
LH3 nfsnobody www 已删除
[root@nfsnobody home]# vim /etc/passwd
删除或注释里面开头是LH2的信息
[root@nfsnobody home]# vim /etc/group
删除或注释里面开头是LH2的信息
[root@nfsnobody home]# useradd LH2 重新尝试创建 可以创建
[root@nfsnobody home]# id LH2 检查
uid=506(LH2) gid=506(LH2) groups=506(LH2)
passwd
修改用户密码命令
语法:passwd [option] [username]
passwd [选项] [用户名]
参数:
--stdin //从标准输入读取密码字符串
修改当前用户的密码
普通用户使用passwd 修改密码时,必须满足密码复杂性要求;root 修改密码不需要满足密码复杂性。
[root@localhost ~]# passwd
Changing password for user root.
New password: 输入新密码
BAD PASSWORD: it is WAY too short
BAD PASSWORD: is too simple
Retype new password: 再次输入
passwd: all authentication tokens updated successfully. 更新成功
修改普通用户的密码
root用户可以直接修改 不用满足密码复杂性
[root@localhost ~]# useradd u1
[root@localhost ~]# passwd u1
Changing password for user u1.
New password:
BAD PASSWORD: it is WAY too short
BAD PASSWORD: is too simple
Retype new password:
passwd: all authentication tokens updated successfully.
非人工交互设置密码
--stdin 这个命令在工作中批量设置密码时很有用
一条命令非人工交互设置密码(企业使用技巧)
[root@localhost ~]# echo "123456" | passwd --stdin u1
Changing password for user u1.
passwd: all authentication tokens updated successfully. 密码更新成功
批量更新用户的密码
批量更新用户的密码
格式
用户名:密码,
用户必须存在才可以,一行一个用户
[root@localhost lh]# chpasswd 输入命令
root:123456 格式 用户名:密码,用户必须存在才可以,一行一个用户
u1:123456
u2:654321 输入完成后,直接ctrl+D 结束输入
此命令有一个缺点 当一行输入错误后,不能返回修改。
当使用useradd 命令批量创建用户后,可以使用chpasswd 命令批量设置密码或批量修改密码。
把用户和密码字符串放到文件里执行批量改密码
[root@localhost lh]# cat passwd.txt 先将密码写入一个文件
u1:123
u2:321
u3:123
[root@localhost lh]# chpasswd < passwd.txt 然后使用<重定向到chpasswd
su和sudo
su的使用
su的作用是变更为其它使用者的身份,超级用户除外,需要键入该使用者的密码。
su 切换用户却不切换工作环境 , su - 同时切换用户与工作环境
缺点:用户通过su root命令直接获取root权限 从而造成用户的权限太大 也就可能给系统造成危险
su 与 su -
[root@nfsnobody home]# cd /etc/ 先进入/etc目录下
[root@nfsnobody etc]# su nfsnobody 使用su 切换用户
[nfsnobody@nfsnobody etc]$ exit 切换后还在/etc目录下 退出
[root@nfsnobody etc]# su - nfsnobody 使用su - 切换
[nfsnobody@nfsnobody ~]$ 切换后自动返回当前用户的家目录
[nfsnobody@nfsnobody ~]$ pwd
/home/nfsnobody
sudo
su的缺点造就了sudo的诞生
由于用户通过su root命令直接获取root权限 从而造成用户的权限太大 也就可能给系统造成危险。
为了既保证系统的安全又可以执行相应命令,sudo 也就以此诞生。
sudo作用:通过配置文件来限制用户的权限 ,可以让普通用户在执行指定的命令或程序时,拥有超级用户的权限。
sudo的工作过程如下:
当用户执行sudo时,系统会主动寻找/etc/sudoers文件,判断该用户是否有执行sudo的权限
确认用户具有可执行sudo的权限后,让用户输入用户自己的密码确认
若密码输入成功,则开始执行sudo后续的命令
root执行sudo时不需要输入密码(因为sudoers文件中有配置root ALL=(ALL) ALL这样一条规则)
给普通用户u1提权,让普通用户可以查看root用户的家目录;普通用户可以使用useradd命令,创建新用户
分析步骤:
useradd u1
visudo=vi打开/etc/sudoers文件 或 vim /etc/sudoers
visudo会检查内部语法,避免用户输入错误信息,所以我们一般使用visudo,编辑此文件要用root权限
编辑文件的第98行,编辑完成后,wq! 强制保存退出
root ALL=(ALL) ALL
u1 ALL=(ALL) /bin/ls,/usr/sbin/useradd
使用u1 用户登录测试
sudo useradd u11 可成功创建用户,证明提权成功
sudo ls /root 可查看root的家,证明提权成功
sudo -l -l 参数是列出当前用户可执行的命令,但只有在sudoers文件里的用户才能使用该选项。
[nfsnobody@nfsnobody ~]$ sudo -l(小L)
用户查询命令
w命令
w 用于显示目前登入系统的用户信息。
执行这项指令可得知目前登入系统的用户有哪些人,以及他们正在执行的程序。
单独执行 w 指令会显示所有的用户,您也可指定用户名称,仅显示某位用户的相关信息。
显示当前登录的用户
[root@nfsnobody etc]# w
17:35:19 up 23:28, 2 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 - Wed12 2days 0.00s 0.00s -bash
root pts/0 10.0.0.1 13:16 0.00s 0.12s 0.00s w
w -h
w -h不打印头信息;
[root@nfsnobody etc]# w -h
root tty1 - Wed12 2days 0.00s 0.00s -bash
root pts/0 10.0.0.1 13:16 0.00s 0.12s 0.00s w -h
id命令
id命令 查看用户的UID 、GID
id -u 显示用户ID
id -g 显示用户所属群组的ID。
id -G 显示用户所属附加群组的ID。
[root@nfsnobody /]# id user6
uid=8897(user6) gid=8899(z11) groups=8899(z11)
[root@nfsnobody /]# id -g user6
8899
[root@nfsnobody /]# id -G user6
8899
[root@nfsnobody /]# id -u user6
8897
last和lastlog
last命令用了显示用户登录情况,以下是直接显示固定行数的记录:
lastlog 命令 显示linux中所有用户最近一次远程登录的信息
[root@nfsnobody etc]# last
[root@nfsnobody etc]# lastlog
组相关信息
groupadd
添加用户组命令 groupadd
语法:groupadd [options] [group]
groupadd [选项] [用户组]
参数:
-g gid 指定用户组的GID,GID唯一不能为负数,如果不指定GID从500开始
-f 新增一个组,强制覆盖一个已存在的组,GID、组成员不会改变。
添加组z11,查看添加后的组信息
[root@nfsnobody ~]# groupadd z11
[root@nfsnobody ~]# grep "z11" /etc/group
z11:x:8895:
[root@nfsnobody ~]# tail -1 /etc/group
z11:x:8895:
gpasswd
将已存在的用户加入到组中的命令 gpasswd
语法:gpasswd [options] [user] [group]
gpasswd [选项] [用户名] [组名]
参数:
-a:添加一个用户到组,可以追加到组
-M:添加多个用户到组,覆盖之前的组成员
-d:从组删除用户
把user1用户添加到z1,并且查看是否添加成功
-a选项只能添加一个用户,需要同时添加多用户时,使用-M参数
[root@nfsnobody lh]# groupadd z1
[root@nfsnobody lh]# useradd user1
[root@nfsnobody lh]# gpasswd -a user1 z1
Adding user user1 to group z1
[root@nfsnobody lh]# grep "z1" /etc/group
z1:x:8896:user1
同时添加user2、user3用户到z1组(先创建user2、user3用户)
使用-M参数添加多个用户时,多用户之间使用逗号分割;添加批量用户时,先使用-a参数,在使用-M参数,就会覆盖之前添加过的用户;所以添加多用户时,先使用-M 参数。
[root@nfsnobody lh]# gpasswd -M user2,user3 z1
[root@nfsnobody lh]# grep "z1" /etc/group
z1:x:8896:user2,user3
将user2用户从组中删除
[root@nfsnobody lh]# gpasswd -d user2 z1
Removing user user2 from group z1
[root@nfsnobody lh]# grep "z1" /etc/group
z1:x:8896:user3
groupmod
修改组信息的命令 groupmod
语法:groupmod [options] [group]
groupmod [选项] [组名]
groupmod -n 新名 旧名
groupmod -g 8888 dir
参数:
-n 修改组名
-g 修改GID
修改z1组的GID
[root@nfsnobody lh]# grep "z1" /etc/group
z1:x:8896:user3
[root@nfsnobody lh]# groupmod -g 8888 z1
[root@nfsnobody lh]# grep "z1" /etc/group
z1:x:8888:user3
修改z1组的组名为newz1
[root@nfsnobody lh]# grep "z1" /etc/group
z1:x:8888:user3
[root@nfsnobody lh]# groupmod -n z1new z1
[root@nfsnobody lh]# grep "z1" /etc/group
z1new:x:8888:user3
groupdel
删除组的命令 groupdel
查看用户属于到哪些组,使用命令:groups
语法:groupdel [group]
groupdel [组名]
范例:
groupdel 组名
删除组,删除组后,用户名依然存在
groups
看用户属于到哪些组,命令:groups
语法:groups [user]
groups 用户名
[root@nfsnobody lh]# groups user1
user1 : user1 z2