1. 权限的概念
1.1 什么是权限
Linux 下的权限是一种用于控制文件和目录访问的系统机制,它决定了用户能够访问、修改、删除文件和目录,或者执行特定命令的操作权限。
1.2 权限的本质
权限不仅和人的身份有关,还和事物的属性有关。就比如你去电影院看电影,因为你买了电影票所以你有这个身份进入电影院;但是你想去电影院吃饭,这个是做不到的,尽管你有这个身份进入(买了电影票),但是电影院不具有这个属性呀。
2. Linux中的用户以及相关的命令
2.1 root 超级用户(老流氓)
在 Linux 操作系统中,root 用户是一个具有超级权限的用户账号,它拥有系统中的所有权限,可以执行任何操作,包括修改系统设置、访问受限文件和执行通常不允许普通用户执行的任务。由于 root 用户的权限如此之大,因此应当谨慎使用,以避免不必要的系统损坏或安全问题。
2.2 普通用户(打工人)
普通用户是除 root 之外的用户,使用计算机系统进行日常工作和任务,但不足以对系统核心或其他用户账户进行深入管理的用户。普通用户的权限和功能通常受到一定限制,以保障系统的稳定性和安全性。
2.3 区别
特性 | root | 普通用户 |
---|---|---|
权限级别 | 天花板 | 低权限 |
操作范围 | 整个系统 | 个人文件和目录 |
– | – | – |
文件访问 | 不受限 | 受限 |
– | – | – |
系统配置 | 完全访问和修改系统配置 | 有限,不能修改系统设置 |
– | – | – |
软件安装 | 能够安装和卸载任何软件 | 受限 |
– | – | – |
日常使用 | 适合系统管理和维护 | 适合日常工作和任务 |
通过比较,不难看出 root 用户在系统里面可谓是想去哪儿去哪儿,想干嘛干嘛。不愧是超级用户(老流氓)。
2.4 用户之间的切换
普通用户之间的切换 (需要输入切换用户的密码):
su [-] usrname 加入 - 之后切换用户后,会自动前往该用户家目录
普通用户切换为 root 用户 (需要 root 密码):
su [-]
root 切换为普通用户 (无需密码,这就是霸道的力量!!!):
su [-] usrname
2.5 指令提权
普通用户在进行文件操作的过程中难免遇到权限不够的提示!就比如:
-bash-4.2$ ll
total 20
-rwxrwxr-x 1 lq lq 8360 May 29 18:40 a.out
drwxrwx--x 3 lq lq 4096 May 29 16:34 dir
-rw-rw-r-- 1 lq lq 79 May 29 18:39 test.c
-bash-4.2$ mv dir ../
mv: cannot move ‘dir’ to ‘../dir’: Permission denied
在这里我想要将 dir
移到上一个目录,结果失败了,原因权限不够。
如果真的这样的话,只有切到 root 用户来代替当前用户进行操作了,可这样未必太繁琐了些。
但是我们还有一个办法,使用 sudo(Substitute User and Group),sudo 允许普通用户在需要时以 root 的身份执行命令,但条件是输入你的密码。
使用方法是将 sudo
放到你的指令的前面,如:
-bash-4.2$ sudo mv dir ../
[sudo] password for lq:
-bash-4.2$ ll ../
total 24
drwx------ 4 admin admin 4096 Apr 3 23:00 admin
drwxrwx--x 3 lq lq 4096 May 29 16:34 dir
drwxr-xr-x 6 root root 4096 May 23 21:20 javatar
drwxrwxrwx 2 limuyou limuyou 4096 May 29 20:45 limuyou
drwxrwxrwx 7 lq lq 4096 May 29 21:04 lq
drwxr-xr-x 3 root root 4096 Mar 31 00:48 service
可以看到,dir 顺利的拷贝到上一个目录。
3. 文件的分类和权限
前面铺垫了这么多,终于到了本文的重点,文件的权限。当然这里的权限是对于普通用户来说的,root 用户可直接忽视掉权限。
3.1 文件的分类
文件类型 | 符号 | 描述 |
---|---|---|
普通文件 | - | 包含文本、数据或程序代码的文件 |
– | – | – |
目录文件 | d | 用于存储其他文件和子目录的文件夹 |
– | – | – |
符号链接 | i | 指向其他文件或目录的链接 |
– | – | – |
块设备文件 | b | 用于存储数据,每次读写时以块为单位 |
– | – | – |
字符设备文件 | c | 用于串行通信,每次读写时以字符为单位 |
– | – | – |
管道文件 | p | 用于进程间的数据传输 |
这里的符号会在后面内容中提到,文件的权限本篇 blog 主要是讲解前两种我们下载常用的。
3.2 文件的权限
Linux 中文件的权限有 读( w ), 写( r ), 执行( x ) 三种。
- 读( w ):该文件是否可以查看
- 写( r ): 该文件是否可以可以写入新的内容
- 执行( x ): 是否可以执行该文件
3.2.1 执行(x)权限是什么
前两者还是比较好理解的。但是执行是什么呢?这里我们单独好好讲一下:
能执行 = 具有可执行权限 + 本身就是可执行文件, 两者缺一不可。
比如,这里我们写一个简单的 C 程序:
-bash-4.2$ cat test.c
#include <stdio.h>
int main(){
printf("hello, world\n");
return 0;
}
在经过 gcc test.c
后,我们得到了一个 a.out
的可执行文件:
通过使用 ./a.out
指令,我们可以得到程序运行的结果:
我们通过相应的指令来去除 a.out
的执行权限(后面具体会说明如何操作),再运行一下,我们可以得到:
所以说,就算你是可执行程序,不给你执行的权限你也没办法执行。反之,就算给你执行的权限,你本身就不是可执行的程序,你也执行不了。
3.3 文件权限的构成
好了言归正传,我们怎么查看文件的权限呢?其实就是我们最常用的指令 ll
, 输入指令后,出现以下内容:
现在我们来仔细看看文件权限的构成:
rw-rw-r--
文件权限的构成可以详细解读为:每一行代表文件或目录的访问权限,共九个字符,它们被分为三组,每组三个字符,分别对应 文件所有者、文件所属组和其他用户(others) 的权限。具体来说啥意思呢?请看图:
这样看的话意思就比较明朗了,一个文件针对不同的人设置了不同的访问权限。
就拿这个文件来说明:
- 文件拥有者:可
读(r)
, 可写(w)
, 但不可执行(x)
- 文件所属组: 可
读(r)
, 可写(w)
, 但不可执行(x)
- other:可
读(r)
, 不可写(w)
, 不可执行(x)
重点:使用数字来代表字符
普通情况下我们使用字符来代表该权限,但是我们同时也可使用数字来表示,就比如:
如具有该权限则是 1 ,反之则为 0,然后我们使用八进制来代表二进制,得到的结果是:664。
我给出一个列子,下面大家自己试一试:
rwxr-x–x
解答:首先我们使用二进制表示是:111101001
, 在转化为八进制,最终的结果是 751
。大家答对了吗:).
3.3.1 针对文件对用户进行分组
在上面我们提到了,文件所有者、文件所属组和其他用户(others) 的概念,文件拥有者不难理解,其余两者又是什么身份呢?下面我们逐一理解。
文件拥有者:
- 文件所有者是创建文件的用户。他们对文件拥有完全的控制权,包括读取(r)、写入(w)和执行(x)的权限
- 文件所有者可以改变文件的权限设置,也可以删除文件或修改文件内容
- 我们可使用该指令切换文件的拥有者:
chown 用户名 文件
。但是极大可能会被拒绝的,因为文件不可以随意更改拥有者。但是如果你就是要给别人,那可以使用 sudo 提权:sudo chown 用户名 文件
文件所属组:
- 文件所属组是与文件所有者属于同一用户组的用户集合
- 文件所属组内的用户默认共享相同的文件访问权限,但文件所有者可以对所属组的其他成员的访问权限进行单独设置
- 通常,文件所属组内的用户可以读取文件(r)和写入文件(w),但不一定能执行文件(x)
- 将用户加入所属组:
sudo usermod -aG 新的组 用户
。现在基本都是一个组使用一个云服务器,所以我们不着重讲解所属组
other:
- 其他用户指的是除了文件所有者和文件所属组成员之外的所有用户
- 对于文件的其他用户,默认情况下他们只有读取文件的权限(r),无法写入文件(w)或执行文件(x)
- 文件所有者或管理员可以设置其他用户的访问权限,以允许或限制他们对文件的访问
4. 修改文件权限
4.1 谁可以修改
一般情况下,只有文件拥有者和root才具有修复文件权限的能力。
4.2 修改指令
-
chmod [u / g / o][+ / -][r / w / x] 文件
好长,别怕。我们来逐一解释:chmod 没啥好说,修改指令。[u / g / o] 代表 文件拥有者,所属组,other。意思是你 想要修改这三者的哪一位的权限。[+ / -], + 代表增加权限,- 代表去除权限。[r / w / x] 代表具体操作的哪一个权限。
例:// other是不具有写权限的,我们给other加上 -rw-rw-r-- 1 lq lq 79 May 29 23:01 test.c
我们执行
chmod o+w test.c
,选择 o(other), +(增加),w(写的权限):// other有了写的权限 -rwxrw-rw- 1 lq lq 79 May 29 23:01 test.c
我看自己不顺眼,想去掉自己读的权限,我们执行
chmod u-r test.c
:// 我们不具有了读的权限 --wxrw-rw- 1 lq lq 79 May 29 23:01 test.c
指令还可以叠加的,就比如我想去掉我和所属组和other写的权限,
chmod ugo-w test.c
// 都不具有了写的权限 ---x---r-- 1 lq lq 79 May 29 23:01 test.c
-
chmod a[+ / -][r / w / x] 文件
a 代表 all 全部的意思,所以你的修改是针对所有用户而言的。
例:// 所有用户都不具有读写的权限 ---x---r-- 1 lq lq 79 May 29 23:01 test.c
我为所有用户加上读写的权限,
chmod a+wr test.c
:// 执行成功 -rwxrw-rw- 1 lq lq 79 May 29 23:01 test.c
-
chmod [num][num][num] 文件
上面我们提到了可以利用数字来代表字符表示权限,现在修改权限就可以利用数字来表示权限,十分的方便。
例:
我们为所有用户加上所有权限chmod 777 test.c
:// 所有用户拥有全部权限 -rwxrwxrwx 1 lq lq 79 May 29 23:01 test.c
文件拥有者保留读写权限,所属组保留所有权限,other只有读的权限,
chmod 674 test.c
:// 成功实现 -rw-rwxr-- 1 lq lq 79 May 29 23:01 test.c
5. 总结
这篇 blog,我们介绍了什么是权限。以及在Linux中的文件权限,权限的表达方式,针对文件对用户分组,以及修改文件权限的各种方法。如果有什么不正确的地方,希望大家指正。