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

Linux权限管理.md的更多相关文章

  1. Linux系列教程(十六)——Linux权限管理之ACL权限

    通过前面的两篇博客我们介绍了Linux系统的用户管理,Linux用户和用户组管理之相关配置文件 讲解了用户管理的相关配置文件,包括用户信息文件/etc/passwd,用户密码文件/etc/shadow ...

  2. 【Linux】 Linux权限管理与特殊权限

    Linux权限管理 权限管理这方面,非常清楚地记得刚开始实习那会儿是仔细研究过的,不知道为什么没有笔记留痕..除了一些基本的知识点早就忘光了,无奈只好从头开始学习一遍.. ■ 基本权限知识 这部分实在 ...

  3. Linux基础知识之用户和用户组以及 Linux 权限管理

    已经开始接触Linux用户管理,用户组管理,以及权限管理这几个逼格满满的关键字.这几个关键字对于前端程序猿的我来说真的是很高大上有木有,以前尝试学 Linux 的时候看到这些名词总是下意识的跳过不敢看 ...

  4. Linux权限管理之ACL权限

    注:转载自:https://www.cnblogs.com/ysocean/p/7801329.html 目录 1.什么是 ACL 权限? 2.查看分区 ACL 权限是否开启:dump2fs ①.查看 ...

  5. [Linux 003]——用户和用户组以及 Linux 权限管理(一)

    嗬!没想到吧!学习 Linux 的第三天,我们已经开始接触用户管理,用户组管理,以及权限管理这几个逼格满满的关键字.这几个关键字对于前端程序猿的我来说真的是很高大上有木有,以前尝试学 Linux 的时 ...

  6. 用户和用户组以及 Linux 权限管理

    1.从 /etc/passwd 说起 前面的基本命令学习中,我们介绍了使用 passwd 命令可以修改用户密码.对于操作系统来说,用户名和密码是存放在哪里的呢?我们都知道一个站点的用户名和密码是存放在 ...

  7. Linux权限管理(用户、组、文件管理)

    一. Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示. 1. 文件查看类命令cat,tac, head, tail, more, less, ls ,file: -ls : l ...

  8. linux权限管理-特殊权限

    目录 linux权限管理-特殊权限 一,特殊权限 Linux权限属性chattr概述 linux进程掩码umask linux权限管理-特殊权限 一,特殊权限 1.suid(4000) SetUID( ...

  9. linux权限管理-基本权限

    目录 linux权限管理-基本权限 权限修改命令chmod linux权限管理-基本权限 权限 针对某些文件和进程,对用户进行限制 权限与用户的关系 rwx rwx r-x User Group Ot ...

随机推荐

  1. C#综合揭秘——通过修改注册表建立Windows自定义协议

    引言 本文主要介绍注册表的概念与其相关根项的功能,以及浏览器如何通过连接调用自定义协议并与客户端进行数据通信.文中讲及如何通过C#程序.手动修改.安装项目等不同方式对注册表进行修改.其中通过安装项目对 ...

  2. SAP中需要记住的一些标准表

    E070 请求号的抬头表 E071 请求号的行项目表 E07T 请求号的文本 E71K TASK的抬头(子请求) ******************************************* ...

  3. 关于arcgis engine的注记显示与关闭问题

    1.注记的添加需要拿到IGeoFeatureLayer接口下的AnnotationProperties属性,转为IAnnotationLayerPropertiesCollection接口,并创建一个 ...

  4. JAVA静态代理模式(从现实生活角度理解代码原理)

    代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问. 代理模式说白了就是"真实对象"的代表,在访问对象时引入一定程度的间接性,因为这种间接性可以附加多种用途. 在 ...

  5. UIBezierPath-绘制基本图形

    步骤1:确定路径 步骤2:渲染 override func draw(_ rect: CGRect) { let path:UIBezierPath // 矩形 // path = UIBezierP ...

  6. iOS之深拷贝与浅拷贝

    在最开始,我们需要清楚一些关于内存分配方式的基础知识. 一般来说分为栈.堆.静态变量存储区.全局变量存储区.代码区. 前两个大家都懂的.通常将后三个合并称之为静态存储区,存储的是一些全局变量.静态变量 ...

  7. iOS JsonModel 的使用

    本文转自:http://blog.csdn.net/smking/article/details/40432287 下面讲一下JSONModel的使用方法. @inteface MyModel : J ...

  8. [C#6] 5-自动属性增强

    0. 目录 C#6 新增特性目录 1. 老版本代码 internal class Person { public string Name { get; private set; } public in ...

  9. Linq专题之提高编码效率—— 第三篇 你需要知道的枚举类

     众所周知,如果一个类可以被枚举,那么这个类必须要实现IEnumerable接口,而恰恰我们所有的linq都是一个继承自IEnumerable接口的匿名类, 那么问题就来了,IEnumerable使了 ...

  10. PHP无限级分类的实现(不使用递归)

    无限级分类在开发中经常使用,例如:部门结构.文章分类.无限级分类的难点在于“输出”和“查询”,例如 将文章分类输出为<ul>列表形式: 查找分类A下面所有分类包含的文章. 1.实现原理 在 ...