知道如何控制用户对文件的访问是一项基本的系统管理技能。
-- Alex Juarez(作者)

了解 Linux 权限以及如何控制哪些用户可以访问文件是系统管理的一项基本技能。

本文将介绍标准 Linux 文件系统权限,并进一步研究特殊权限,以及使用 umask 来解释默认权限作为文章的结束。

理解 ls 命令的输出

在讨论如何修改权限之前,我们需要知道如何查看权限。通过 ls 命令的长列表参数(-l)为我们提供了有关文件的许多信息。

$ ls -lAh
total 20K
-rwxr-xr--+ 1 root root    0 Mar  4 19:39 file1
-rw-rw-rw-. 1 root root    0 Mar  4 19:39 file10
-rwxrwxr--+ 1 root root    0 Mar  4 19:39 file2
-rw-rw-rw-. 1 root root    0 Mar  4 19:39 file8
-rw-rw-rw-. 1 root root    0 Mar  4 19:39 file9
drwxrwxrwx. 2 root root 4.0K Mar  4 20:04 testdir

为了理解这些是什么意思,让我们将关于权限的输出分解为各个部分。单独理解每个部分会更容易。

让我们看看在上面的输出中的最后一行的每个组件:

drwxrwxrwx. 2 root root 4.0K Mar  4 20:04 testdir

第 1 节(左侧)显示文件的类型。

ls 的 info 页面完整列出了不同的文件类型。

每个文件都有三种访问方式:

  • 属主
  • 所有其他人 第 2、3 和 4 节涉及用户(属主)、组和“其他用户”权限。每个部分都可以包含 r(读取)、w(写入)和 x(执行)权限的组合。

每个权限还分配了一个数值,这在以八进制表示形式讨论权限时很重要。

第 5 节描述了其他替代访问方法,例如 SELinux 或文件访问控制列表(FACL)。

第 6 节和第 7 节分别是属主和组的名称。

使用 chown 和 chmod

chown 命令

chown(更改所有权)命令用于更改文件的用户和组的所有权。

要将文件 foo 的用户和组的所有权更改为 root,我们可以使用以下命令:

$ chown root:root foo
$ chown root: foo

在用户名后跟冒号(:)运行该命令将同时设置用户和组所有权。

要仅将文件 foo 的用户所有权设置为 root 用户,请输入:

$ chown root foo

要仅更改文件 foo 的组所有权,请在组之前加冒号:

$ chown :root foo

chmod 命令

chmod(更改模式)命令控制属主、组以及既不是属主也不属于与文件关联的组的所有其他用户的文件许可权。

chmod 命令可以以八进制(例如 755644 等)和符号(例如 u+rwxg-rwxo=rw)格式设置权限。

八进制表示法将 4 个“点”分配给“读取”,将 2 个“点”分配给“写入”,将 1 个点分配给“执行”。如果要给用户(属主)分配“读取”权限,则将 4 分配给第一个插槽,但是如果要添加“写入”权限,则必须添加 2。如果要添加“执行”,则要添加 1。我们对每种权限类型执行此操作:属主、组和其他。

例如,如果我们想将“读取”、“写入”和“执行”分配给文件的属主,但仅将“读取”和“执行”分配给组成员和所有其他用户,则我们应使用 755(八进制格式)。这是属主的所有权限位(4+2+1),但组和其他权限的所有权限位只有 414+1)。

细分为:4+2+1=7,4+1=5 和 4+1=5。

如果我们想将“读取”和“写入”分配给文件的属主,而只将“读取”分配给组的成员和所有其他用户,则可以如下使用 chmod

$ chmod 644 foo_file

在下面的示例中,我们在不同的分组中使用符号表示法。注意字母 ugo 分别代表“用户”(属主)、“组”和“其他”。我们将 ugo+-= 结合使用来添加、删除或设置权限位。

要将“执行”位添加到所有权权限集中:

$ chmod u+x foo_file

要从组成员中删除“读取”、“写入”和“执行”:

$ chmod g-rwx foo_file

要将所有其他用户的所有权设置为“读取”和“写入”:

$ chmod o=rw

特殊位:设置 UID、设置 GID 和粘滞位

除了标准权限外,还有一些特殊的权限位,它们具有一些别的用处。

设置用户 ID(suid)

当在文件上设置 suid 时,将以文件的属主的身份而不是运行该文件的用户身份执行操作。一个好的例子是 passwd 命令。它需要设置 suid 位,以便更改密码的操作具有 root 权限。

$ ls -l /bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /bin/passwd

设置 suid 位的示例:

$ chmod u+s /bin/foo_file_name

设置组 ID(sgid)

sgid 位与 suid 位类似,操作是在目录的组所有权下完成的,而不是以运行命令的用户身份。

一个使用 sgid 的例子是,如果多个用户正在同一个目录中工作,并且目录中创建的每个文件都需要具有相同的组权限。下面的示例创建一个名为 collab_dir 的目录,设置 sgid 位,并将组所有权更改为 webdev

$ mkdir collab_dir
$ chmod g+s collab_dir
$ chown :webdev collab_dir

现在,在该目录中创建的任何文件都将具有 webdev 的组所有权,而不是创建该文件的用户的组。

$ cd collab_dir
$ touch file-sgid
$ ls -lah file-sgid
-rw-r--r--. 1 root webdev 0 Jun 12 06:04 file-sgid

“粘滞”位

粘滞位表示,只有文件所有者才能删除该文件,即使组权限允许该文件可以删除。通常,在 /tmp 这样的通用或协作目录上,此设置最有意义。在下面的示例中,“所有其他人”权限集的“执行”列中的 t 表示已应用粘滞位。

$ ls -ld /tmp
drwxrwxrwt. 8 root root 4096 Jun 12 06:07 /tmp/

请记住,这不会阻止某个人编辑该文件,它只是阻止他们删除该目录的内容(LCTT 译注:即删除目录下文件)。

我们将粘滞位设置为:

$ chmod o+t foo_dir

你可以自己尝试在目录上设置粘滞位并赋予其完整的组权限,以便多个属于同一组的用户可以在目录上进行读取、写入和执行。

接着,以每个用户的身份创建文件,然后尝试以另一个用户的身份删除它们。

如果一切配置正确,则一个用户应该不能从另一用户那里删除文件。

请注意,这些位中的每个位也可以用八进制格式设置:SUID = 4、SGID = 2 和 粘滞位 = 1。(LCTT 译注:这里是四位八进制数字)

$ chmod 4744
$ chmod 2644
$ chmod 1755

大写还是小写?

如果要设置特殊位时看到大写的 ST 而不是小写的字符(如我们之前所见),那是因为不存在(对应的)底层的执行位。为了说明这一点,下面的示例创建一个设置了粘滞位的文件。然后,我们可以添加和删除执行位以演示大小写更改。

$ touch file cap-ST-demo
$ chmod 1755 cap-ST-demo
$ ls -l cap-ST-demo
-rwxr-xr-t. 1 root root 0 Jun 12 06:16 cap-ST-demo$ chmod o-x cap-X-demo
$ ls -l cap-X-demo
-rwxr-xr-T. 1 root root 0 Jun 12 06:16 cap-ST-demo

有条件地设置执行位

至此,我们使用小写的 x 设置了执行位,而无需询问任何问题即可对其进行设置。我们还有另一种选择:使用大写的 X 而不是小写的,它将仅在权限组中某个位置已经有执行位时才设置执行位。这可能是一个很难解释的概念,但是下面的演示将帮助说明它。请注意,在尝试将执行位添加到组特权之后,该位没有被设置上。

$ touch cap-X-file
$ ls -l cap-X-file
-rw-r--r--. 1 root root 0 Jun 12 06:31 cap-X-file
$ chmod g+X cap-X-file
$ ls -l cap-X-file
-rw-r--r--. 1 root root 0 Jun 12 06:31 cap-X-file

在这个类似的例子中,我们首先使用小写的 x 将执行位添加到组权限,然后使用大写的 X 为所有其他用户添加权限。这次,大写的 X设置了该权限。

$ touch cap-X-file
$ ls -l cap-X-file
-rw-r--r--. 1 root root 0 Jun 12 06:31 cap-X-file
$ chmod g+x cap-X-file
$ ls -l cap-X-file
-rw-r-xr--. 1 root root 0 Jun 12 06:31 cap-X-file
$ chmod o+X cap-X-file
ls -l cap-X-file
-rw-r-xr-x. 1 root root 0 Jun 12 06:31 cap-X-file

理解 umask

umask 会屏蔽(或“阻止”)默认权限集中的位,以定义文件或目录的权限。例如,umask输出中的 2 表示它至少在默认情况下阻止了文件的“写入”位。

使用不带任何参数的 umask 命令可以使我们看到当前的 umask 设置。共有四列:第一列为特殊的suidsgid 或粘滞位而保留,其余三列代表属主、组和其他人的权限。

$ umask
0022

为了理解这意味着什么,我们可以用 -S 标志来执行 umask(如下所示)以解释屏蔽位的结果。例如,由于第三列中的值为 2,因此将“写入”位从组和其他部分中屏蔽掉了;只能为它们分配“读取”和“执行”。

$ umask -S
u=rwx,g=rx,o=rx

要查看文件和目录的默认权限集是什么,让我们将 umask 设置为全零。这意味着我们在创建文件时不会掩盖任何位。

$ umask 000
$ umask -S
u=rwx,g=rwx,o=rwx$ touch file-umask-000
$ ls -l file-umask-000
-rw-rw-rw-. 1 root root 0 Jul 17 22:03 file-umask-000

现在,当我们创建文件时,我们看到所有部分的默认权限分别为“读取”(4)和“写入”(2),相当于八进制表示 666

我们可以对目录执行相同的操作,并看到其默认权限为 777。我们需要在目录上使用“执行”位,以便可以遍历它们。

$ mkdir dir-umask-000
$ ls -ld dir-umask-000
drwxrwxrwx. 2 root root 4096 Jul 17 22:03 dir-umask-000/

总结

管理员还有许多其他方法可以控制对系统文件的访问。这些权限是 Linux 的基本权限,我们可以在这些基础上进行构建。如果你的工作为你引入了 FACL 或 SELinux,你会发现它们也建立在这些文件访问的首要规则之上。


写入访问权限冲突_全面介绍 Linux 权限相关推荐

  1. c++ 非空指针 写入访问权限冲突_初识C语言指针

    一切皆为地址 C语言用变量来存储数据,用函数来定义一段功能代码,它们最终都要放到内存中供 CPU 调用. 数据和代码都以二进制的形式存储在内存中,计算机无法从格式上区分某块内存存储的是数据还是代码.当 ...

  2. c++ 读取访问权限冲突_关于Windows文件6项基础权限的一些设置!

    之前,我们讨论过设置Windows文件[始终]以图标显示,其实,在Windows中,关于文件的操作还有很多,比如设置文件权限.权限绝对是一个值得深究的话题,为不同的账户设置权限很重要,可以防止重要文件 ...

  3. c++ 读取访问权限冲突_南京课工场IT培训:解析文件共享及访问方式

    各位小伙伴大家好! 我们接上一篇的文件权限操作,接下来和各位小伙伴解析文件共享的操作方法. 我们首先使用管理员身份进入server2016系统,然后对我们之前在E盘中创建的abc的文件夹进行设置,右键 ...

  4. linux root权限_深入了解 Linux 权限

    (给Linux爱好者加星标,提升Linux技能) 编译:linux中国-lujun9972,作者:Sandra Henry-Stocker https://linux.cn/article-10947 ...

  5. linux sftp没有读写权限,sftp服务器上的Linux权限问题

    美好的一天! 我有一个位于虚拟机的linux sftp服务器.该VM可以访问sftp目录所在的GlusterFS存储. Sftp通过OpenSSH服务器工作,并根据sftpusers组来sftp Gl ...

  6. python开发信息系统权限设置_[Python学习] Django 权限控制

    本文为大家讲解 Django 框架里自带的权限模型,从理论到实战演练,带领大家了解 Django 里权限是怎么一回事. 主要内容 什么是权限管理? Web 权限 Django 权限机制 Django ...

  7. linux权限bcd码是6,Linux权限管理(1)基本权限

    一.文件类型与权限 -rwxrw-r-- 第1个字符表示文件类型 若是 - ,表示是普通文件 若是 d ,表示是目录 若是 l ,表示是链接文件 若是 b ,表示是设备文件里的可供存储的接口设备 若是 ...

  8. setfacl 权限导出_使用setfacl设置权限继承

    查看分区是否支持facl 临时性修改支持 mount -o remount,acl /dev/sda1 如果想永久性支持facl则需要修改fatab: 重启系统生效. 当再次查看分区是否支持acl时, ...

  9. 引发了未经处理的异常:读取访问权限冲突_从零开始学Python:23课-文件读写和异常处理

    一下子想起来,我的Python100天教程没更新了,赶紧补上~ 这期就还接着前面的讲哈.另外就是想跟伙伴们了解下,就是跟我要到Python视频教程的伙伴,你们学的怎么样了,可以给我个反馈哈! 实际开发 ...

最新文章

  1. OpenGL 三角形要点总结
  2. Myeclipse中js文件中的乱码处理
  3. 单片机 PWM输出 c
  4. python处理网络文字流,设置为utf8编码
  5. 微课与计算机技术的论文,微课在高校计算机教学的运用论文
  6. 华为云IoT专家直播——构筑智慧路灯实战分享
  7. MySQL指定存储引擎命令_MySQL常用指令(2)——存储引擎
  8. java中常忽视的小问题
  9. python线程数组_Python多线程
  10. SSL数字证书的签发及使用(服务器证书)
  11. Stackoverflow每日问题 系列前言
  12. 华为SmartKit工具下载
  13. word如何在任意页开始添加页码
  14. 如何免费下载论文资料
  15. Web服务器及性能优化
  16. 谈谈业务系统的监控报警
  17. Composing Programs 2.2 Data Abstraction
  18. selenium对Alert弹框的多种处理
  19. 钉钉回放被管理员禁止下载?别急我来帮你
  20. 手机远程启动热车!汽车远程启动有什么缺点?你都知道吗汽车手机远程启动优缺点,汽车手机远程启动怎么用,

热门文章

  1. 自定义FireFox浏览器滚动条
  2. 面向接口编程详解(一)——思想基础
  3. java转换CSV文件生成xml格式数据
  4. (转载)C语言的零长数组
  5. 如何处理Entity Framework中的DbUpdateConcurrencyException异常
  6. .Net MVC Redirect出现:服务器无法在已发送 HTTP 标头之后设置状态解决方案
  7. 使用控件时提示“未声明标识符“的解决方法
  8. VS2013 解决方案文件结构分析
  9. C#操作FTP报错,远程服务器返回错误:(550)文件不可用(例如,未找到文件,无法访问文件)的解决方法
  10. 表格单元格中的CSS文本溢出?