6. Linux 文件权限
[TOC]
Unix 系统的特性:多任务、多用户系统。
文件读取、写入和执行
对于文件和目录的访问权限是根据读访问,写访问,和执行访问来定义的。
文件属性1. 第一列10个字符——文件的属性
列表的前十个字符是文件的属性,这十个字符的第一个字符表明文件类型。Linux 中一共有 7 种文件类型:
属性 | 文件类型 |
---|---|
- | 普通文件 |
d | 目录文件 |
l | 符号链接,注意对于符号链接文件,剩余的文件属性总是 "rwxrwxrwx",而且都是虚拟值。真正的文件属性是指符号链接所指向的文件的属性。 |
c | 字符设备文件。这种文件类型是指按照字节流,来处理数据的设备。 比如说终端机,或者调制解调器。 |
b | 块设备文件。这种文件类型是指按照数据块,来处理数据的设备,例如一个硬盘,或者 CD-ROM 盘。 |
s | 本地域套接字文件(socket),用于进程间通信。 |
p | 有名管道 |
- 剩下的九个字符,叫做文件模式,代表着文件所有者,文件组所有者,和其他人的读,写,执行权限。
- 后边的 9 位,每三个为一组。均为 rwx 三个参数的组合。其中 r 代表可读,w 代表可写,x 代表可执行。
- 前三位:所属主(user,即文件的拥有者)的权限;
- 中间三位:所属组(group,即该文件所属主所在的一个组)的权限;
- 最后三位:其他非本群组(others)的权限;
- 对于一个目录来讲,打开这个目录即为执行这个目录,所以任何一个目录必须要有 x 权限才能打开并查看该目录。
2. 第 2 列——连接占用的节点(inode)
若为目录时,通常与该目录下还有多少子目录有关系,关于连接(link)在以后章节详细介绍。
3. 第 3 列——该文件的所属主
4. 第 4 列——该文件的所属组
5. 第 5 列——该文件的大小
6. 第 6、7、8 列
该文件的创建日期或者最近的修改日期,分别为月份日期以及时间。
7. 第 9 列——文件名
如果前面有一个. 则表示该文件为隐藏文件。
chmod
更改文件模式
- 更改文件或目录的模式(权限),可以利用
chmod
命令。 - 只有文件的所有者或者超级用户才能更改文件或目录的模式。
-
chmod
命令支持两种不同的方法来改变文件模式:八进制数字表示法、符号表示法。
1⃣️ 八进制表示法
- 使用八进制数字来设置所期望的权限模式。
- 使用用八进制表示法来表示3个二进制数非常有优势。
- 通过使用 3 个八进制数字,可以设置文件所有者,用户组,和其他人的权限
Octal | Binary | File Mode |
---|---|---|
0 | 000 | --- |
1 | 001 | --x |
2 | 010 | -w- |
3 | 011 | -wx |
4 | 100 | r-- |
5 | 101 | r-x |
6 | 110 | rw- |
7 | 111 | rwx |
语法:chmod [-R] xyz 文件名
,(xyz表示数字,777)
r=4,w=2,x=1,-=0,默认目录权限755(drwxr-xr-x)、默认文件权限644(-rw-r--r--)。
权限符 | 读取(r) | 写入(w) | 执行(x) |
---|---|---|---|
八进制 | 4 | 2 | 1 |
如果你创建了一个目录,而该目录不想让其他人看到内容,则只需设置成 rwxr----- (740) 即可。
# 修改私钥文件权限为只读属性
chmod 400 ~/.ssh/mykeypair.pem
2⃣️ 符号表示法
- 符号表示法分为三部分:更改会影响谁,要执行哪个操作,要设置哪种权限。
- 通过字符 “u”,“g”,“o”,and “a” 的组合来指定要影响的对象。
- 符号表示法的优点:允许你设置文件模式的单个组成部分的属性,而没有影响其他的部分。
字符 | 描述 |
---|---|
u | user,文件或目录的所有者。 |
g | group,用户组。 |
o | others,其他所有的人。 |
a | all,是 “u”,“g”,和 “o” 三者的联合。 |
如果没有指定字符,则假定使用 “all”。执行的操作可能是一个 “+” 字符,表示加上一个权限, 一个 “-”,表示删掉一个权限,或者是一个 “=”,表示只有指定的权限可用,其它所有的权限被删除。
chmod 符号表示法示例 | 作用 |
---|---|
u+x | 为文件所有者添加可执行权限。 |
u-x | 删除文件所有者的可执行权限。 |
+x | 为文件所有者,用户组,和其他所有人添加可执行权限。等价于 a+x。 |
o-rw | 除了文件所有者和用户组,删除其他人的读权限和写权限。 |
go=rw | 给群组的主人和任意文件拥有者的人读写权限。如果群组的主人或全局之前已经有了执行的权限,他们将被移除。 |
u+x,go=rw | 给文件拥有者执行权限并给组和其他人读和执行的权限。多种设定可以用逗号分开。 |
语法:用户组+/-权限 、 用户组=权限、用户组1=用户组2
# 用户组+/-权限
$ chmod u+x days # 增加属主对文件的执行权限
$ chmod a-x days # 删除所有人对文件的执行权限
# 用户组=权限
$ chmod ug=rw,o=r days # 赋予属主和属组的读取/写入权限,其他人只有读取权限
# 用户组1=用户组2
$ chmod o=u days # 设置其他人的权限与属主权限完全相同
umask
设置默认的文件权限
-
umask
命令使用八进制表示法来表达:从文件模式属性中删除一个位掩码。 -
umask
命令设置的掩码值只能在当前 shell 会话中生效,若当前 shell 会话结束后,则必须重新设置。
检查创建文件的默认权限掩码:
# 默认以八进制形式显示当前的掩码
$ umask
0022
# 以字符形式显示当前的掩码
$ umask -S
u=rwx,g=rx,o=rx
$ touch test01.txt
-rw-r--r-- 1 root root 0 Jan 14 14:18 test01.txt
掩码 0022 的含义:
umask 的过程 | 示例 | 示例 | 示例 | 示例 |
---|---|---|---|---|
初始文件模式 | --- | rw- | rw- | rw- |
掩码(0022) | 000 | 000 | 010 | 010 |
结果(rw-r--r--) | --- | rw- | r-- | r-- |
解读:掩码的二进制形式中,出现数字 1 的位置,相应地关掉该位置的文件模式权限。
chattr
修改文件的特殊属性
lsattr
列出文件/目录的特殊属性
语法:lsattr -[aR] [文件/目录名]
参数 | 含义 |
---|---|
-a | 类似与 ls 的 -a 选项,即连同隐藏文件一同列出; |
-R | 连同子目录的数据一同列出 |
su
以另一个用户的身份来运行 shell
语法:su [-[l]] [user]
- 如果包含 "-l" 选项,加载此用户的 shell 环境,并且工作目录会更改到这个用户的主目录。
- 如果不指定用户,那么就假定是超级用户。
- 选项 "-l" 可以缩写为 "-"
⚠️ Ubuntu Linux 的限制非常严格,必须使用
sodu -s
来获得 root 访问权。
$ sudo -s # 将自己提升为root用户 (💡💡💡Ubuntu Linux 系统💡💡💡)
$ su # 同上
$ su - # 同上
$ su alice # 切换到 alice 账户
$ su -c 'command' # 只执行单个命令
$ exit #回到先前的用户状态
sudo
以另一个用户的身份来执行命令
- 管理员能够配置
sudo
命令,从而允许一个普通用户以不同的身份(通常是超级用户),通过一种非常可控的方式来执行命令。 -
sudo
命令不要求超级用户的密码。使用sudo
命令时,用户使用他/她自己的密码来认证。 -
su
和sudo
之间的一个重要区别是:sudo
不会重新启动一个 shell,也不会加载另一个用户的 shell 运行环境。
查看 sudo 命令可以授予哪些权限:
$ sudo -l
Matching Defaults entries for root on localhost:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User root may run the following commands on localhost:
(ALL : ALL) ALL
需要 root 预先配置 /etc/sudoers:
yum install -y sudo # 安装 visudo 命令
visudo # 使用 visudo 命令编辑 sudo 配置文件
# root 用户可以使用 sudo 在任何机器上(第一个ALL)以任何用户身份(第二个ALL)执行任何命令(第三个ALL)
root ALL=(ALL) ALL
%wheel ALL=(ALL) ALL # 所属组权限设置,wheel 组的所有用户都拥有 sudo 权利
test ALL=(ALL) ALL # 所属主权限设置,test 用户拥有 sudo 权利
sudo 配置文件 / etc/sudoers 详解及实战用法
chown
更改文件所有者和用户组
chown
命令被用来更改文件或目录的所有者和用户组,使用这个命令需要超级用户权限。
格式:chown [owner][:[group]] file...
参数:-R 改变一个目录及其下所有文件(和子目录)的所有权设置。
示例 | 结果 |
---|---|
chown bob | 把文件所有者从当前属主更改为用户 bob。 |
chown bob:users | 把文件所有者改为用户 bob,文件用户组改为用户组 users。 |
chown :admins | 把文件用户组改为组 admins,文件所有者不变。⚠️ 注意 :不能省略 |
chown bob: | 文件所有者改为用户 bob,文件用户组改为,用户 bob 登录系统时,所属的用户组。 |
chgrp
更改文件组所有权
在旧版 Unix 系统中,chown
命令只能更改文件所有权,而不是用户组所有权。为了达到目的, 使用一个独立的命令,chgrp
来完成。
语法:chgrp [组名] [文件名]
参数:-R :改变一个目录及其下所有文件(和子目录)的所有权设置。