Linux 文件的权限
Linux文件权限简介
Linux 文件或目录的属性主要包括:文件或目录的节点、种类、权限模式、链接数量、所归属的用户和用户组、最近访问或修改的时间等内容。具体情况如下:
# ls -lhi
总用量 21M
267246 drwxr-xr-x. 3 root root 4.0K 3月 12 18:12 aaa
267243 drwxr-xr-x. 2 root root 4.0K 3月 12 17:05 abc
267245 lrwxrwxrwx. 1 root root 13 3月 12 15:43 bbb -> /tmp/test/abc
267259 drwxr-xr-x. 2 root root 21M 3月 12 18:04 ddd
在上面的第二列文件属性drwxr-xr-x
中第一个是说明文件的类型,关于Linux的文件类型这里不做过多介绍。下面就关于文件类型之后的rwxr-xr-x
这九个字符的意义以及在Linux 系统中如何进行设置和使用。
文件权限说明
在文件权限的九个字符的意义如下:
-
左三位:定义user(owner)的权限
-
中三位:定义group的权限;
-
右三位:定义other的权限
关于这九个的文件权限中rwx
的意义如下:
-
r:readable, 读
-
w:writable, 写
-
x:excutable,执行
在文件中rwx
的意义:
-
r:可获取文件的数据;
-
w: 可修改文件的数据;
-
x:可将此文件运行为进程;
在目录中rwx
的意义:
-
r:可使用ls命令获取其下的所有文件列表;
-
w: 可修改此目录下的文件列表;即创建或删除文件;
-
x: 可cd至此目录中,且可使用ls -l来获取所有文件的详细属性信息;
权限组合机制
默认显示文件权限 | 二进制显示 | 八进制显示 |
---|---|---|
--- | 000 | 0 |
--x | 001 | 1 |
-w- | 010 | 2 |
-wx | 011 | 3 |
r-- | 100 | 4 |
r-x | 101 | 5 |
rw- | 110 | 6 |
rwx | 111 | 7 |
Linux 文件权限命令
chmod
chmod命令用于改变linux系统文件或目录的访问权限。用它控制文件或目录的访问权限。该命令有两种用法。一种是包含字母和操作符表达式的文字设定法;另一种是包含数字的数字设定法。Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作。
命令格式
chmod [OPTION]... MODE[,MODE]... FILE...
chmod [OPTION]... OCTAL-MODE FILE...
chmod [OPTION]... --reference=RFILE FILE...
命令参数
-
-c 当发生改变时,报告处理信息
-
-f 错误信息不输出
-
-R 处理指定目录以及其子目录下的所有文件
-
-v 运行时显示详细处理信息
选择参数
-
--reference=<目录或者文件> 设置成具有指定目录或者文件具有相同的权限
-
--version 显示版本信息
-
<权限范围>+<权限设置> 使权限范围内的目录或者文件具有指定的权限
-
<权限范围>-<权限设置> 删除权限范围的目录或者文件的指定权限
-
<权限范围>=<权限设置> 设置权限范围内的目录或者文件的权限为指定的值
权限范围:
-
u :目录或者文件的当前的用户
-
g :目录或者文件的当前的群组
-
o :除了目录或者文件的当前用户或群组之外的用户或者群组
-
a :所有的用户及群组
权限代号
-
r :读权限,用数字4表示
-
w :写权限,用数字2表示
-
x :执行权限,用数字1表示
-
- :删除权限,用数字0表示
-
s :特殊权限
命令使用
命令有两种用法,一种是包含字母和操作符表达式的文字设定法;另一种是包含数字的数字设定法。
文字设定法
chmod [who] [+ | - | =] [mode] 文件名
数字设定法
我们必须首先了解用数字表示的属性的含义:0表示没有权限,1表示可执行权限,2表示可写权限,4表示可读权限,然后将其相加。所以数字属性的格式应为3个从0到7的八进制数,其顺序是(u)(g)(o)。例如,如果想让某个文件的属主有“读/写”二种权限,需要把4(可读)+2(可写)=6(读/写)。
数字设定法的一般形式为:
chmod [mode] 文件名
数字与字符对应关系如下:
r=4,w=2,x=1
若要rwx属性则4+2+1=7
若要rw-属性则4+2=6;
若要r-x属性则4+1=7。
chown
chown将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户ID;组可以是组名或者组ID;文件是以空格分开的要改变权限的文件列表,支持通配符。系统管理员经常使用chown命令,在将文件拷贝到另一个用户的名录下之后,让用户拥有使用该文件的权限。通过chown改变文件的拥有者和群组。在更改文件的所有者或所属群组时,可以使用用户名称和用户识别码设置。普通用户不能将自己的文件改变成其他的拥有者。其操作权限一般为管理员。
命令格式
chown [选项]... [所有者][:[组]] 文件...
命令参数
-
-c 显示更改的部分的信息
-
-f 忽略错误信息
-
-h 修复符号链接
-
-R 处理指定目录以及其子目录下的所有文件
-
-v 显示详细的处理信息
-
-deference 作用于符号链接的指向,而不是链接文件本身
-
--reference=<目录或文件> 把指定的目录/文件作为参考,把操作的文件/目录设置成参考文件/目录相同拥有者和群组
-
--from=<当前用户:当前群组> 只有当前用户和群组跟指定的用户和群组相同时才进行改变
思考题:
用户对目录有写权限,但对目录下的文件没有写权限时,能否修改此文件内容?能否删除此文件?
不能修改文件中的内容,但是可以删除和复制文件。
umask
umask是用来设置文件的权限反向掩码,遮罩码。在文件的设置为666-umask
,在目录中的设置为777-umask
。之所以文件用666去减,表示文件默认不能拥有执行权限;如果减得的结果中有执行权限,则需要将其加1;当umask = 023
,则文件的属性为666-023=644
,目录的属性为777-023=754
。
SUID、SGID、SBIT权限说明
前面我们学习了Linux的文件常用权限可写(w)、可读(r)、可执行(x)、同时通过chmod命令可以管理文件的权限,而在日常的操作中还有三种权限及SUID、SGID、sticky-bit,而这三种权限也是通过chmod命令来进行管理。下面就对这三种权限进行介绍。
SUID
当s出现在文件拥有者的x权限位置上时,如我们上面看到的/usr/bin/passwd这个文件的权限时-rwsr-xr-x,此时就被称为SET UID简称SUID。SUID对于一个文件有什么限制和功能呢?
-
SUID权限仅对二进制可执行文件有效
-
执行者对于该文件具有x的权限
-
本权限仅在执行该文件的过程中有效
-
执行者将具有该文件拥有者的权限
说明:例如普通用户用passwd修改自己的命令,实际上最终更改的是/etc/passwd文件。此文件时用户管理配置文件,只有root权限才能更改。
SGID
当s出现在目录或文件所属组的x权限位置上时,此时就称为SET GID简称SGID,那SGID对文件和目录分部有哪些功能呢?
SGID对目录:
-
使用者若对于此目录具有 r 与 x 的权限时,该使用者能够进入此目录
-
使用者在此目录下的群组将会变成该目录的群组
-
若使用者在此目录下具有 w 的权限(可以新建文件),则使用者所创建的新文件,该新文件的群组与此目录的群组相同
SGID对文件:
-
SGID 对二进制可执行文件有效
-
程式执行者对于该文件来说,需具备 x 的权限
-
执行者在执行的过程中将会获得该文件群组的支援(用于改文件群组的权限)
SBIT
当t出现在目录其他用户的x权限位置上时,此时就称为Sticky Bit简称SBIT,那SBIT有哪些限制和作用呢?
-
仅对目录有效,对文件无效
-
当使用者在该目录下建立文件或目录时(有权限的情况下),仅自己与 root 才有权力删除新建的目录或文件
设置SUID、SBID、SBIT属性
操作这些标志与操作文件权限的命令是一样的,都是 chmod。有两种方法来操作:
符号类型改变权限
-
chmod u+s testbin-- 为testbin文件加上setuid标志.
-
chmod g+s testdir-- 为testdir目录加上setgid标志
-
chmod o+t testdir-- 为testdir目录加上sticky标志
数字类型改变档案权限
采用八进制方式. 对一般文件通过三组八进制数字来置标志, 如 666, 777, 644等. 如果设置这些特殊标志, 则在这组数字之外外加一组八进制数字. 如 4666, 2777等. 这一组八进制数字三位的意义如下:
abc
-
a - setuid位, 如果该位为1, 则表示设置setuid 4---
-
b - setgid位, 如果该位为1, 则表示设置setgid 2---
-
c - sticky位, 如果该位为1, 则表示设置sticky 1---
设置完这些标志后, 可以用 ls -l 来查看. 如果有这些标志, 则会在原来的执行标志位置上显示. 如:
-
rwsrw-r-- 表示有setuid标志
-
rwxrwsrw- 表示有setgid标志
-
rwxrw-rwt 表示有sticky标志
那么原来的执行标志x到哪里去了呢? 系统是这样规定的, 如果本来在该位上有x, 则这些特殊标志显示为小写字母 (s, s, t). 否则, 显示为大写字母 (S, S, T)
lsattr、chattr
有时候你发现用root权限都不能修改某个文件,大部分原因是曾经用chattr命令锁定该文件了。chattr命令的作用很大,其中一些功能是由Linux内核版本来支持的,不过现在生产绝大部分跑的linux系统都是2.6以上内核了。通过chattr命令修改属性能够提高系统的安全性,但是它并不适合所有的目录。chattr命令不能保护/、/dev、/tmp、/var目录。lsattr命令是显示chattr命令设置的文件属性。如果要查看被chattr改变的文件属性,需用lsattr命令。
这项指令可改变存放在ext2文件系统上的文件或目录属性,这些属性共有以下模式:
-
A:文件或目录的 atime (access time)不可被修改(modified), 可以有效预防例如手提电脑磁盘I/O错误的发生。
-
a:即append,设定该参数后,只能向文件中添加数据,而不能删除,多用于服务器日志文件安全,只有root才能设定这个属性。
-
c:即compresse,设定文件是否经压缩后再存储。读取时需要经过自动解压操作。
-
d:即no dump,设定文件不能成为dump程序的备份目标。
-
i:设定文件不能被删除、改名、设定链接关系,同时不能写入或新增内容。i参数对于文件系统的安全设置有很大帮助。
-
j:即journal,设定此参数使得当通过mount参数:data=ordered 或者 data=writeback 挂 载的文件系统,文件在写入时会先被记录(在journal中)。如果filesystem被设定参数为 data=journal,则该参数自动失效。
-
S:硬盘I/O同步选项,功能类似sync。
-
s:保密性地删除文件或目录,即硬盘空间被全部收回。
-
u:与s相反,当设定为u时,数据内容其实还存在磁盘中,可以用于undeletion。
chattr命令参数说明
-
-R 递归处理,将指定目录下的所有文件及子目录一并处理。
-
-v<版本编号> 设置文件或目录版本。
-
-V 显示指令执行过程。
-
+<属性> 开启文件或目录的该项属性。
-
-<属性> 关闭文件或目录的该项属性。
-
=<属性> 指定文件或目录的该项属性。
‘’
lsattr命令参数
-
-a 显示所有文件和目录,包括以"."为名称开头字符的额外内建,现行目录"."与上层目录".."。
-
-d 显示,目录名称,而非其内容。
-
-l 此参数目前没有任何作用。
-
-R 递归处理,将指定目录下的所有文件及子目录一并处理。
-
-v 显示文件或目录版本。
-
-V 显示版本信息。
文件ACL权限设置
ACL即Access Control List 主要的目的是提供传统的owner,group,others的read,write,execute权限之外的具体权限设置,ACL可以针对单一用户、单一文件或目录来进行r,w,x的权限控制,对于需要特殊权限的使用状况有一定帮助。如,某一个文件,不让单一的某个用户访问。
控制命令:
-
getfacl:取得某个文件/目录的ACL设置项目
-
setfacl:设置某个文件/目录的ACL设置项目
setfacl 参数
-
-m:设置后续acl参数
-
-x:删除后续acl参数
-
-b:删除全部的acl参数
-
-k:删除默认的acl参数
-
-R:递归设置acl,包括子目录
-
-d:设置默认acl
使用举例:
在linux系统中我们在用普通用户(cangls)编辑文本文件时,可能要编辑别的普通用户(bols)的文件,通常情况下我们会想到下面两个解决方法:1、用root用户把普通用户(cangls)添加到要编辑文件的所属组(bols)中,然后可以更加属组的写权限就可以编辑文件。2、若我们不想用root用户更改权限则可以让被编辑文件所属主(bols)在文本的other权限中添加写权限。上面的两个解决方法虽然都能可以解决问题但是root权限在生产服务器上一般不会随便登录的,而第二种虽然能解决问题但由于其他用户也有写权限,若被有心人利用就得不偿失了,今天就向大家介绍个能同时避免上面两个问题的解决方法即使用setfacl命令。
使用setfacl命令赋予的属主的权限进行更改文件:
[bols@hpf-linux test]$ getfacl bols.txt
# file: bols.txt
# owner: bols
# group: bols
user::rw-
group::rw-
other::r--
[bols@hpf-linux test]$ setfacl -m u:cangls:rw- /tmp/test/bols.txt
Try `getfacl --help' for more information.
[bols@hpf-linux test]$ getfacl bols.txt
# file: bols.txt
# owner: bols
# group: bols
user::rw-
user:cangls:rw-
group::rw-
mask::rw-
other::r--
[bols@hpf-linux test]$ ls -l bols.txt
-rw-rw-r--+ 1 bols bols 12 7月 9 08:33 bols.txt
[cangls@hpf-linux test]$ echo "cangls" > bols.txt
[cangls@hpf-linux test]$ cat bols.txt
cangls
[bols@hpf-linux test]$ setfacl -x u:cangls bols.txt //取消权限
[bols@hpf-linux test]$ getfacl bols.txt
# file: bols.txt
# owner: bols
# group: bols
user::rw-
group::rw-
mask::rw-
other::r--
[cangls@hpf-linux test]$ echo "bols" > bols.txt
-bash: bols.txt: 权限不够
使用setfacl命令赋予的属组的权限进行更改文件:
[bols@hpf-linux test]$ setfacl -m g:cangls:rwx bols.txt
[bols@hpf-linux test]$ getfacl bols.txt
# file: bols.txt
# owner: bols
# group: bols
user::rw-
group::rw-
group:cangls:rwx
mask::rwx
other::r--
[bols@hpf-linux test]$ ls -l bols.txt
-rw-rwxr--+ 1 bols bols 12 7月 9 08:33 bols.txt
[cangls@hpf-linux test]$ echo "bols" >> bols.txt
[cangls@hpf-linux test]$ cat bols.txt
cangls
bols
[bols@hpf-linux test]$ setfacl -x g:cangls bols.txt
[bols@hpf-linux test]$ getfacl bols.txt
# file: bols.txt
# owner: bols
# group: bols
user::rw-
group::rw-
mask::rw-
other::r--
[cangls@hpf-linux test]$ echo "bols" > bols.txt
-bash: bols.txt: 权限不够
-R递归目录用法举例:
[bols@hpf-linux tmp]$ setfacl -R -m u:cangls:rwx /tmp/test/
[bols@hpf-linux tmp]$ getfacl /tmp/test/bols.txt
getfacl: Removing leading '/' from absolute path names
# file: tmp/test/bols.txt
# owner: bols
# group: bols
user::rw-
user:cangls:rwx
group::rw-
mask::rwx
other::r--
[bols@hpf-linux tmp]$ getfacl /tmp/test/
getfacl: Removing leading '/' from absolute path names
# file: tmp/test/
# owner: bols
# group: bols
user::rwx
user:cangls:rwx
group::rwx
mask::rwx
other::r-x
[bols@hpf-linux tmp]$ ls -ld test/
drwxrwxr-x+ 2 bols bols 4096 7月 9 08:00 test/
[cangls@hpf-linux test]$ echo "cangls" >> bols.txt
[cangls@hpf-linux test]$ cat bols.txt
cangls
bols
cangls