用户和用户组简介
创建用户的同时会创建同名的用户组,对于这种方式出现的用户和用户组之间的关系为:
用户可以属于多个用户组,但是用户至少属于一个用户组,不存在不属于任何一个用户组的用户
,也不会存在一个用户都没有的用户组
。
初始用户组
和有效用户组
:任何一个新用户创建成功后都会属于一个用户组,这是系统自动执行的,这个用户组就是初始用户组
,一个用户只能有一个初始用户组
,如果此时还有另一个用户2
,并且将这个用户2
加入前一个用户的初始用户组
,那么对于用户2
来说,前一个用户的用户组就变成了用户2
的有效用户组
。
任何一个用户在创建成功后,都会有一个初始用户组
,一般初始用户组
的组名就是用户的名称,所以这就是为什么不存在不属于任何一个用户组的用户
的原因;当一个用户组(对于某个用户来说,就是它的初始用户组
)中没有用户或者对于组内的任何用户来说,这个用户组是他们的有效用户组
,操作系统就会将这个用户组删除,这就解释了为什么不存在一个用户都没有的用户组
,因为一个用户组要想存在,最起码要有一个用户,并且对于这个用户来说,这个用户组是它的初始用户组
。
Ubuntu系统中,在\etc
中存在passwd
和group
两个文件,者两个文件记录了用户和用户组的相关信息,passwd
文件中记录了用户名和用户组之间的对应关系,group
记录了用户组和组内成员的关系,但是它的记录有一点需要注意,通过例子说明:
假设现在有一个用户user
,他的初始用户组名为user
,还有另外一个用户组stu
,将user
用户加入stu
用户组,此时,在passwd
文件中可以看到和user
用户相关的组名只有user
组,这就说明,passwd
文件中记载的用户与组的对应关系是用户与他的初始用户组的对应关系
;group
文件中可以看到stu
组的组成员包括user
用户,但是user
组的成员不包括user
用户,根据用户和初始用户组的关系可知,一个用户组要想存在,以它为初始用户组的用户必须存在
,也就是说用户组和以它为初始用户组的用户
是缺一不可的,所以没有必要在group
文件中重新记录这一信息。
注意:Ubuntu可以直接创建组,即不是通过创建用户而导致创建组
,直接创建的组
对于任何用户来说都是有效用户组
,直接创建的组
可以作为空组(没有成员的组
)存在。
用户信息查看
(1)查看用户基本信息
查看用户基本信息,在\etc
目录下有记载用户信息的文件passwd
,可以使用cat \etc\passwd
命令进行查看
# 查看用户信息
fu@fu-virtual-machine:~$ cat /etc/passwd | grep -Ew fu
fu:x:1000:1000:Fu,,,:/home/fu:/bin/bash
#1 2 3 4 5 6 7
如上所示,将passwd
中关于当前用户的信息分为了7
列,每一列的含义如下:
第1列:表示用户名;
第2列:原本表示密码,但是因为不安全,将用户和密码的对应关系转移到了另一个文件;
第3列:表示用户ID(UID),好比每个人的身份证号码;
第4列:表示初始用户组ID(GID);
第5列:表示该对用户的描述信息,比如用户的地址、电话等等;
第6列:表示用户目录,一般为:/home/用户名;用户目录不一定存在。
第7列:表示用户的shell,用户可以自定义shell,默认的shell是bash。
(2)查看用户和密码的对应关系
查看用户和密码,在\etc
中有shadow
文件,这个文件中记载了用户和密码的对应信息。使用sudo \etc\shadow
命令可以进行查看。sudo
表示使用超级管理员权限运行命令,普通用户的权限有限制,导致有些命令无法运行。
# 查看用户和密码的对应关系
fu@fu-virtual-machine:~$ sudo cat /etc/shadow | grep -Ew "((fu)|(root))"
[sudo] fu 的密码:
# "root"用户,超级管理员
root:!:18924:0:99999:7:::
fu:$6$Yx574/Jf0vWn9tes$e2tRfGD.zcbVjrD.YTV.bMUL0tcykgFpZ064IzLiHFQOze6eQKOGp3wNmOrnJGR652sWLKcy96HDXFyX39SMc.:
18924:0:99999:7:::
shadow
中内容项目分隔与passwd
文件中内容项的分隔方式相同,都是使用:
进行分隔,这里只需要查看前两列内容就可以;前两列内容项的含义如下:
第一列:表示用户名;
第二列:表示用户的密码,"shadow"文件中显示的密码是经过加密后的形式,很难破解。
注意:第一行有一个root
用户,这是超级管理员,想做什么就做什么,但是它的密码那一列显示了一个!
,这表示:root
用户没有启用。
(3)id
命令查看当前用户与有关组的信息:
id
:显示当前用户的用户名和用户编号的信息、初始用户组和组编号的信息、有效用户组和组编号的信息;
# 使用"id"命令查看当前用户与有关组的信息
fu@fu-virtual-machine:/home$ id
用户id=1000(fu) 组id=1000(fu) 组=1000(fu),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),120(lpadmin),132(lxd),133(sambashare)
id -u
:查看当前用户的用户编号(UID
);
# 查看当前用户的用户编号(UID)
fu@fu-virtual-machine:/home$ id -u
1000
id -g
:查看当前用户的初始用户组编号(GID
);
# 查看当前用户的初始用户组编号(GID)
fu@fu-virtual-machine:/home$ id -g
1000
id -G
:查看当前用户的所有有效用户组编号;
# 查看当前用户的所有有效用户组编号
fu@fu-virtual-machine:/home$ id -G
1000 4 24 27 30 46 120 132 133
id -n
:与-u
、-g
、-G
配合,输出编号对应的名称。
# 输出当前用户名
fu@fu-virtual-machine:/home$ id -un
fu
# 输出当前用户的初始用户组名
fu@fu-virtual-machine:/home$ id -gn
fu
# 输出当前用户的所有有效用户组名
fu@fu-virtual-machine:/home$ id -Gn
fu adm cdrom sudo dip plugdev lpadmin lxd sambashare
用户组信息查看
(1)用户组基本信息查看
用户组基本信息查看,在/etc
下有group
文件,这个文件详细描述了用户组的相关信息。可以使用cat /etc/group
命令进行查看。
# 查看用户组信息
fu@fu-virtual-machine:~$ cat /etc/group | grep -Ew ^fu
fu:x:1000:
#1 2 3 4
用户组信息中的内容项之间以:
分隔,一共分为4
列,每一列含义如下:
第1列:表示组名;
第2列:原本表示管理密码,但是由于不安全,内容迁徙到了别的文件中;
第3列:表示组ID(GID);
第4列:表示该组内的成员,此时为空,表示该组内还没有"以该组为有效用户组的用户成员"。
(2)组管理相关信息查看
在/etc
下有gshadow
文件,其中记录了组管理相关信息。使用sudo /etc/gshadow
命令进行查看。
# 查看组管理相关信息
fu@fu-virtual-machine:~$ sudo cat /etc/gshadow | grep -Ew ^fu
[sudo] fu 的密码:
fu:!::
#1 234
组管理相关信息中的内容项以:
分隔,一共4
列,每一列含义如下:
第1列:表示组名;
第2列:表示组管理密码,当该组存在管理员时,该字段就会有值,此时显示为"!"表示该组没有管理员;
第3列:表示管理员用户名;
第4列:表示组内成员,与"group"中的组内成员内容项一样。
用户管理:
(1)用户添加
用户添加的命令格式为:useradd [-选项] [选项参数] 用户名
。
useradd joker1
:创建一个用户名是joker1
的账户;默认下是不会为其创键用户目录的。
# 创建用户"joker1"
fu@fu-virtual-machine:/home$ sudo useradd joker1
# "/home"下没有"joker1"用户的用户目录
fu@fu-virtual-machine:/home$ ls
fu
# 输出"passwd"中关于"joker1"的内容
fu@fu-virtual-machine:/home$ cat /etc/passwd | grep -Ew ^joker1
# 发现第6列内容为"/home/joker1"的目录
# 但是实际上,该目录并不存在
# 这就是为什么说该列内容表示的用户目录不一定存在的原因
joker1:x:1001:1001::/home/joker1:/bin/sh
# 查看组信息
fu@fu-virtual-machine:/home$ cat /etc/group | grep -Ew ^joker1
# 看到用户组名为"joker1",与"joker1"用户同名,是"joker1"用户的初始用户组
joker1:x:1001:
useradd -m joker2
:创建一个用户名是joker2
的用户,同时为其创建对应的用户目录。
# 初始"/home"下的内容,只有"fu"用户的用户目录
fu@fu-virtual-machine:/home$ ls
fu
# 带"-m"选项创建"joker2"用户
fu@fu-virtual-machine:/home$ sudo useradd -m joker2
# 为"joker2"用户创建了用户目录
fu@fu-virtual-machine:/home$ ls
fu joker2
# 查看"passwd"和"group"对应关于"joker2"的内容
fu@fu-virtual-machine:/home$ cat /etc/passwd | grep -Ew ^joker2
joker2:x:1002:1002::/home/joker2:/bin/sh
fu@fu-virtual-machine:/home$ cat /etc/group | grep -Ew ^joker2
joker2:x:1002:
useradd -c "I am joker3" joker3
:创建一个用户名是joker3
的用户,并且为其指定了描述信息,描述信息对应passwd
文件中的第5列:用户的描述信息。
# 带选项"-c",创建"joker3"用户,为"joker3"用户制定了描述信息
fu@fu-virtual-machine:/home$ sudo useradd -mc "I am joker3" joker3
fu@fu-virtual-machine:/home$ ls
fu joker2 joker3
# 查看"passwd"文件
fu@fu-virtual-machine:/home$ cat /etc/passwd | grep -Ew ^joker3
# 发现描述信息:"I am joker3"
joker3:x:1003:1003:I am joker3:/home/joker3:/bin/sh
useradd -g joker3 joker4
:创建一个用户名是joker4
的用户,并将他的初始用户组
设置为joker3
,如果-g
后面的组名不存在的话,会报错。
# 创建一个用户名是"joker4"的用户,并将它的初始用户组指定为"joker3"
# 这里使用了多个带参数的选项创建用户
# 使用短歌带参数选项的语法格式为:命令 带参选项1 参数1 带参选项2 参数2 ... [命令参数]
# 没有参数的选项只能和第一个出现的带参数选项连写,且带参数选项必须出现在最后
# 好比:"-mg joker3"
fu@fu-virtual-machine:/home$ sudo useradd -mc "I am joker4" -g joker3 joker4
# 查看用户目录
fu@fu-virtual-machine:/home$ ls
fu joker2 joker3 joker4
# 查看"passwd"文件
fu@fu-virtual-machine:/home$ cat /etc/passwd | grep -Ew ^joker[3-4]
joker3:x:1003:1003:I am joker3:/home/joker3:/bin/sh
joker4:x:1004:1003:I am joker4:/home/joker4:/bin/sh
# 查看"group"文件
fu@fu-virtual-machine:/home$ cat /etc/group | grep -Ew ^joker3
joker3:x:1003:
# 发现"joker4"的初始用户组ID为"1003"
# "1003"对应"group"文件中"joker3"组的组ID
# 现在"joker3"和"joker4"的初始用户组都是"joker3"组
# 所以在"group"文件中"joker3"用户组的成员没有显示"joker4"用户
useradd -G joker3 joker5
:创建用户名为joker5
的用户,并将其加入了joker3
用户组,即现在joker5
用户以joker3
用户组为有效用户组
。
# 创建"joker5"用户,且以"joker3"用户组为有效用户组
fu@fu-virtual-machine:/home$ sudo useradd -mc "I am joker5" -g joker2 -G joker3 joker5
# 打印用户目录
fu@fu-virtual-machine:/home$ ls
fu joker2 joker3 joker4 joker5
# 查看"passwd"文件
fu@fu-virtual-machine:/home$ cat /etc/passwd | grep -Ew ^joker[245]
joker2:x:1002:1002::/home/joker2:/bin/sh
joker4:x:1004:1003:I am joker4:/home/joker4:/bin/sh
joker5:x:1005:1002:I am joker5:/home/joker5:/bin/sh
# 查看"group文件"
fu@fu-virtual-machine:/home$ cat /etc/group | grep -Ew joker3
joker3:x:1003:joker5
# 在"passwd"文件中发现"joker5"用户的初始用户组为我们所指定的"joker2"用户组
# 在"group"文件中发现,发现"joker3"用户组多出了一个"joker5"成员
# 这表明,"joker5"用户以"joker3"组为有效用户组
(2)用户激活
首先观察一下shadow
文件中以上创建的用户信息:
# 查看"shadow"文件中"joker"系列用户的内容
fu@fu-virtual-machine:/home$ sudo cat /etc/shadow | grep -Ew ^joker[1-5]
joker1:!:18929:0:99999:7:::
joker2:!:18929:0:99999:7:::
joker3:!:18929:0:99999:7:::
joker4:!:18929:0:99999:7:::
joker5:!:18929:0:99999:7:::
任何新创建的用户,起初都是未启动状态,这就是为什么shadow
文件中每一个用户的密码字段都是!
的原因;
激活用户的方法:修改新创建用户的密码。
修改密码命令为:passwd
。passwd
命令与\etc\passwd
文件没半毛钱关系。
sudo passwd joker1
:修改用户joker1
的密码。
# 使用"passwd"命令修改"joker1"用户,以达到激活用户的目的
fu@fu-virtual-machine:/home$ sudo passwd joker1
# 你输入的密码不会显示在控制台上
新的 密码:
重新输入新的 密码:
passwd:已成功更新密码
# 查看"shadow"文件中"joker"系列用户的信息
# 发现"joker1"用户密码修改成功,表示"joker1"用户激活
fu@fu-virtual-machine:/home$ sudo cat /etc/shadow | grep -Ew ^joker[1-5]
joker1:$6$tNPT8FkimEHMLDGQ$xI4Z2tiia0Nz3fy6sFeOl9LMgOZGUMnKqlWV47hQppjeOjwi0k2ZZRsm13E2tEDUr0V1ZLgxM/3lJrFvj1Iu21:18929:0:99999:7:::
joker2:!:18929:0:99999:7:::
joker3:!:18929:0:99999:7:::
joker4:!:18929:0:99999:7:::
joker5:!:18929:0:99999:7:::
注意:root
用户归根到底也是一个用户,也是用上述方法进行激活的。
注意:推荐先看完(3)用户切换
后,再返回看以下剩余内容。
passwd -l joker2
:锁定joker2
用户,joker2
用户不能在shell
中切换或者登录系统;
# 锁定"joker2"用户
fu@fu-virtual-machine:~/桌面$ sudo passwd -l joker2
[sudo] fu 的密码:
# 锁定成功
passwd:密码过期信息已更改。
# 无法切换到"joker2"用户
fu@fu-virtual-machine:~/桌面$ su -l joker2
密码:
su: 认证失败
passwd -u joker2
:解锁joker2
用户,允许joker2
用户在shell
中切换或者登陆系统。
# 无法切换到"joker2"用户
fu@fu-virtual-machine:~/桌面$ su -l joker2
密码:
su: 认证失败
# 解锁用户
fu@fu-virtual-machine:~/桌面$ sudo passwd -u joker2
passwd:密码过期信息已更改。
# 切换成功
fu@fu-virtual-machine:~/桌面$ su -l joker2
密码:
# 输出用户名
$ id -un
joker2
(3)用户切换
用户切换的命令为:su
su -
:表示直接切换到root
用户;
# 看"@"符号之前的字符串,那就是用户名
# 起初是"fu"用户
fu@fu-virtual-machine:/home$ su -
密码:
# 输入正确密码后,"@"符号之前的用户名变成了"root"用户
# 恭喜你,超级用户切换成功,请小心操作
root@fu-virtual-machine:~#
# 输出当前用户名
root@fu-virtual-machine:~# id -un
root
su -l joker2
:切换到joker2
用户;
# 切换到"joker2"用户
fu@fu-virtual-machine:/home$ su -l joker2
密码:
# 显示当前切换的用户名
$ id -un
joker2
exit
:退出当前通过shell
命令切换的用户,返回登录当前系统的用户。
# 切换为"joker2"用户
fu@fu-virtual-machine:~/桌面$ su -l joker2
密码:
$ id -un
joker2
# 退出切换的用户
$ exit
# 返回当前系统登录的用户
fu@fu-virtual-machine:~/桌面$ id -un
fu
(4)用户信息修改
需要root
权限,用户信息修改命令:usermod
usermod -g joker3 joker5
:将joker5
用户的初始用户组改为joker3
# 查看`passwd`文件中`joker`系列用户信息
# 此时`joker5`用户的初始用户组是"1005",即"joker5"用户组
fu@fu-virtual-machine:~$ cat /etc/passwd | grep -Ew joker[1-5]
joker1:x:1001:1001::/home/joker1:/bin/sh
joker2:x:1002:1002::/home/joker2:/bin/sh
joker3:x:1003:1003:I am joker3:/home/joker3:/bin/sh
joker4:x:1004:1003:I am joker4:/home/joker4:/bin/sh
joker5:x:1005:1002:I am joker5:/home/joker5:/bin/sh
# 查看"joker3"用户组的编号
fu@fu-virtual-machine:~$ cat /etc/group | grep -Ew joker3
joker3:x:1003:joker5
# 修改"joker5"用户的初始用户组
fu@fu-virtual-machine:~$ sudo usermod -g joker3 joker5
# 修改成功,此时"joker5"用户的初始用户组变成了"joker3"用户组
fu@fu-virtual-machine:~$ cat /etc/passwd | grep -Ew joker[5]
joker5:x:1005:1003:I am joker5:/home/joker5:/bin/sh
usermod -G joker2 joker5
:将joker5
用户加入joker2
组,即joker5
用户将以joker2
组为有效用户组
。
# 打印"passwd"文件中"joker2"用户和"joker5"用户的信息
fu@fu-virtual-machine:~$ cat /etc/passwd | grep -Ew joker[25]
joker2:x:1002:1002::/home/joker2:/bin/sh
joker5:x:1005:1003:I am joker5:/home/joker5:/bin/sh
# 打印"group"文件中"joker2"、"joker3"、"joker5"组的信息
fu@fu-virtual-machine:~$ cat /etc/group | grep -Ew joker[235]
joker2:x:1002:
joker3:x:1003:joker5
# 但是没有"joker5"用户组的信息
# 这是因为"joker5"用户的初始用户组已经变成了"joker3"
# "joker5"用户组此时成为了空组,所以被系统自动删除了
# 将"joker5"用户加入"joker2"组
fu@fu-virtual-machine:~$ sudo usermod -G joker2 joker5
# 查看"group"文件,发现"joker2"组的成员多出了"joker5"用户
# 说明"joker5"用户以"joker2"用户组为有效用户组
fu@fu-virtual-machine:~$ cat /etc/group | grep -Ew joker2
joker2:x:1002:joker5
usermod -c "Hello, I am joker5" joker5
:将joker5
用户的描述信息改为Hello, I am joker5
。
# 查看"passwd"文件中"joker5"用户信息
fu@fu-virtual-machine:~$ cat /etc/passwd | grep -Ew joker5
joker5:x:1005:1003:I am joker5:/home/joker5:/bin/sh
# 修改"joker5"用户的描述信息
fu@fu-virtual-machine:~$ sudo usermod -c "Hello, I am joker5" joker5
# 修改成功,描述信息改变
fu@fu-virtual-machine:~$ cat /etc/passwd | grep -Ew joker5
joker5:x:1005:1003:Hello, I am joker5:/home/joker5:/bin/sh
usermod -L joker5
:等同于passwd -l joker5
。
# 锁定"joker5"用户
fu@fu-virtual-machine:~$ sudo usermod -L joker5
# "joker5"用户登陆失败
fu@fu-virtual-machine:~$ su -l joker5
密码:
su: 认证失败
usermod -U joker5
:等同于passwd -u joker5
。
# "joker5"用户无法切换
fu@fu-virtual-machine:~$ su -l joker5
密码:
su: 认证失败
# 解锁"joker5"用户
fu@fu-virtual-machine:~$ sudo usermod -U joker5
# 成功切换至"joker5"用户
fu@fu-virtual-machine:~$ su -l joker5
密码:
# 输出用户名
$ id -un
joker5
(5)用户删除
用户删除命令为:userdel
userdel joker5
:删除joker5
用户,用户目录不会删除。如果想要连带用户目录也删了,使用-r
选项。
# 查看"joker"系列用户信息
fu@fu-virtual-machine:~$ cat /etc/passwd | grep -Ew joker[1-5]
joker1:x:1001:1001::/home/joker1:/bin/sh
joker2:x:1002:1002::/home/joker2:/bin/sh
joker3:x:1003:1003:I am joker3:/home/joker3:/bin/sh
joker4:x:1004:1003:I am joker4:/home/joker4:/bin/sh
joker5:x:1005:1003:Hello,1,123456,123456:/home/joker5:/bin/sh
# 查看"/home"下的用户目录
fu@fu-virtual-machine:~$ ls /home
fu joker2 joker3 joker4 joker5
# 删除"joker5"用户
fu@fu-virtual-machine:~$ sudo userdel joker5
# 查看"joker"系列用户,"joker5"用户消失
fu@fu-virtual-machine:~$ cat /etc/passwd | grep -Ew joker[1-5]
joker1:x:1001:1001::/home/joker1:/bin/sh
joker2:x:1002:1002::/home/joker2:/bin/sh
joker3:x:1003:1003:I am joker3:/home/joker3:/bin/sh
joker4:x:1004:1003:I am joker4:/home/joker4:/bin/sh
# "joker5"用户的用户目录保留了下来
fu@fu-virtual-machine:~$ ls /home
fu joker2 joker3 joker4 joker5
用户组管理
(1)用户组添加
用户组添加命令为:groupadd
。
groupadd jokers
:创建jokers
用户组。
# 查看"joker"系列用户组信息
fu@fu-virtual-machine:~$ cat /etc/group | grep -E ^joker
joker1:x:1001:
joker2:x:1002:
joker3:x:1003:
# 添加用户组"jokers"
fu@fu-virtual-machine:~$ sudo groupadd jokers
# 出现新用户组"jokers"
fu@fu-virtual-machine:~$ cat /etc/group | grep -E ^joker
joker1:x:1001:
joker2:x:1002:
joker3:x:1003:
jokers:x:1004:
(2)用户组删除:
用户组删除命令为:groupdel
groupdel jokers
:删除用户组jokers
。
# 查看"joker"系列用户组
fu@fu-virtual-machine:~$ cat /etc/group | grep -E ^joker
joker1:x:1001:
joker2:x:1002:
joker3:x:1003:
jokers:x:1004:
# 删除"jokers"用户组
fu@fu-virtual-machine:~$ sudo groupdel jokers
# "jokers"用户组删除成功
fu@fu-virtual-machine:~$ cat /etc/group | grep -E ^joker
joker1:x:1001:
joker2:x:1002:
joker3:x:1003: