专栏首页C/C++基础Linux 命令(81)—— chmod 命令

Linux 命令(81)—— chmod 命令

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/K346K346/article/details/102827264

1.命令简介

chmod 命令用来变更文件或目录的访问权限。仅限文件属主和超级用户 root 使用。

Linux 文件与目录的权限有三种范围,属主(u,user)、属组(g,group)与其它(o,other),全部用户使用 a(all)表示。每个范围的权限由三个比特位表示,从左至右分别表示 r(read,读)、w(write,写)与 x(execute,可执行)。权限可以使用字符或八进制数字表示,r 对应数字 4,w 对应数字 2,x 对应数字 1。如果相应的权限位没有权限,使用ls -l命令查看时,显示为横杠-。如下图所示:

注意: (1)当使用 chmod 改变符号链接的权限时,实际上改变的是目标文件的权限;chmod 无法更改其符号链接的权限,这不是一个 bug,因为符号链接的权限从未被使用过。 (2)chmod 在递归时,遇到符号链接则会忽略之。

2.命令格式

chmod [OPTION]... MODE[,MODE]... FILE...
chmod [OPTION]... OCTAL-MODE FILE...
chmod [OPTION]... --reference=RFILE FILE...

其中 MODE 使用字符形式表示文件权限,格式为 [ugoa…][[±=][perms…]…]。ugoa 任意字母组合指定权限范围,不指定默认为 a。±= 分别表示增加、去除与赋予相应权限。权限 perms 可以是零也可以是 rwxXst 中的多个字符的组合,或者是 ugo 中的某一个字符。MODE 可以出现多次,由逗号隔开。rwxXst 分别表示 r(读)、w(写)、x(可执行)、X(可执行,已经有可执行权限或者目标是目录时使用,以示区分)、s(文件的特殊权限 SETUID 或 SETGID)和 t(粘滞位)。

OCTAL-MODE 为八进制数字表示权限比特位组成的数值。可以指定 1 到 4 个八进制数字(0-7)。从右至左,四个数字分别表示其它 o、用户组 g、属主 u 和文件的特殊权限 SETUID(4)、SETGID(2)和 SBIT(1)。

3.选项说明

-c
--changes
	类似 --verbose,但只在有更改生效时才显示结果
-f
--silent
--quiet
  去除大部份的错误信息
-v
--verbose
	显示指令详细的执行过程
--no-preserve-root
	不特殊对待根目录(默认)
--preserve-root
	禁止对根目录进行递归操作
--reference=RFILE
	使用指定参考文件的权限,而非自行指定
-R
--recursive
	以递归方式更改所有文件及子目录
--help
	显示帮助信息并退出
--version
	显示版本信息并退出

4.常用示例

(1)增加全部用户对文件 test.sh 的执行权限。

chmod +x test.sh

#或
chmod a+x test.sh

ll test.sh
-rwx-wx-wx 1 root root 0 Oct 30 20:13 test.sh

(2)减去全部用户对文件 test.sh 的执行权限。

chmod -x test.sh

#或
chmod a-x test.sh

ll test.sh
-rw--w--w- 1 root root 0 Oct 30 20:13 test.sh

(3)增加属主对文件 test.sh 的执行权限。

chmod u+x test.sh

ll test.sh
-rwx-w--w- 1 root root 0 Oct 30 20:13 test.sh

(4)分别使用符号方式和数字方式为文件 test.sh 设置新的权限为 rwxr–r--。

#符号方式
chmod a=rwx,g=r,o=r test.sh

#数字方式
chmod 0744 test.sh

#或
chmod 744 test.sh

ll test.sh
-rwxr--r-- 1 root root 0 Oct 30 20:13 test.sh

(5)递归地将 dir 目录下所有文件和目录加上读权限。

chmod -R a+r dir

ll dir
total 4
drwxrwxrwx 2 root root 4096 Oct 30 20:29 newdir
-rw-rw-rw- 1 root root    0 Oct 30 20:13 test.sh
-rw-rw-rw- 1 root root    0 Oct 30 20:26 test.txt

(6)给文件 test.sh 增加 SETUID 权限。前提是属主对文件 test.sh 有执行权限。

chmod u+x test.sh

ll test.sh
-rwsr--r-- 1 root root 0 Oct 30 20:13 test.sh

5.拓展知识

5.1 文件的特殊权限

5.1.1 SETUID

SETUID 使用小写字母 s 表示,出现在属主可执行权限位,具有 SUID 权限的文件会在其执行时,使调用者的有效身份临时变为该文件的拥有者,用于临时提升权限,使调用者暂时获得该文件拥有者的权限。

例如命令 passwd 的权限:

ll /usr/bin/passwd
-rwsr-xr-x 1 root root 27832 Jun 10  2014 /usr/bin/passwd

在文件拥有者的执行位上出现 s 而不是 x,所以说 passwd 具有 SUID 权限。修改用户密码使用的是 passwd 这个命令,Linux 用户密码存储在文件 /etc/shadow 中。首先查看一下 /etc/shadow 文件的权限:

ll /etc/shadow
---------- 1 root root 853 Jan  4 14:56 /etc/shadow

可见 root 没有读写权限,但是为什么 root 实际上可以读取和修改 shadow 呢?因为 Linux 的权限管理机制不能够限制神一样的 root。从 shadow 的权限列表可以看出,root 组用户和其他用户对 shadow 没有读写权限的,也就是只有 root 才能进行强制的读写操作。但是实际上普通用户是可以自行修改自己的密码的,这就是为什么呢?因为 /usr/bin/passwd 的属主 root 对其权限是 rws,而且其他用户的使用权限为 r-x,也就是说,别人在执行 passwd 时会暂时获得 passwd 的属主即 root 的权限。这就是 Linux 特有的 SUID 权限机制。

5.1.2 SETGID

SETGID 与 SETUID类似,使用小写字母 s 表示,出现在用户组可执行权限位,具有 SETGID 权限的文件会在其执行时,使调用者的有效用户组临时变为该文件属主的用户组,用于临时提升权限,使调用者暂时获得该文件所属用户组的权限。

当 SGID 作用于可执行文件时,在执行该文件时,用户将获得该文件所属组的权限。

当 SGID 作用于目录时,当用户对某一目录有写和执行权限时,该用户可以在该目录下建立文件,如果该目录具有 SGID 权限,则该用户在该目录下建立的文件都属于这个目录所属的组。

5.1.3 SBIT

SBIT(Sticky Bit)称为粘滞位,它出现在其他用户权限的执行位上,只能用来修饰一个目录,用于限制文件的删除。

当某一个目录拥有 SBIT 权限时,则任何一个能够在这个目录下建立文件的用户,该用户在这个目录下所建立的文件,只有该用户自己和 root 可以删除,其他用户均不可以。例如目录 /tmp 的权限如下:

ll -d /tmp
drwxrwxrwt 14 root root 147456 2月  14 16:01 /tmp

注意,如果目录的其他用户的权限执行位是 T,则表示 SBIT 权限无效。发生的情况是权限的执行位不是 x。

5.2 Linux 文件分类

Linux 中一切皆文件,文件一般分为如下几种类型:

- 普通文件
d 目录
b 块设备
c 字符设备
p 命名管道
l 符号链接
s 套接字

如果文件是目录,其 rwx 权限的作用如下: (1)目录读权限位意味着可以列出其中的内容; (2)目录写权限位意味着可以在该目录中创建、删除、更名或移动文件,前提是目录需要有执行权限; (3)目录执行权限位则意味着可以进入该目录进行搜索。因此在创建目录的时候一般都具有可执行权限。


参考文献

[1] chmod manual [2] Linux 文件特殊权限 SUID、SGID 与 SBIT

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Linux文件特殊权限SUID、SGID与SBIT

    Linux使用9个权限位来标识文件权限,三大权限分别是r、w、x(读、写、执行)。除此之外,还有特殊权限SUID,SGID,SBIT。

    Dabelv
  • 树堆(Treap)图文详解与实现

    树堆(Treap)是二叉排序树(Binary Sort Tree)与堆(Heap)结合产生的一种拥有堆性质的二叉排序树。

    Dabelv
  • Linux 命令(82)—— chgrp 命令

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    Dabelv
  • Linux之ACL权限控制

    ACL权限控制主要目的是提供传统的owner,group,other的read,wirte,execute权限之外的具体权限设置,可以针对单一用户或组来设置特定...

    JouyPub
  • 这几个示例,帮你深入理解 cgroup 中的 cpuset

    通过上篇文章的学习,我们学会了如何查看当前 cgroup 的信息,如何通过操作 /sys/fs/cgroup 目录来动态设置 cgroup,也学会了如何设置 C...

    米开朗基杨
  • Golang调用动态库so

    测试动态库 test_so.h int test_so_func(int a,int b); test_so.c #include "test_so.h" ...

    李海彬
  • linux每日命令(27):chmod命令

    chmod命令用于改变linux系统文件或目录的访问权限。用它控制文件或目录的访问权限。该命令有两种用法。一种是包含字母和操作符表达式的文字设定法;另一种是包含...

    用户1214487
  • Dagger2神器入门

    网上随便搜索一下Dragger2,一大堆文章铺天盖地而来,一上来就讲@Inject,@Module等注解是做什么的,解释一大堆,看完之后一脸懵逼。对于刚刚入门D...

    用户2802329
  • 汇编指令-adr与ldr伪汇编区别(8)

    adr :相对寻址,与当前位置有关 ldr  :绝对寻址,与当前位置无关 在初始化SDRAM时就会用到adr,代码如下: /* 初始化SDRAM ...

    张诺谦
  • [测评]digitalocean的最低配置的机器测评

    laulzgoay

扫码关注云+社区

领取腾讯云代金券