Linux 文件目录权限


chmod [选项] mode file.....

chmod先来开道。

chmod选项常用选项-R,--recursive 递归操作,作用目录以及目录下的所有文件(..目录除外)

 

Linux将分成三类人进行权限管理:拥有者、所属组以及其他人。拥有者有哪些权限?(其实拥有者可以对文件为所欲为)所属组有哪些权限?其他人有哪些权限?

拥有者、所属组可以使用chown、chgrp命令进行修改,这里不做解释。

Linux将权限分成九列,如上图的rw-r--r--,rw-r--r--之前的-表示该文档是普通文件,如果是d,表示为目录,c表示块设备等等

rw- r-- r--其中前三列表示拥有者的权限,中三列表示所属组的权限,后三列表示其他人所拥有的权限。

r(read):对于目录和文件都表示可读

w(write):对于目录表示可创建文件,也可删除文件;对于文件表示可以对文件内容进行写操作

x(execute):执行;对于目录表示可以进入目录内,如cd /home ; 对于文件表示可执行,如shell脚本

 

一、chmod对文件权限操作

 u表示拥有者;g表示所属组;o表示其他人。a表示对上述三者都进行操作

 

利用+加号给拥有者或所属组或其他人添加一个或几个权限:u+x,g+wx 给拥有者添加一个可执行的权限,给所属组添加了写和执行的权限;

利用-减号给拥有者或所属组或其他人减掉一个或几个权限:o-r 将其他人对该文件读的权限减掉

所以chmod u+x,g+wx,o-r log2010.log  表示对log2010.log文件,拥有者添加可执行权限,变成拥有者既可以对该文件执行,也可以对该文件读和写;所属组添加写和执行的权限,那么所属组对该文件有读写和执行的权限,其他人。。。。(注意,u、g、o用逗号分割开)

 

=等号表示直接设置u、g、o为什么权限。例如chmod u=rwx,g=rwx log2011.log  表示对log2011.log文件拥有者、所属组都拥有读写和执行权限,o其他人保持不动,因为没有对其他人操作

 

 首先创建空白文件log1919.log,修改拥有者和所属组为tel和tel2,修改权限为r--rw-r--,这时候切换到tel用户,vim log1919.log编辑该文件,提示readonly,写进入内容后,可以使用wq!强制保存,然后使用cat log1919.log 可以看到虽然拥有者对该文件只有读权限,但是拥有者tel依然对他进行了写操作,下面在测试一下其他者是否可读可写?

 读取log1919.log文件没问题,但是写操作提示没有权限,无论是否wq!

 

二、chmod对目录权限操作

chmod也可以对目录设置任何权限,比如r--------、rw-r--r--、rwx-rw-rw等等,但实际上只有三种权限是有意义的:---、rwx、r-x

举例:

rw-权限,对目录能读,能创建和删除,但是却不可以进入目录,当然你可以利用绝对路径ls -l /home/log来查看该目录下有什么文件,也可以通过绝对路径创建文件目录,但是你不觉得怪异吗?

再比如:--x,没有读和写的权限,但是有进入目录的权限。

 你切换到其他用户tel,虽然cd /home/log目录下,但是无法查看,也不能创建删除,能干什么?

所以基本上目录只有---、rwx、r-x三种权限有意义

 

三、文件的特殊权限

文件特殊权限分为suid、sgid和sticky

suid对应数字权限4,sgid对应数字权限2,sticky对应数字权限1

如何设置呢?

 两种设置姿势:一种采用数字权限设置:chmod 4464 log1919.log  数字4464的第一个数字4表示s,第二个4表示r,第三个6表示rw,第四个4表示r

chmod g+s  log2010.log  如同前文设置的模式一样

 

对于普通文件SUID与SGID的作用是类似的:

在Unix中,进程在访问资源的时候,需要四种有效id,分别是uid、gid、euid、egid,内核通过对这四个id的识别来进行资源权限访问,实质应该说是内核对euid、egid的识别。

之所以说四个id是因为当进程没有设置SUID、SGID时,euid=uid,egid=gid,比如:

假设log1919.log有执行权限,同时log1919.log的拥有者所属组为tel,uid=1000,gid=1000,在用户tel2 uid=1001,gid=1001 运行log1919.log时,进程形成的euid=1001(tel2)、egid=1001(tel2),针对euid、egid内核判断tel2对log1919.log有哪些权限。

当可执行文件log1919.log设置SUID、SGID权限,那么tel2 uid=1001,gid=1001将获得可执行文件拥有者或者所属组的权限,这时候tel2运行log1919.log时,进程形成的euid=1000(tel)、egid=1000(tel),也就是tel2将临时获得文件log1919.log的拥有者或者所属组的权限。

 passwd就是一个典型的例子

首先普通用户对/etc/shadow是没有任何权限的,也可以看到root用户给tel设置的密码列是mkkb37开始的。照理来说,tel对/etc/shadow没有任何权限,那么tel是没办法修改密码的,因为没办法修改/etc/shadow的内容的。

但是切换到tel用户,利用passwd命令却给tel自己重新设置了一个密码,重新切换到root用户,也可以看到tel的密码列变成了Avz4开头了,说明/etc/shadow被普通用户tel修改了,这就可怕了。原因是passwd命令,我们可以ls -l看到passwd命令的拥有者是root,同时passwd是设置了SUID,拥有者权限rws,其他用户有r-x权限,所以tel可以执行passwd,同时tel在执行passwd命令的时候,进程形成的euid=0(root),egid=1000(tel),也就是tel用户临时获得了root权限,因为root在linux里是无所不能的上帝,利用root权限将/etc/shadow修改了(在这里注意tel passwd命令只能修改自己的密码,后面不能紧跟用户,因为passwd username是无法执行的,执行不到,被设置了)

同样SGID也可以临时获得可执行文件所属组的权限

以上总结:对于可执行二进制文件,SUID、SGID可让不具备权限的用户在执行可执行文件时,临时获得可执行文件的拥有者权限或者所属组的权限

 

对于目录文件:

SUID对目录时无意义的,而对目录设置了SGID,可以让用户在目录下创建的所有文件拥有者为用户本身,所属组为目录的所属组

 

注意原则上创建目录也应该不可以,因为log目录的所属组是root,权限太大了,可以将log拥有者所属组设置为普通用户测试。

 

sticky 沾着位权限

chmod u+t log 或者  chmod 1xxx log

sticky只对目录有意义:表示在该目录下,只能删除自己创建的文件,其他的文件是没有权限删除的。t权限主要就是为了对没有目录文件的保护,因为如果目录没有t权限,那么只要该用户对目录有读写的权限,那么就可以将该目录下的所有文件都可以删除,不论该目录下的文件是否在自己创建的,还是root'用户创建的。

 这里tel用户就没办法删除/tmp目录下root创建的ifcfg.log文件,因为/tmp设置了t权限,而/home/log目录未设置t权限,所以在log目录下删除了root创建的log2010.log文件

t权限就是为了保护而存在,用户只能删除拥有者是自己的文件,其他的文件却没有权限删除

 

最后,可能有时候文件的权限是rwSrwSrwT,而不是rwsrwsrwt,S与s,T与t的区别就是原本属于x权限位,是否有x执行权限,S表示该位原本没有x执行权限,s表示该位置原本是x执行权限,t表示该位置原本有x执行权限,T则没有。

 

END


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM