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