Linux 的文件/目录权限

Linux 的文件权限

 

 

在 Linux 里面,任何一个文件都具有『User, Group 及 Others』 

默认的情况下:

所有的系统上的账号与一般身份使用者,还有那个 root 的相关信息,都是记录在/etc/passwd 这个文件内

个人的密码则是记录在/etc/shadow 这个文件下

Linux 所有的组名都纪录在/etc/group 内! 

 

文件权限:r w x

r (read):可读取此一文件的实际内容,如读取文本文件的文字内容

w (write):可以编辑、新增或者是修改该文件的内容(但不含删除该文件)

x (eXecute):该文件具有可以被系统执行的权限 

 

文件属性:

 

ls -al (缩写ll)是查看当前位置下的『所有隐藏档与相关的文件属性』 例如:

 

[root@rfjmy7h77vmu src]# ll
total 4
-rw-r--r--   1       root      root            442          Jun 14 14:40     socket_client1.py

 

[ 权限 ]      [连结]  [拥有者]   [群组]     [文件容量]    [ 修改日期 ]        [ 文件名 ] 

1, 第一栏:

 

-rw-r--r-- 代表这个文件的类型与权限(permission) 

 

第一个字符代表这个文件类型 例如:目录、文件或链接文件等等:

o 当为[ d ]则是目录,例如上表档名为『.config』的那一行;
o 当为[ - ]则是文件,例如上表档名为『initial-setup-ks.cfg』那一行;
o 若是[ l ]则表示为连结档(link file);
o 若是[ b ]则表示为装置文件里面的可供储存的接口设备(可随机存取装置)例如:硬盘,软盘
o 若是[ c ]则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置) 

o 若是[ s]则表示为数据接口文件(sockets)

  • 这种类型的文件通常被用在网络上的数据承接了。我们可以启动一 个程序来监听客户端的要求, 而客户端就可以透过这个 socket 来进行数据的沟通了 ,最常在/run 或/tmp 这些个目录中看到这种文件类型了。 

o  若是[ p ]则表示为数据输送文件(FIFO, pipe)

  • FIFO 也是一种特殊的文件类型,他主要的目的在解决多个程序同时存取一个文件所造成的错误问题 

 

 

接下来的字符中以三个为一组且均为『rwx』 的三个参数的组合。其中,[ r ]代表可读(read)[ w ]代表 可写(write)、[ x ]代表可执行(execute)。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出 现减号[ - ]而已。

第一组为『文件拥有者可具备的权限』即:user,以-rw-r--r--为例, 该文件的拥有者 可以读写,但不可执行;

第二组为『加入此群组之账号的权限』即:group;-rw-r--r--为例, 该group 权限是只可读

第三组为『非本人且没有加入本群组之其他账号的权限』即:others-rw-r--r--为例, 该others 权限是只可读

 

2,第二栏:

 

第二栏表示有多少档名连结到此节点(i-node) 

 

3,第三栏:

 

第三栏表示这个文件(或目录)的『拥有者账号』 

 

4,第四栏

 

第四栏表示这个文件的所属群组 

 

5,第五栏

 

第五栏为这个文件的容量大小,默认单位为bytes;

 

6,第六栏

 

第六栏为这个文件的建档日期或者是最近的修改日期 

显示出完整的时间格式代码:ls -l --full-time 例如:

[root@rfjmy7h77vmu src]# ls -l --full-time
total 12
-rw-r--r-- 1 root root 442 2021-06-14 14:40:10.215033603 +0800 socket_client1.py

7,第七栏

第七栏为这个文件的档名 

比较特殊的是:如果档名之前多一个『 . 』,则代表这个文件为『隐藏档』 

 

Linux文件权限的用途:

-系统保护的功能

-团队开发软件或数据共享的功能:

-未将权限设定妥当的危害 

 

如何改变文件属性与权限 

chgrp :改变文件所属群组

代码:chgrp 需要修改成的组名 文件名

注意:此方法修改组名是要求/etc/group 下要有你所修改的组名,否则会修改失败

[root@rfjmy7h77vmu src]# ll
total 12
-rw-r--r-- 1 root users 442 Jun 14 14:40 socket_client1.py

******************************************

[root@rfjmy7h77vmu src]# chgrp root socket_client1.py
[root@rfjmy7h77vmu src]# ll
total 12
-rw-r--r-- 1 root root 442 Jun 14 14:40 socket_client1.py

 

chown :改变文件拥有者

代码:chown 需要修改成的账号名称 文件或目录

      chown 需要修改成的账号名称:组名 文件或目录

注意:/etc/passwd 这个文件中有纪录的用户名称才能改变 

l例如:

[root@rfjmy7h77vmu src]# chown bin socket_client1.py
[root@rfjmy7h77vmu src]# ll
total 12
-rw-r--r-- 1 bin root 442 Jun 14 14:40 socket_client1.py

******************************************

[root@rfjmy7h77vmu src]# chown root:root socket_client1.py
[root@rfjmy7h77vmu src]# ll
total 12
-rw-r--r-- 1 root root 442 Jun 14 14:40 socket_client1.py

 -改变文件的权限

chmod :改变文件的权限, SUID, SGID, SBIT 等等的特性   

 

权限的设定方法有两种, 分别可以使用数字或者 是符号来进行权限的变更 

-数字类型改变文件权限  代码: chmod 需要修改成的权限数字 文件名

文件的权限字符为:『-rwxrwxrwx』, 这九个权限是三个三个一组的!其中, 我们可以使用数字来代表各个权限,各权限的分数对照表如下:

r 对应的数字是:4

w对应的数字是:2

x对应的数字是:1

 

每种身份(owner/group/others)各自的三个权限(r/w/x)分数是需要累加的,例如当权限为: [-rwxrwx---] 分数 则是:

owner = rwx = 4+2+1 = 7
group = rwx = 4+2+1 = 7
others= --- = 0+0+0 = 0

 

例如:

 

socket_client.py 文件原权限是:-rw-r--r-- 

 

[root@rfjmy7h77vmu src]# chmod 770 socket_client1.py
[root@rfjmy7h77vmu src]# ll
total 12
-rwxrwx--- 1 root root 442 Jun 14 14:40 socket_client1.py

 

-符号类型改变文件权限 

 

chmod 身份=修改后权限 文件名

 

chmod 身份+需要加上的权限 文件名

 

linux权限分别是(1)user (2)group (3)others 三种身份啦!那么我们就可以藉由 u, g, o 来代表三种身份的权限! 

a 则代表 all 亦即全部 的身份! 那么读写的权限就可以写成 r, w, x  ,也就是可以使用底下的方式来看 

 

 

 

 

 

 

原来的:-rw-r--r-- 1 root root 442 Jun 14 14:40 socket_client1.py

 

给user 加上可执行权限 代码如下:

 

-------------------------------------------

 

[root@rfjmy7h77vmu src]# chmod u=rwx socket_client1.py
[root@rfjmy7h77vmu src]# ll
total 12
-rwxr--r-- 1 root root 442 Jun 14 14:40 socket_client1.py

 

--------------------------------

 

[root@rfjmy7h77vmu src]# chmod u+x socket_client1.py

 

[root@rfjmy7h77vmu src]# ll

 

total 12
-rwxr--r-- 1 root root 442 Jun 14 14:40 socket_client1.py

 

----------------------------

 

给所有身份都加上可执行权限

 

[root@rfjmy7h77vmu src]# chmod a+x socket_client1.py

 

[root@rfjmy7h77vmu src]# ll

 

total 12
-rwxr-xr-x 1 root root 442 Jun 14 14:40 socket_client1.py

 

权限对文件/目录的作用如下图:

 

 

 

 

 文件的权限预设:umask

 

umask 就是指定 『目前用户在建立文件或目录时候的权限默认值』
查阅的方式有两种:
1,一种可以直接输入 umask ,就可以看到数字型态的权限设定分数,
分数一共4组,第一组是特殊权限用的,我们先不要理他,只需看后3位

 

因此,linux预设的文件/目录情况如下:
  •   若使用者建立为『文件』则预设『没有可执行( x )权限』,亦即只有 rw 这两个项目,也就是最大为 666 分, 预设权限如下:
    -rw-rw-rw-

  •   若用户建立为『目录』,则由于 x 与是否可以进入此目录有关,因此默认为所有权限均开放,亦即为 777 分, 预设权限如下:
    drwxrwxrwx

 

要注意的是,umask 的分数指的是『该预设默认值需要减掉的权限!』

 若umask 为022,即:owner 权限不变,group 减去w,others 减去 w

  • 建立文件时:(-rw-rw-rw-) - (-----w--w-) ==> -rw-r--r--

  • 建立目录时:(drwxrwxrwx) - (d----w--w-) ==> drwxr-xr-x

 

2,一种则是 加入 -S (Symbolic) 这个选项,就会以符号类型的方式来显示出权限了

 如下:

[root@rfjmy7h77vmu ~]# umask
0022
[root@rfjmy7h77vmu ~]# umask -S
u=rwx,g=rx,o=rx

 文件的特殊权限:SUID, SGID, SBIT

 SUID: 在拥有者权限中用s来表示

当 s 这个标志出现在文件拥有者的 x 权限上时,例如刚刚提到的 /usr/bin/passwd 这个文件的权限 状态:『-rwsr-xr-x』,此时就被称为 Set UID,简称为 SUID 的特殊权限。 基本上 SUID 有这样的限制与功能:

 - SUID 权限仅对二进制程序(binary program)有效;

 -执行者对于该程序需要具有 x 的可执行权限;

-本权限仅在执行该程序的过程中有效 (run-time);

-执行者将具有该程序拥有者 (owner) 的权限。如下图:

 

 

 

SetGID 简称:SGID ,在群组权限中用s表示

 当s 标志在文件拥有者的 x 项目为 SUID,那 s 在群组的 x 时则称为 Set GID, SGID 。

 与 SUID 不同的是,SGID 可以针对文件或目录来设定!

如果是对文件来说,SGID 有如下的功能: 

 -SGID 对二进制程序有用; 

-程序执行者对于该程序来说,需具备 x 的权限 

-执行者在执行的过程中将会获得该程序群组的支持! 

当一个目录设定了 SGID 的权限后,他将具有如下的功能: 

  •   用户若对于此目录具有 r 与 x 的权限时,该用户能够进入此目录;

  •   用户在此目录下的有效群组(effective group)将会变成该目录的群组;

  •   用途:若用户在此目录下具有 w 的权限(可以新建文件),则使用者所建立的新文件,该新文件的群组与此

    目录的群组相同。 

 

StickyBit简称:SBIT,在权限中用t来表示

目前只针对目录有效,对于文件已经没有效果了。SBIT 对于目录的作用是: 

-当用户对于此目录具有 w, x 权限,亦即具有写入的权限时; 

-当用户在该目录下建立文件或目录时,仅有自己与 root 才有权力删除该文件 

 

SUID/SGID/SBIT 权限设定 

用数字更改权限:

SUID: 4

SGID: 2
SBIT: 1

 

假设要将一个文件权限改为『-rwsr-xr-x』时,由于 s 在用户权力中,所以是 SUID ,因此, 在原 先的 755 之前还要加上 4 ,也就是:『 chmod 4755 filename 』来设定! 

例如:

[root@study ~]# cd /tmp
[root@study tmp]# touch test <==建立一个测试用空档 [root@study tmp]# chmod 4755 test; ls -l test <==加入具有 SUID 的权限 -rwsr-xr-x 1 root root 0 Jun 16 02:53 test 

 

用符号来修改权限

其中 SUID 为 u+s ,而 SGID 为 g+s ,SBIT 则是 o+t  

 例如:

# 设定权限成为 -rws--x--x 的模样:
[root@study tmp]# chmod u=rwxs,go=x test; ls -l test -rws--x--x 1 root root 0 Jun 16 02:53 test

# 承上,加上 SGID 与 SBIT 在上述的文件权限中! [root@study tmp]# chmod g+s,o+t test; ls -l test -rws--s--t 1 root root 0 Jun 16 02:53 test 

 

 

 

权限与指令间的关系

 

一、让用户能进入某目录成为『可工作目录』的基本权限为何:
  可使用的指令:例如 cd 等变换工作目录的指令;
  •   目录所需权限:用户对这个目录至少需要具有 x 的权限

  •   额外需求:如果用户想要在这个目录内利用 ls 查阅文件名,则用户对此目录还需要 r 的权限。

 

 

二、用户在某个目录内读取一个文件的基本权限为何?
  •   目录所需权限:用户对这个目录至少需要具有 x 权限;

  •   文件所需权限:使用者对文件至少需要具有 r 的权限才行!

  •   可使用的指令:例如之前学到的到的 cat, more, less 等等 

三、让使用者可以修改一个文件的基本权限为何?
  •   目录所需权限:用户在该文件所在的目录至少要有 x 权限;

  •      目录所需权限:用户在该文件所在的目录至少要有 x 权限;
  •   可使用的指令:例如 nano 或未来要介绍的 vi 编辑器等; 
  •  

 

四、让一个使用者可以建立一个文件的基本权限为何?

目录所需权限: w, x 重点在w权限

 

五、让用户进入某目录并执行该目录下的某个指令之基本权限为何?

  •   目录所需权限:用户在该文件所在的目录至少要有 x 权限;

  •   文件所需权限:使用者在该文件至少需要有 x 的权限

例题1:
让一个使用者 dmtsai 能够进行『cp /dir1/file1 /dir2』的指令时,请说明 dir1, file1, dir2 的最小所需权限为何?
答:
执行 cp 时, dmtsai 要『能够读取来源文件,并且写入目标文件!』所以应参考上述第二点与第四点的说明! 因此各 文件/目录的最小权限应该是:

  •   dir1 :至少需要有 x 权限;

  •   file1:至少需要有 r 权限;

  •   dir2 :至少需要有 w, x 权限。

 

例题2:
有一个文件全名为 /home/student/www/index.html ,各相关文件/目录的权限如下:

drwxr-xr-x 23 root root 4096 Sep 22 12:09 /
drwxr-xr-x 6 root root 4096 Sep 29 02:21 /home

drwx------ 6 student  student 4096 Sep 29 02:23 /home/student


drwxr-xr-x 6 student  student 4096 Sep 29 02:24 /home/student/www


-rwxr--r-- 6 student  student 369 Sep 29 02:27 /home/student/www/index.html


请问 vbird 这个账号(不属于 student 群组)能否读取 index.html 这个文件呢? 答:

 

虽然 www 与 index.html 是可以让 vbird 读取的权限,但是因为目录结构是由根目录一层一层读取的,因此 vbird 可 进入 /home 但是却不可进入 /home/student/ ,既然连进入 /home/student 都不许了,当然就读不到 index.html 了! 所以答案是『vbird 不会读取到 index.html 的内容』喔!

那要如何修改权限呢?其实只要将 /home/student 的权限修改为最小 711 ,或者直接给予 755 就可以啰!这可是很 重要的概念喔!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2021-06-15 10:17  wode110  阅读(671)  评论(0编辑  收藏  举报