1、文件权限和访问模式简介
Linux中每个文件都拥有下面三种权限:
所有者权限(Owner):所有者的权限决定了文件的所有者可以对文件执行什么操作。
组权限(Group):组权限决定了文件所属组中的用户可以对文件执行什么操作。
其他权限(Other):其他用户可以进行的操作。
文件访问模式:
文件的权限是Linux系统安全的第一道防线。Linux权限的基本构建块是读(Read)、写(Write)和执行(Execute)权限,下面将对此进行介绍:
1)Read
授予读取(即查看文件内容)的能力。
2)Write
授予修改或删除文件内容的功能。
3)Execute
具有执行权限的用户可以将文件作为程序运行。
目录访问模式:
1)Read
对目录的访问意味着用户可以读取目录的内容。用户可以查看目录中的文件名。
2)Write
访问意味着用户可以从目录中添加或删除文件。
3)Execute
执行目录实际上没有意义,因此可以将其视为遍历权限。
用户必须对bin目录执行访问才能执行ls或cd命令。
2、查看文件和目录权限
使用ls -l
命令时,与文件权限相关的各种信息显示如下:
$ ls -l /home/levi -rwxr-xr-- 1 levi users 1024 Nov 23 11:13 myfile drwxr-xr-- 1 levi users 1024 Nov 23 12:07 mydir
说明如下图,
文件属性字段总共有10个字母组成;第一个字符代表文件的类型。
如下,
字母"-
"表示该文件是一个普通文件
字母"d
"表示该文件是一个目录,字母"d
",是dirtectory(目录)的缩写
字母"l
"表示该文件是一个链接文件。字母"l
"是link(链接)的缩写,类似于windows下的快捷方式
字母"b
"的表示块设备文件(block),一般置于/dev目录下,设备文件是普通文件和程序访问硬件设备的入口,是很特殊的文件。没有文件大小,只有一个主设备号和一个辅设备号。一次传输数据为一整块的被称为块设备,如硬盘、光盘等。最小数据传输单位为一个数据块(通常一个数据块的大小为512字节)
字母为"c
"表示该文件是一个字符设备文件(character),一般置于/dev
目录下,一次传输一个字节的设备被称为字符设备,如键盘、字符终端等,传输数据的最小单位为一个字节。
字母为"p
"表示该文件为命令管道文件。与shell编程有关的文件。
字母"s
"表示该文件为sock文件。与shell编程有关的文件。
注意:权限被分成三组,组中的每个位置代表一个特定的权限,顺序是:读(r),写(w),执行(x):
前三个字符(2-4)表示文件所有者的权限。例如,-rwxr-xr--
表示所有者具有读(r)、写(w)和执行(x)权限。
第二组由三个字符(5-7)组成,其中包含文件所属组的权限。例如,-rwxr-xr--
表示组有读(r)和执行(x)权限,但没有写权限。
最后一组3个字符(8-10)表示其他用户的权限。例如,-rwxr-xr--
表示有只读(r)权限。
3、修改权限
修改文件或目录权限,使用chmod
(change mode)命令。使用chmod
有两种方式:符号模式和绝对模式。
对于初学者来说,修改文件或目录权限最简单的方法是使用符号模式。使用符号权限,可以使用下表中的操作符添加、删除或指定所需的权限。
chmod操作符 | 描述 |
+ | 向文件或目录添加指定的权限。 |
- | 从文件或目录中移除指定的权限。 |
= | 设置指定的权限。 |
下面是一个使用myfile的示例。在myfile上运行ls -l
将显示该文件的权限如下,
$ ls -l myfile -rwxrwxr-- 1 levi users 1024 Nov 12 10:23 myfile
尝试在myfile上运行上表中的每个示例chmod
命令,然后运行ls -l
,查看权限变化,
如下,
$ chmod o+wx myfile $ ls -l myfile -rwxrwxrwx 1 levi users 1024 Nov 21 09:03 myfile $ chmod u-x myfile $ ls -l myfile -rw-rwxrwx 1 levi users 1024 Nov 21 09:04 myfile $ chmod g = rx myfile $ ls -l myfile -rw-r-xrwx 1 levi users 1024 Nov 21 09:05 myfile
可以在一行中组合这些命令,如下,
$ chmod o+wx,u-x,g = rx myfile $ ls -l myfile -rw-r-xrwx 1 levi users 1024 Nov 21 09:08 myfile
4、使用chmod绝对模式修改权限
使用chmod
命令修改权限的第二种方法是使用一个数字来指定文件的每一组权限。
每个权限都被分配一个值,如下表所示,每个权限集的总和为该集提供一个数字。
八进制权限表示 | 字符串 |
无权限 | --- |
运行权限 | --x |
写权限 | -w- |
执行和写入权限: 1 (execute) + 2 (write) = 3 | -wx |
读权限 | r-- |
读和执行权限: 4 (read) + 1 (execute) = 5 | r-x |
读写权限: 4 (read) + 2 (write) = 6 | rw- |
所有权限: 4 (read) + 2 (write) + 1 (execute) = 7 | rwx |
在myfile上运行ls -l
将显示该文件的权限如下,
$ ls -l myfile -rwxrwxr-- 1 levi users 1024 Nov 9 11:12 myfile
尝试在myfile上运行上表中的每个示例chmod
命令,然后运行ls -l
,查看权限变化,
如下,
$ chmod 755 myfile $ ls -l myfile -rwxr-xr-x 1 levi users 1024 Nov 9 11:12 myfile $ chmod 743 myfile $ ls -l myfile -rwxr---wx 1 levi users 1024 Nov 9 11:12 myfile $ chmod 043 myfile $ ls -l myfile ----r---wx 1 levi users 1024 Nov 9 11:12 myfile
5、修改属主和属组
在Linux上创建帐户时,它为每个用户分配所有者ID和组ID。上面提到的所有权限也是基于所有者和组分配的。两个命令可用来更改文件的所有者和文件属组,
如下,
chown:chown
命令代表“change owner”,用于修改文件的所有者。
chgrp:chgrp
命令是“change group”的缩写,用于修改文件所属的组。
1)修改所有者权限(属主)
chown命令用来更改文件的所有权。基本语法如下,
chown user filelist
用户的值可以是系统中用户的名称,也可以是用户的uid。
例如,
chown levi myfile
将给定文件的所有者更改为用户levi。
注意:超级用户root可以不受限制地修改任何文件的属主,普通用户只能修改自己拥有的文件的属主。
2)修改所属组的权限(属组)
chgrp
命令改变文件的组所有权。基本语法如下所示,
chgrp group filelist
group可以是系统中的组名,也可以是组的GID (group ID)。
例如,
chgrp admin myfile
将给定文件的组更改为admin组。
6、SUID和SGID文件权限
通常在执行命令时,必须以特殊权限执行它才能完成任务。
例如,使用passwd
命令修改密码时,新密码保存在“/etc/shadow
”文件中。
作为普通用户,出于安全考虑,没有对该文件的读写权限,但在修改密码时,需要对该文件具有写权限。这意味着passwd
程序必须给额外的权限,以便您可以写入/etc/shadow
文件。
1)SUID
任何用户执行设置有该权限的文件后,不再以用户自己的身份作为进程的属主,而是以该执行文件的属主作为进程的属主。这种权限的实质就是让执行该文件的用户,在进程运行过程中被授予文件属主的身份。
2)SGID
一般使用中,该权限位设置在目录文件上。具有sgid的目录,用户在此目录下创建文件时,新建文件的属组不再是用户所属的基本组,而是目录的属组。
3)sticky(粘滞位)
一般使用中,该权限位也设置在目录文件上。对于具有sticky粘滞位的目录,如果一个普通用户对该目录有写权限,则该用户可以在该目录下创建、删除文件属主是自己的文件,不能删除文件属主不是自己的文件。显然,这就是设置了sticky粘滞位后的效果。否则,该用户是可以删除目录任意文件的。
sticky(粘滞位)权限便是针对此种情况设置,当目录被设置了粘滞位权限以后,即便用户对该目录有写入权限,也不能删除该目录中其他用户的文件数据,而是只有该文件的所有者和root用户才有权将其删除。设置了粘滞位之后,正好可以保持一种动态的平衡:允许各用户在目录中任意写入、删除数据,但是禁止随意删除其他用户的数据。
例如,
$ ls -l /usr/bin/passwd -r-sr-xr-x 1 root bin 19031 Feb 17 12:17 /usr/bin/passwd* $
如果在目录上启用了sticky位,则只有以下用户才能删除文件:
- sticky目录的所有者
- 被删除文件的所有者
- 超级用户,root
要为任何目录设置SUID和SGID位,可以使用命令如下,
$ chmod ug+s dirname $ ls -l drwsr-sr-x 2 root root 4096 Jun 19 01:35 dirname $
注意:对于SUID和SGID,若对应的x
位具有执行权限,则显示为小写的’s
’;若对应的x
位不具有执行权限,则显示为大写的’S
’。对于sticky,若对应的x
位具有执行权限,则显示为小写的’t
’;若对应的x位不具有执行权限,则显示为大写的’T
’。实际应用中,粘滞位一般用于/tmp
目录,以防止普通用户删除或移动其他用户的文件。粘滞位权限只能针对目录设置,对于文件无效。