linux中文件/文件夹的权限

时间:2023-02-06 16:43:13

linux是一个多用户的操作系统,每个用户都有自己的文件,有些文件对用于来讲是保密的,不希望别人看到,有些文件尽管可以被别人看到,但不允许别人去修改,还有些文件是允许所有人*修改的,所以就有了文件的权限。如果用户比较多的话,有些文件对一些人是可读可写的,对令一些人却是隐藏的,这种情况下设置用户组则可以更加有效地来管理权限。本篇博客要讨论的就是这一堆的事情在linux中是如何工作的。

用户/用户组/权限 概览

首先,文件具有三种类型的权限,分别是:
- 可读(r)
- 可写(w)
- 可执行(x)

由于用户组的概念也搀合进来了,所以,每个文件需要分别指明对拥有者/组内成员/组外成员的权限。
来看一下我本机的用户目录下的文件列表

[kite@fedora-zdk ~]$ ls -al
total 132
drwx------. 25 kite kite 4096 9月  16 19:18 .
drwxr-xr-x.  4 root root 4096 9月  14 09:21 ..
-rw-------.  1 kite kite 2555 9月  16 15:59 .bash_history
-rw-r--r--.  1 kite kite  193 5月  30 12:53 .bash_profile
-rw-r--r--.  1 kite kite  231 5月  30 12:53 .bashrc
drwx------. 25 kite kite 4096 9月  16 16:02 .cache
drwxr-xr-x.  2 kite kite 4096 9月  13 21:26 Desktop
drwxr-xr-x.  2 kite kite 4096 9月  13 21:26 Documents

以上是用户目录下的部分文件,包含的信息量是很大的,以.bash_profile文件为例,列表共包含以下信息

-(文件类型)rw-r–r–(文件权限) . 1(连接数) kite(文件拥有着) kite(所属用户组) 193 5月 30 12:53(修改时间) .bash_profile(文件名)

文件类型的话,常见的是两种,-表示文件,d表示文件夹。
文件权限共包含9个字符,每三个字符为一组,前三个是对所有者(owner)的读取/写入/执行权限,中间三个对组内成员(group)的读取/写入/执行权限,最后三个是对组外成员(others)的读取/写入/执行权限。
权限一定是九个字符,如果有权限,则会显示对应的权限代码,读取/写入/执行的权限代码分别是r/w/x,如果没有对应的权限的话,则显示为-

还以.bash_profile文件为例,rw-r--r--,它的owner具有读取和写入的权限,group具有读取权限,others也具有读取权限。
以Desktop文件夹为例,rwxr-xr-x,它的owner具有读取/写入/执行的权限,group和others具有读取和执行权限。

文件权限和文件夹权限

文件的权限比较好理解
- r 表示文件的内容可以被读取
- w 表示这个文件的内容可以被修改。
- x 代表文件可以被执行,一般情况下,.sh文件需要有这个权限。

容易引起误会的是,拥有w权限并不代表可以对此文件进行删除操作和重命名操作,w权限仅代表文件的内容可以被修改。

文件夹的权限稍微有点不一样
- r 表示可以查看此文件夹下的文件名列表
- w 表示可以对此文件夹下的文件进行删除/重命名/移动
- x 表示可以将此文件夹作为working dir,或者说表示可以cd到这个文件夹中

可以将文件夹/文件的关系理解为代码中的list/object,如果一个list是只读的,表示你不能做insert/delete等操作,但仍然可以修改object内部的任何属性。

所以,一个文件是否可以被删除,取决于文件所在的文件夹是否具有w权限。那么,我们同样也可以得出这么一个结论:拥有文件夹的w权限,并不意味着可以对文件夹本身进行重命名或删除,因为这个决定于此文件夹的parent文件夹是否具有w权限。

修改权限

根据对上面内容的理解,我们可以从三个方面来修改一个文件或文件夹的权限

  1. 修改group
  2. 修改owner
  3. 修改文件相对于owner/group/others的权限

接下来分别介绍这三个操作

修改group

chgrp [-R] groupname filename/dirname

chgrp就是change group,意思就是将filename/dirname所在的组修改为groupname组,如果提供-R参数并且最后一个参数是一个文件夹的话,则会递归影响该文件夹下的所有文件和文件夹。

修改owner

chown [-R] owner filename/dirname
chown [-R] owner:groupname filename/dirname

chown就是change owner,意思是将filename/dirnane所属的所有者修改为owner用户,如果提供-R参数并且最后一个参数是一个文件夹的话,则会递归影响该文件夹下的所有文件和文件夹。
该命令还可以使用owner:groupname的形式,在修改owner的同时,顺带着把group也修改了。

修改权限

比起前两个,修改权限更有意思了,使用chmod命令来完成。它的目的就是修改权限对应的9个字符,但支持两种方式,分别是数字方式和字符方式。

数字方式

将owner/group/others所对应的9个权限代码每三个分为一组,共3组,每个权限代码代表一个数字,每组将三个数字求和,最终给出每组代码的和。r=4,w=2,x=1。
例如:rwx=4+2+1=7,rw-=4+2=6,r-x=4+1=5,r–=4
如果希望将a.txt文件的权限修改为rw-r–r–的话,先计算出三组代码之和是(4+2),(4),(4),最终的权限代码是644,最终的命令为

chmod 644 a.txt

字符方式

将owner/group/others对应为三个字符,owner=u(user),group=group,others=o,可以为某一组增加或删除某个权限,也可以直接为某一组设置一个新的权限。增加/删除/重置对应的字符是+/-/=。
假设我想为start.sh增加一个执行权限给拥有者,可以这么写

chmod u+x start.sh

如果我向删除start.sh对应的group和others的执行权限,可以这么写

chmod go-x start.sh

上面的两个命令还可以和到一起写

chmod u+x,go-x start.sh

注意,u+x,go-x中间是没有空格的

如果我希望直接将hello.txt文件的权限设置为rwxr--r--的话,可以这么写

chmod u=rwx,go=r

除了owner=u(user),group=group,others=o之外,还有一个a,代表所有,也就是说,a等价于ugo。如果我希望同时给start.sh对应的owner/group/others都去掉运行权限的话,可以这么写

chmod u-x,g-x,o-x start.sh
chmod ugo-x start.sh

还可以这么写

chmod a-x start.sh

好了,表达能力实在有限,希望我的例子你能够看懂。