Linux权限详解(chmod、600、644、666、700、711、755、777、4755、6755、7755)

来源:互联网 发布:sqlserver 去掉重复行 编辑:程序博客网 时间:2024/06/05 09:40
权限简介
Linux系统上对文件的权限有着严格的控制,用于如果相对某个文件执行某种操作,必须具有对应的权限方可执行成功。
Linux下文件的权限类型一般包括读,写,执行。对应字母为 r、w、x。
Linux下权限的粒度有 拥有者 、群组 、其它组 三种。每个文件都可以针对三个粒度,设置不同的rwx(读写执行)权限。通常情况下,一个文件只能归属于一个用户和组, 如果其它的用户想有这个文件的权限,则可以将该用户加入具备权限的群组,一个用户可以同时归属于多个组。
Linux上通常使用chmod命令对文件的权限进行设置和更改。

快速入门

chmod命令
一般使用格式:
chmod [可选项] mode file...

可选项:
-c, --changes like verbose but report only when a change is made (若该档案权限确实已经更改,才显示其更改动作)
-f, --silent, --quiet suppress most error messages (若该档案权限无法被更改也不要显示错误讯息)
-v, --verbose output a diagnostic for every file processed(显示权限变更的详细资料)
--no-preserve-root do not treat '/' specially (the default)
--preserve-root fail to operate recursively on '/'
--reference=RFILE use RFILE's mode instead of MODE values
-R, --recursive change files and directories recursively (以递归的方式对目前目录下的所有档案与子目录进行相同的权限变更)
--help 显示此帮助信息
--version 显示版本信息

mode :
权限设定字串,详细格式如下 :
[ugoa...][[+-=][rwxX]...][,...],

其中
[ugoa...]
u 表示该档案的拥有者,g 表示与该档案的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示所有(包含上面三者)。
[+-=]
+ 表示增加权限,- 表示取消权限,= 表示唯一设定权限。
[rwxX]
r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该档案是个子目录或者该档案已经被设定过为可执行。
 
file...
文件列表(单个或者多个文件、文件夹)

 
范例:
设置所有用户可读取文件 a.conf
chmod ugo+r a.sh 或 chmod a+r a.conf

设置 c.sh 只有 拥有者可以读写及执行
chmod u+rwx c.sh 

设置文件 a.conf 与 b.xml 权限为拥有者与其所属同一个群组 可读写,其它组可读不可写
chmod a+r,ug+w,o-w a.conf b.xml

设置当前目录下的所有档案与子目录皆设为任何人可读写
  chmod -R a+rw *
 
用8进制数字控制权限
chmod 设置权限拥有另外一种方式--使用八进制数字进行设置,语法格式为 :
chmod abc file...
其中
a,b,c各为一个数字,分别代表User、Group、及Other的权限。
相当于简化版的
chmod u=权限,g=权限,o=权限 file...
而此处的权限用8进制的数字来表示
单个读、写、执行权限,分别用 r=4,w=2,x=1 表示
其它组合权限则为:
rwx = 4 + 2 + 1 = 7
rw- = 4 + 2 = 6
r-x = 4 +1 = 5

若要同时设置 rwx (可读写运行) 权限则将该权限位 设置 为 4 + 2 + 1 = 7
若要同时设置 rw- (可读写不可运行)权限则将该权限位 设置 为 4 + 2 = 6
若要同时设置 r-x (可读可运行不可写)权限则将该权限位 设置 为 4 +1 = 5

范例:
设置所有人可以读写及执行
chmod 777 file (等价于 chmod u=rwx,g=rwx,o=rwx file 或 chmod a=rwx file)

设置拥有者可读写,其他人不可读写执行
chmod 600 file (等价于 chmod u=rw,g=---,o=--- file 或 chmod u=rw,go-rwx file )

更改文件拥有者  
linux/Unix 是多人多工作业系统,每个的文件都有拥有者(所有者),如果我们想变更文件的拥有者(利用 chown 将文件拥有者加以改变),一般只有系统管理员(root)拥有此操作权限,而普通用户则没有权限将自己或者别人的文件的拥有者设置为别人。

语法格式:
chown [可选项] user[:group] file...
使用权限:root

说明:
[可选项] : 同上文
user : 新的文件拥有者的使用者
group : 新的文件拥有者的使用者群体(group)

 
  范例:
  设置文件 d.key、e.scrt的拥有者设为 users 群体的 tom
chown tom:users file d.key e.scrt
 
  设置当前目录下与子目录下的所有文件的拥有者为 users 群体的James 
chown -R James:users *
 
Linux权限详解

Linux系统上对文件的权限有着严格的控制,用于如果相对某个文件执行某种操作,必须具有对应的权限方可执行成功。这也是Linux有别于Windows的机制,也是基于这个权限机智,Linux可以有效防止病毒自我运行,因为运行的条件是必须要有运行的权限,而这个权限在Linux是用户所赋予的。
Linux下文件的权限类型一般包括读,写,执行。对应字母为 r、w、x。
Linux下权限的属组有 拥有者 、群组 、其它组 三种。每个文件都可以针对三个粒度,设置不同的rwx(读写执行)权限。通常情况下,一个文件只能归属于一个用户和组, 如果其它的用户想有这个文件的权限,则可以将该用户加入具备权限的群组,一个用户可以同时归属于多个组。

Linux下表示权限有两种方式:
第一种是十位二进制表示法,(三个属组每个使用二进制位,再加一个最高位共十位),可简化为三位八进制形式
另外一种十二位二进制表示法(十二个二进制位),可简化为三位八进制形式

十位字符权限表示形式

常见的权限表示形式有:
-rw------- (600) 只有拥有者有读写权限。
-rw-r--r-- (644) 只有拥有者有读写权限;而属组用户和其他用户只有读权限。
-rwx------ (700) 只有拥有者有读、写、执行权限。
-rwxr-xr-x (755) 拥有者有读、写、执行权限;而属组用户和其他用户只有读、执行权限。
-rwx--x--x (711) 拥有者有读、写、执行权限;而属组用户和其他用户只有执行权限。
-rw-rw-rw- (666) 所有用户都有文件读、写权限。
-rwxrwxrwx (777) 所有用户都有读、写、执行权限。

后九位解析:
我们知道Linux权限总共有三个属组,这里我们给每个属组使用三个位置来定义三种操作(读、写、执行)权限,合起来则是权限的后九位。
上面我们用字符表示权限,其中
-代表无权限,r代表读权限,w代表写权限,x代表执行权限。

实际上,后九位每个位置的意义(代表某个属组的某个权限)都是固定的,如果我们将各个位置权限的有无用二进制数 1和 0来代替,则只读、只写、只执行权限,可以用三位二进制数表示为
r-- = 100
-w- = 010
--x = 001
--- = 000
转换成八进制数,则为
r=4, w=2, x=1, -=0
(这也就是用数字设置权限时为何是4代表读,2代表写,1代表执行)
实际上,我们可以将所有的权限用二进制形式表现出来,并进一步转变成八进制数字:

rwx = 111 = 7
rw- = 110 = 6
r-x = 101 = 5
r-- = 100 = 4
-wx = 011 = 3
-w- = 010 = 2
--x = 001 = 1
--- = 000 = 0

由上可以得出,所有的权限都可以用一位八进制数表示,每个数字都代表了不同的权限(权值)。如 最高的权限为是7,代表可读,可写,可执行。
故 如果我们将每个属组的权限都用八进制数表示,则文件的权限可以表示为三位八进制数
-rw------- = 600
-rw-rw-rw- = 666
-rwxrwxrwx = 777


关于第一位最高位的解释:
上面我们说到了权限表示中后九位的含义,那么第一位的含义是什么呢? 第一位代表是文件的类型,类型可以是下面几个中的一个:
  • d代表的是目录(directroy)
  • -代表的是文件(regular file)
  • s代表的是套字文件(socket)
  • p代表的管道文件(pipe)或命名管道文件(named pipe)
  • l代表的是符号链接文件(symbolic link)
  • b代表的是该文件是面向块的设备文件(block-oriented device file)
  • c代表的是该文件是面向字符的设备文件(charcter-oriented device file)

关于suid,sgid与sticky:
Linux还有一类设置也是涉及到权限的,就是suid,sgid跟sticky。suid/sgid是为了适应“没有取得特权用户要完成一项必须要有特权才可以执行的任务”才产生的。
suid(set User ID,set UID)的意思是进程执行一个文件时通常保持进程拥有者的UID。然而,如果设置了可执行文件的suid位,进程就获得了该文件拥有者的UID。
sgid(set Group ID,set GID)意思也是一样,只是把上面的进程拥有者改成进程组就好了。

如果一个文件被设置了suid或sgid位,会分别表现在所有者或同组用户的权限的可执行位上;如果文件设置了suid还设置了x(执行)位,则相应的执行位表示为s(小写)。但是,如果没有设置x位,它将表示为S(大写)。如:
1、-rwsr-xr-x 表示suid和所有者权限中可执行位被设置
2、-rwSr--r-- 表示suid被设置,但所有者权限中可执行位没有被设置
3、-rwxr-sr-x 表示sgid和同组用户权限中可执行位被设置
4、-rw-r-Sr-- 表示sgid被设置,但同组用户权限中可执行位没有被设置。

现在介绍sticky:
一般来说,只要对一个目录有写访问权,任何人都可以重命名或删除该目录中的文件。对于个别用户使用的目录,这种行为是很合理的。但是,对于很多用户 使用的目录来说,尤其是 /tmp 和 /var/tmp,这种行为可能会产生麻烦。因为任何人都可以写这些目录,任何人都可以删除或重命名任何其他人的文件,即使是不属于他们的!显然,当任何 其他用户在任何时候都可以输入“rm -rf /tmp/*”并损坏每个人的文件时,很难把 /tmp 用于任何有意义的文件。所幸,Linux 有叫做“粘滞位”(sticky bit)的东西。当给 /tmp 设置了粘滞位(用 chmod +t),唯一能够删除或重命名 /tmp 中文件的是该目录的所有者(通常是 root 用户)、文件的所有者或 root 用户。事实上,所有 Linux 分发包都缺省地启用了 /tmp 的粘滞位,而您还可以发现粘滞位在其它情况下也很管用。

Linux系统附加权限
Linux系统附加权限,指的是SET位权限和粘滞位权限,也就是上面说的suid,sgid和 sticky

SET位权限:
多用于给可执行的程序或脚本文件进行设置,其中SUID表示对属主用户增加SET位权限,SGID表示对属组内用户增加SET位权限。执行文件被设置了SUID、SGID权限后,任何用户执行该文件时,将获得该文件属主、属组账号对应的身份。在许多环境中,suid 和 sgid 很管用,但是不恰当地使用这些位可能使系统的安全遭到破坏。最好尽可能地少使用SET位权限程序。passwd 命令是为数不多的必须使用“suid”的命令之一。
  为执行文件添加SET位权限同样可以通过chmod命令实现,使用u+s、g+s的权限模式分别用于设置SUID、SGID权限。
给文件加suid和sgid的命令如下(类似于上面chmod赋予一般权限的命令):
chmod u+s filename 设置suid位
chmod u-s filename 去掉suid设置
chmod g+s filename 设置sgid位
chmod g-s filename 去掉sgid设置

粘滞位权限:
主要用于为目录设置特殊的附加权限,当目录被设置了粘滞位权限后,即便用户对该目录有写的权限,也不能删除该目录中其他用户的文件数据。设置了粘滞位权限的目录,是用ls查看其属性时,其他用户权限处的x将变为t。
使用chmod命令设置目录权限时,+t、-t权限模式可分别用于添加、移除粘滞位权限。

附加权限的八进制表现形式:
若使用八进制数字形式,在权限模式中可采用“nnnn”的形式,SUID对应八进制数字是4,SGID对于八进制数字是2,如“4755”表示设置SUID权限,“6755”表示同时设置SUID、SGID权限。将数字权限模式nnnn中的第一位数字 改为1、0,也可以实现添加、移除粘滞位权限。

要理解上述四位八进制的权限表示形式,我们首先要了解一下十二位的权限表示方法。
如果我们用SGT分别表示SUID权限、SGID权限、和 粘滞位权限,则权限还可以由进一步用十二位字符(二进制数)的形式表示。
这十二位分别对应关系如下:
11 10 9 8 7 6 5 4 3 2 1 0
S G T r w x r w x r w x
第11位为SUID位,第10位为SGID位,第9位为sticky位,第8-0位对应于上面的三组rwx位(后九位)。

在这十二位的每一位上都置值。如果有相应的权限则为1, 没有此权限则为0。
-rw-r-sr--的值为: 0 1 0 1 1 0 1 0 0 1 0 0
-rwsr-xr-x的值为: 1 0 0 1 1 1 1 0 1 1 0 1
-rwsr-sr-x的值为 :1 1 0 1 1 1 1 0 1 1 0 1
-rwsr-sr-t 的值为: 1 1 1 1 1 1 1 0 1 1 0 1
如果将则前三位SGT也转换成一个二进制数,则
suid 的八进制数字是4
sgid 的代表数字是2
sticky 位代表数字是1

这样我们就可以将十二位权限三位三位的转化为4个八进制数。其中
最高的一位八进制数就是suid,sgdi,sticky的权值。
第二位为 拥有者的权值
第三位为 所属组的权值
最后一位为 其他组的权值

将上面的例子中的二进制数转变为八进制表示形式,则
-rw-r-sr-- = 0 1 0 1 1 0 1 0 0 1 0 0 = 2644
-rwsr-xr-x = 1 0 0 1 1 1 1 0 1 1 0 1= 4755
-rwsr-sr-x = 1 1 0 1 1 1 1 0 1 1 0 1 = 6755
-rwsr-sr-t = 1 1 1 1 1 1 1 0 1 1 0 1 = 7755

范例:
设置 netlogin 的权限为拥有者可读写执行,群组和其他权限为可读可执行
chmod 755 netlogin
设置 netlogin 的权限为拥有者可读写执行,群组和其他权限为可读可执行,并且设置suid
chmod 4755 netlogin

chmod 4755与chmod 755 的区别在于开头多了一位,这个4表示其他用户执行文件时,具有与所有者相当的权限(设置了SUID)。

为什么要设置4755 而不是 755?
假设netlogin是root用户创建的一个上网认证程序,如果其他用户要上网也要用到这个程序,那就需要root用户运行chmod 755 netlogin命令使其他用户也能运行netlogin。但假如netlogin执行时需要访问一些只有root用户才有权访问的文件,那么其他用户执行netlogin时可能因为权限不够还是不能上网。这种情况下,就可以用 chmod 4755 netlogin 设置其他用户在执行netlogin也有root用户的权限,从而顺利上网。