- 学习视频来自于B站【小白入门 通俗易懂】2021韩顺平 一周学会Linux。
- 可能会用到的资料有如下所示,下载链接见文末:
- 《鸟哥的Linux私房菜 基础学习篇 第四版》1
- 《鸟哥的Linux私房菜 服务器架设篇 第三版》2
- 《韩顺平_2021图解Linux全面升级》3
这个章节是比较重要的,并且理解起来有一点难度。
在"第8章 用户管理"已经介绍过“用户组”的相关概念(详见8.6节),本小节继续深入介绍文件/目录的“所有者”、“所在组”、“其他组”。在Linux中的每个用户必须属于一个组,不能独立于组外,就像现实生活中每个人都有国籍一样。创建新用户时可以指定将该用户添加到哪个组中;若不特别指定其所在组,系统会默认创建一个同名组,将该用户放进去。当然,用root的管理权限可以改变某个用户所在的组:
# 基本语法-改变用户所在组
usermod -g 新组名 用户名
# 基本语法-改变用户登录的初始目录
usermod -d 目录名 用户名 # 注意用户需要有进入到新目录的权限!!
既然用户会属于某个组,那每个文件也就相应有了“所有者”、“所在组”、“其他组”的概念,上图就较为形象的画出了它们的关系。如上图所示,用户tom
创建了一个文件a.txt
,那么a.txt
的“所有者”就默认是tom
,当然也可以改成其他的“所有者”。而tom
所在的组就默认是a.txt
的“所在组”,该组内的所有成员对该文件享有权限A;Linux下所有其他的组都是a.txt
的“其他组”,“其他组”中的用户对该文件享有权限B。这里的“权限A”、“权限B”都是笼统概念,表示权限不同,后面还会详细介绍。
chown
“所有者”一般为文件/目录的创建者,谁创建了该文件/目录,就自然的成为该文件/目录的所有者。下面是查看和修改文件/目录的“所有者”的基本语法:
# 基本语法-查看文件/目录的所有者
ls -ahl
# 基本语法-修改文件/目录所有者
chown 新的所有者 文件/目录 # 修改所有者
chown 新的所有者:新的所在组 文件/目录 # 修改所有者和所在组
# 常用选项-chown
-R 如果是目录,则使其下所有子文件或目录递归生效
下面展示三个应用案例,前两个查看“所有者”、后两个修改“所有者”【以文件举例,目录同理】:
# 【案例1-查看所有者】使用root创建文件/home/a.txt,并查看其所有者。
[root@CentOS76 ~]# cd /home
[root@CentOS76 home]# touch a.txt
[root@CentOS76 home]# ls -ahl
总用量 32K
drwxr-xr-x. 8 root root 4.0K 7月 20 11:10 .
dr-xr-xr-x. 18 root root 4.0K 7月 13 17:12 ..
-rw-r--r--. 1 root root 0 7月 20 11:09 a.txt
drwx------. 3 jack jack 4.0K 7月 20 11:09 jack
drwx------. 3 king king 4.0K 7月 20 11:09 king
drwx------. 15 lyl lyl 4.0K 7月 13 17:38 lyl
drwx------. 3 milan milan 4.0K 7月 20 11:09 milan
drwx------. 3 tom tom 4.0K 7月 20 11:08 tom
drwx------. 3 zwj wudang 4.0K 7月 20 11:10 zwj
# 上面第三列就是每个文件的所有者
# 【案例2-查看所有者】将上述/home/a.txt的所有者改成tom。
[root@CentOS76 home]# chown tom a.txt
[root@CentOS76 home]# ls -ahl
总用量 32K
drwxr-xr-x. 8 root root 4.0K 7月 20 11:10 .
dr-xr-xr-x. 18 root root 4.0K 7月 13 17:12 ..
-rw-r--r--. 1 tom root 0 7月 20 11:09 a.txt
drwx------. 3 jack jack 4.0K 7月 20 11:09 jack
drwx------. 3 king king 4.0K 7月 20 11:09 king
drwx------. 15 lyl lyl 4.0K 7月 13 17:38 lyl
drwx------. 3 milan milan 4.0K 7月 20 11:09 milan
drwx------. 3 tom tom 4.0K 7月 20 11:08 tom
drwx------. 3 zwj wudang 4.0K 7月 20 11:10 zwj
# 【案例3-修改所有者】新建/home/kkk目录,并将kkk目录下所有的文件和目录的所有者和所在组都修改成tom。
[root@CentOS76 home]# mkdir kkk
[root@CentOS76 home]# touch ./kkk/a.txt
[root@CentOS76 home]# touch ./kkk/b.txt
[root@CentOS76 home]# ll kkk
总用量 0
-rw-r--r--. 1 root root 0 7月 21 11:35 a.txt
-rw-r--r--. 1 root root 0 7月 21 11:35 b.txt
[root@CentOS76 home]# chown -R tom:tom kkk
[root@CentOS76 home]# ll kkk
总用量 0
-rw-r--r--. 1 tom tom 0 7月 21 11:35 a.txt
-rw-r--r--. 1 tom tom 0 7月 21 11:35 b.txt
注意下面这个案例是我将虚拟机状态恢复成最开始的样子,再重新创建所有用户。第一个重复的是我没有恢复之前,该虚拟的样子,我怀疑让我玩出了严重的bug。
[root@CentOS76 home]# cd /home
[root@CentOS76 home]# touch a.txt
[root@CentOS76 home]# ls -ahl
总用量 36K
drwxr-xr-x. 9 root root 4.0K 7月 20 10:43 .
dr-xr-xr-x. 18 root root 4.0K 7月 17 11:49 ..
-rw-r--r--. 1 root root 0 7月 20 10:43 a.txt
drwx------. 3 tom a 4.0K 7月 15 15:49 jack
drwx------. 5 jerry jerry 4.0K 7月 16 16:31 jerry
drwx------. 3 milan jerry 4.0K 7月 15 15:50 king
drwx------. 15 lyl lyl 4.0K 7月 15 10:59 lyl
drwx------. 5 zwj wudang 4.0K 7月 15 12:12 milan
drwx------. 3 zwj a 4.0K 7月 15 15:08 tom
drwx------. 3 jerry 1009 4.0K 7月 16 10:35 zwj
# 上面第三列就是每个文件的所有者
chgrp
那显然,当某个用户创建了一个文件/目录后,该用户所在的组就是这个文件/目录的“所在组”。下面是查看和修改文件/目录的“所在组”的基本语法:
# 基本语法-查看文件/目录所在组
ls -ahl
# 基本语法-修改文件/目录所在的组
chgrp 新的所在组 文件/目录 # 修改所在组
# 常用选项-chgrp
-R 如果是目录,则使其下所有子文件或目录递归生效
下面展示三个应用案例【以文件举例,目录同理】:
提示:老韩演示【案例1】【案例2】都是直接Xshell退出重新登陆,而不是直接
su - 用户名
跳转。
# 【案例1-查看所在组】fox登录,创建文件/home/ok.txt,查看其所在组。
[fox@CentOS76 ~]$ pwd
/home/fox
[fox@CentOS76 ~]$ touch ok.txt
[fox@CentOS76 ~]$ ls
ok.txt
[fox@CentOS76 ~]$ ll
总用量 0
-rw-r--r--. 1 fox monster 0 7月 20 11:43 ok.txt
# 上述第三列表示所有者是fox,第四列表示所在组是monster。
# 【案例2-修改所在组】root登录,新建fruit组,并将上述/home/fox/ok.txt文件的所在组修改到fruit组。
[root@CentOS76 ~]# groupadd fruit
[root@CentOS76 ~]# chgrp fruit /home/fox/ok.txt
[root@CentOS76 ~]# ll /home/fox
总用量 0
-rw-r--r--. 1 fox fruit 0 7月 20 11:43 ok.txt
# 【案例3-修改所在组】root登录,创建/home/kkk目录,并将其下所有的文件和目录的所在组都修改成shaolin(少林)。
[root@CentOS76 home]# mkdir kkk
[root@CentOS76 home]# touch ./kkk/a.txt
[root@CentOS76 home]# touch ./kkk/b.txt
[root@CentOS76 home]# ll kkk
总用量 0
-rw-r--r--. 1 root root 0 7月 21 11:58 a.txt
-rw-r--r--. 1 root root 0 7月 21 11:58 b.txt
[root@CentOS76 home]# chgrp -R shaolin kkk
[root@CentOS76 home]# ll
总用量 32
drwxr-xr-x. 2 root shaolin 4096 7月 21 11:58 kkk
# 其余的文件/目录就不展示了
[root@CentOS76 home]# ll kkk
总用量 0
-rw-r--r--. 1 root shaolin 0 7月 21 11:58 a.txt
-rw-r--r--. 1 root shaolin 0 7月 21 11:58 b.txt
除文件/目录的“所有者”和“所在组”的用户外,系统的其它用户都是文件/目录的其它组。
权限的使用在Linux中是一个重点,相对来说也是一个难点。在10.1节中提到,文件的“当前组”和“其他组”中的成员对该文件享有不同的权限。那Linux中一共有几种权限呢,又是怎么分配的呢?本节就来介绍。比如下面登录root账户创建/home/a.txt文件并写入6个字符——“hello~”,然后使用ll
查看文件列表,如下:
[root@CentOS76 home]# touch a.txt
[root@CentOS76 home]# echo "hello~" >> a.txt
[root@CentOS76 home]# ll
总用量 48
-rw-r--r--. 1 root root 7 7月 21 19:05 a.txt
drwx------. 5 fox monster 4096 7月 22 09:31 fox
drwx------. 3 jack jack 4096 7月 20 11:09 jack
drwxrwxr-x. 5 judy police 4096 7月 21 17:05 judy
drwx------. 3 king king 4096 7月 20 11:09 king
drwx------. 15 lyl lyl 4096 7月 13 17:38 lyl
drwx------. 3 milan milan 4096 7月 20 11:09 milan
lrwxrwxrwx. 1 root root 5 7月 22 09:55 myroot -> /root
drwx------. 3 nick police 4096 7月 21 16:21 nick
drwx------. 5 sheep bandit 4096 7月 21 17:05 sheep
drwx------. 5 tom tom 4096 7月 21 11:06 tom
drwx------. 5 wolf police 4096 7月 21 17:05 wolf
drwx------. 3 zwj mojiao 4096 7月 20 11:10 zwj
下面就以上述第一行的
a.txt
为例,来具体说明每一列的含义:
- 【第1列】10个字符:确定不同用户对该文件的权限。其中第一个字符代表文件类型(常见的有
-
,b
,c
,d
,l
)。其余字符9个字符,每3个一组(rwx)分别代表了该文件的“所有者”、“所在组”的其他用户、“其他组”的所有用户对该文件的读®、写(w)、执行(x)权限。
- 【第0位】:确定文件类型(常见的有
-
,b
,c
,d
,l
)。
-
是普通文件;b
是块设备,如/dev
目录下的硬盘;c
是字符设备文件,如/dev
目录下的鼠标、键盘等;d
是目录,相当于windows的文件夹;l
是链接,相当于windows的快捷方式;。
- 【第1,2,3位】:“所有者”对该文件的rwx权限。—User
- 【第4,5,6位】:“所在组”的其他用户对该文件的rwx权限。—Group
- 【第7,8,9位】:“其他组”的所有用户对该文件的rwx权限。—Other
- 【第2列】
1
:表示文件的“硬连接数”,或者是目录的“子目录数+文件数”。此例中a.txt
是一个普通文件,所以为1。- 【第3列】
root
:文件所有者。此例中a.txt
的所有者显然是root用户。- 【第4列】
root
:文件所在组。此例中a.txt
的所在组显然是root用户的同名组root。- 【第5列】
7
:若为文件,则显示该文件的字节总数(单位:Byte);若为文件夹,则固定显示4096。此例中虽然只向a.txt
中写入了6个字符“hello~”,但是其文档末尾会自动添加一个字符串结束标志\0
,所以一共是7个字符。- 【第6,7,8列】
7月 21 19:05
:该文件/目录的最后修改日期。- 【第9列】
a.txt
:文件/目录名。
那到底什么是rwx权限呢?下面就来进行rwx权限详解【难点】。Linux中“文件”和“目录”的rwx权限有不同的含义:
文件的rwx权限:
- 【
r
】:可以读取、查看该文件。- 【
w
】:代表可写(write):可以修改,但是不代表可以删除该文件。删除一个文件的前提条件是对该文件所在的目录有写权限,才能删除该文件。- 【
x
】:代表可执行(execute):表示系统可以使用./文件名
执行该文件。比如在一个有执行权限的文件a.txt
中写入ls -al
,然后直接在终端输入./a.txt
,那么该指令就会被相应的执行。- 【
-
】:表示没有相应的权限。目录的rwx权限:
- 【
r
】:代表可读(read):表示可以读取该目录的文件列表,比如使用ls
指令。- 【
w
】:代表可写(write):表示可以修改该目录的文件列表,也就是删除、创建、重命名其下的目录/文件。- 【
x
】:代表可执行(execute):表示可以进入该目录,这和文件的x权限非常不同。如果仅有x权限,也可以读写那些有读写权限的文件,但就像摸黑找东西,全靠记忆力。- 【
-
】:表示没有相应的权限。例
a.txt
:所以-rw-r--r--
就表示a.txt
是一个普通文件,“所有者”享有“读”、“写”权限不能“执行”,“所在组”的其他用户只享有“读”权限,“其他组”的所有用户也只享有“读”权限。
注:在Linux中使用BCD8421码表示相应的权限:r=4, w=2, x=1。因此使用数字0~7就可以表示任意组合的权限。
chmod
那通过上面的说明可以看出,一个文件/目录刚被创建好是都分配有默认权限,但有时候这个权限不合适,比如我想要“所在组”的所有用户都拥有对该文件的rw权限,这时候就需要用到chmod
指令来修改权限。下面介绍两种使用chmod
的方式,并给出一些例子:
# 基本语法-chmod
# 【方式一】+、-、=变更权限,u:所有者 g:所有组 o:其他人 a:所有人(u、g、o的总和)
chmod u=rwx,g=rx,o=x 文件/目录名 # 给文件/目录的u用户rwx权限、g用户rx权限、o用户x权限
chmod o+w 文件/目录名 # 给文件/目录的o用户添加w权限
chmod a-x 文件/目录名 # 剥夺文件/目录的a用户的x权限
# 【方式二】r=4,w=2,x=1
chmod 751 文件/目录名 # 等价于chmod u=rwx,g=rx,o=x 文件/目录名
下面展示四个应用实例:
【案例1-使用±=】给abc文件的所有者读/写/执行的权限,给所在组读/执行权限,给其它组读/执行权限。
[root@CentOS76 home]# touch abc
[root@CentOS76 home]# chmod a-rwx abc
[root@CentOS76 home]# ll
总用量 28
----------. 1 root root 0 7月 21 11:15 abc
# 其余的文件/目录就不展示了
[root@CentOS76 home]# chmod u=rwx,g=rx,o=rx abc
[root@CentOS76 home]# ll
总用量 28
-rwxr-xr-x. 1 root root 0 7月 21 11:15 abc
# 其余的文件/目录就不展示了
【案例2-使用±=】给abc文件的所有者除去执行的权限,增加组写的权限。
[root@CentOS76 home]# chmod u-x,g+w abc
[root@CentOS76 home]# ll
总用量 28
-rw-rwxr-x. 1 root root 0 7月 21 11:15 abc
# 其余的文件/目录就不展示了
【案例3-使用±=】给abc文件的所有用户添加读的权限。
[root@CentOS76 home]# chmod a+r abc
[root@CentOS76 home]# ll
总用量 28
-rw-rwxr-x. 1 root root 0 7月 21 11:15 abc
# 其余的文件/目录就不展示了
【案例4-使用数字】给abc文件的权限修改成---------
、rwxr-xr-x
:
[root@CentOS76 home]# chmod 000 abc
[root@CentOS76 home]# ll
总用量 28
----------. 1 root root 0 7月 21 11:15 abc
# 其余的文件/目录就不展示了
[root@CentOS76 home]# chmod 755 abc
[root@CentOS76 home]# ll
总用量 28
-rwxr-xr-x. 1 root root 0 7月 21 11:15 abc
# 其余的文件/目录就不展示了
本小节以《疯狂动物城》为背景,演示如何改变用户的所在组、修改文件的权限。具体进行如下操作:
- 创建两个组(
police
,bandit
)、两个警察用户(nick
,judy
)、两个土匪用户(sheep
,wolf
),它们的分组关系如上图。- root登录,记录wolf已投靠警察。
- judy登录,创建文件judy.txt,设置权限为自己可以读写,本组人可以读写,其它组的用户只能读。
- wolf登录,验证同组人可以进行读写。
- sheep登录,验证其他组的人只能读。
# 1.root登录,创建组和用户,并设置所有用户的密码与用户名相同。
[root@CentOS76 home]# groupadd police
[root@CentOS76 home]# groupadd bandit
[root@CentOS76 home]# useradd -g police nick
[root@CentOS76 home]# useradd -g police judy
[root@CentOS76 home]# useradd -g bandit sheep
[root@CentOS76 home]# useradd -g bandit wolf
[root@CentOS76 home]# passwd judy
更改用户 judy 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[root@CentOS76 home]# passwd nick
更改用户 nick 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[root@CentOS76 home]# passwd sheep
更改用户 sheep 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[root@CentOS76 home]# passwd wolf
更改用户 wolf 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
# 2.root登录,标记wolf已投靠警察
[root@CentOS76 ~]# id wolf
uid=1010(wolf) gid=1011(bandit) 组=1011(bandit)
[root@CentOS76 ~]# usermod -g police wolf
[root@CentOS76 ~]# id wolf
uid=1010(wolf) gid=1010(police) 组=1010(police)
# 3.judy登录,创建文件/home/judy/judy.txt,设置权限为自己可以读写,本组人可以读写,其它组的用户只能读。
[judy@CentOS76 ~]$ touch judy.txt
[judy@CentOS76 ~]$ ll
总用量 0
-rw-r--r--. 1 judy police 0 7月 21 16:26 judy.txt
[judy@CentOS76 ~]$ chmod g=rw,o=r judy.txt # 修改文件权限
[judy@CentOS76 ~]$ ll
总用量 0
-rw-rw-r--. 1 judy police 0 7月 21 16:26 judy.txt
[judy@CentOS76 ~]$ chmod g=rwx,o=rx /home/judy # 修改目录权限
[judy@CentOS76 ~]$ ll /home
总用量 44
drwxrwxr-x. 5 judy police 4096 7月 21 16:26 judy
# /home中其他的目录/文件就不显示了。
# 注意目录权限也要更改,否则当前组的其他成员也无法访问文件夹。
# 4.wolf登录,发现可以对judy.txt进行读写。
[wolf@CentOS76 ~]$ ll /home/judy
总用量 0
-rw-rw-r--. 1 judy police 0 7月 21 16:26 judy.txt
[wolf@CentOS76 ~]$ vim /home/judy/judy.txt
[wolf@CentOS76 ~]$ echo "i am wolf" >> /home/judy/judy.txt
[wolf@CentOS76 ~]$ cat /home/judy/judy.txt
i am wolf
# 5.sheep登录,只能读不能写。
[sheep@CentOS76 ~]$ ll /home/judy
总用量 4
-rw-rw-r--. 1 judy police 10 7月 21 16:57 judy.txt
[sheep@CentOS76 ~]$ echo "i am sheep" >> /home/judy/judy.txt
-bash: /home/judy/judy.txt: 权限不够
[sheep@CentOS76 ~]$ cat /home/judy/judy.txt
i am wolf
结论:
- 若想对某个目录的文件进行读、写等操作,需要首先有对该目录的执行权限。
- 至少需要给目录读、执行两个权限,才能使得其他用户进入并查看该目录。
- Xshell在用户登录时会检测其环境变量(也就是所在组等设置),若root用户修改了某用户的所在组,最简单的方法就是重新登录该用户,就能检测到所在组的变化。
《鸟哥的Linux私房菜 基础学习篇 第四版》 ↩︎
《鸟哥的Linux私房菜 服务器架设篇 第三版》 ↩︎
《韩顺平_2021图解Linux全面升级》 ↩︎