Linux 中对文件的访问由文件权限、属性和所有权控制。 因此,只有授权的用户和进程才能访问文件和文件夹。本篇使用 chmod 命令更改文件和目录的访问权限。
Linux 文件权限
在这之前,让我们先了解一下 Linux 权限的基础知识。在 Linux 中,谁可以对文件或目录执行什么操作是通过权限集来控制的。 共有三组权限。 一组用于文件所有者,另一组用于文件组成员,最后一组用于其他所有人。
1、文件所有者
2、文件所在组
3、其他组
权限控制可以对文件或目录执行的操作。 它们要么允许或阻止文件被读取、修改,或者如果它是脚本或程序,则被执行。
查看和了解文件权限
要查看文件或目录设置了哪些权限,我们可以使用 ls 命令。
在每一行,第一个字符标识正在列出的条目的类型。 如果它是一个破折号 (-),它就是一个文件。 如果是字母 d 它是一个目录。
1、前三个字符显示拥有文件的用户的权限(用户权限)。
2、中间三个字符显示文件组成员的权限(组权限)。
3、最后三个字符显示不属于前两个类别的任何人的权限(其他权限)。
每组权限包含三个字符。 这些字符是存在或不存在权限之一的指示符。 它们是破折号 (-) 或字母。 如果字符是破折号,则表示未授予权限。 如果字符是 r、w 或 x,则已授予该权限。
r:读取权限。 可以打开文件并查看其内容。
w:写权限。 该文件可以被编辑、修改和删除。
x:执行权限。 如果文件是脚本或程序,则可以运行(执行)。
(rw-r–r--) 表示文件所有者有读写权限(rw-),而组和其他人只有读权限(r–)。
根据它们是设置为文件还是目录,三个权限三元组中的每一个都可以由以下字符组成,并具有不同的含义。
权限对文件的影响
权限 | 特点 | 文件上的含义 |
---|---|---|
Read | - | 该文件不可读。 您无法查看文件内容。 |
r | 该文件是可读的。 | |
Write | - | 该文件不能更改或修改。 |
w | 该文件可以更改或修改。 | |
Execute | - | 该文件无法执行。 |
x | 该文件可以执行。 | |
s | 如果在用户三元组中找到,它将设置 setuid 位。 如果在组三元组中找到,它会设置 setgid 位。 这也意味着设置了 x 标志。 在可执行文件上设置 setuid 或 setgid 标志时,将使用文件的所有者和/或组权限执行文件。 | |
S | 与 s 相同,但未设置 x 标志。 该标志很少用于文件。 | |
t | 如果在其他三元组中找到,它会设置粘性位。 这也意味着设置了 x 标志。 此标志对文件无用。 | |
T | 与 t 相同,但未设置 x 标志。 此标志对文件无用。 |
chmod命令的使用
chmod 命令的编写格式如下:
chmod [OPTIONS] MODE FILE…
chmod 命令允许您使用符号或数字模式以及参考文件来更改文件的权限。文件的权限只能由 root、文件所有者或具有 sudo 访问权限的用户更改。 使用 chmod 时要格外小心,尤其是在递归修改权限时。
符号模式的方法 :
使用符号模式时,chmod 命令的语法如下:
chmod [OPTIONS] [ugoa…][-+=]perms…[,…] FILE…
第一组标志 ([ugoa…]) 定义了哪些用户的类的文件权限已更改。
u:User,意思是文件的所有者。
g:Group,表示文件所属组的成员。
o:Others,表示不受 u 和 g 权限约束的人。
a:All,意思是以上所有。
如果未指定用户的标志,则默认值为 a
操作标志,第二组标志 ([-+=]),确定是否要删除、添加或设置权限:
= - 将现有权限更改为提供的权限。 如果 = 符号后未指定任何权限,则删除指定用户类的所有权限。
- - 删除指定的权限。
+ - 添加指定的权限。
权限 (perms…) 可以通过输入零个或一个或多个字母 r、w、x、X、s 和 t 来明确建立。
在为多个用户类别([,…])定义权限时,使用逗号(无空格)分隔符号模式。
使用 chmod 命令的一些示例
我们可以使用以下命令添加执行权限:
chmod a+x 2022-2-20.log
如果我们看一下权限,我们会看到现在每个人都授予了执行权限,并且现有的权限仍然存在。
我们将文件所有者的权限添加到文件的组成员的权限中:
chmod g+u 2022-2-20.log
我们将授予组成员读取文件但不写入或执行文件的权限:
以递归方式删除所有其他用户的写权限:
授予文件所有者读取、写入和执行权限,以及对文件组的读取权限,而对其他所有人不授予权限:
数值方法
chmod 命令具有以下语法:
chmod [OPTIONS] NUMBER FILE…
可以在使用数字模式时同时为所有三个用户类别(所有者、组和所有其他)指定权限。
NUMBER 可以是三位数或四位数。使用三位数字时,第一位代表文件所有者的权限,第二位代表文件所属的组,第三位代表所有其他用户。为每个写入、读取和执行权限分配以下数值:
r = 4 (read)
w (write) = 2
x (execute) = 1
no permissions = 0
此处列出了可以使用的数字及其代表的含义:
0: (000) 没有权限。
1:(001)执行许可。
2:(010)写权限。
3:(011)写入和执行权限。
4:(100)读取权限。
5:(101)读取和执行权限。
6:(110)读写权限。
7:(111) 读取、写入和执行权限。
这三个权限中的每一个都由十进制数的二进制等效位中的一个位表示。 所以 5,即二进制的 101,表示读取和执行。 2,二进制010,表示写权限。
要为文件的所有者提供读取、写入和执行权限、对文件组的读取和执行权限以及对所有其他用户的读取权限,可以执行以下操作:
Owner: rwx=4+2+1=7
Group: r-x=4+0+1=5
Others: r-x=4+0+0=4
stat 命令检查权限
stat 命令可用于以数字形式检查文件的权限:
stat -c “%a” 2022-2-20.log
数字模式下,chmod命令使用示例
授予文件所有者读取、写入和执行权限,组成员读取和执行权限,以及所有其他用户不授予权限:
chmod 750 2022-2-20.log
授予文件所有者读写权限,但只授予组成员和其他用户读取权限:
递归地为文件所有者设置读、写和执行权限,而为目录上的所有其他用户设置无权限:
要将2022-2-20目录中所有文件和子目录的权限设置为 755,例如,键入:
chmod命令代码C/C++实现
要使用 chmod 设置权限,我们需要告诉它:
- Who:我们为谁设置权限。
int who(void)
{
register int m = 0;
for (;;) switch (*ms++) {
case 'u':
m |= USER;
continue;
case 'g':
m |= GROUP;
continue;
case 'o':
m |= OTHER;
continue;
case 'a':
m |= ALL;
continue;
default:
ms--;
if (m == 0)
m = ALL & ~um;
return m;
}
}
- What:我们正在做什么改变? 我们是添加还是删除权限?
int what()
{
switch (*ms) {
case '+':
case '-':
case '=':
return *ms++;
}
return(0);
}
- where:我们设置了哪些权限?
int where(register int om)
{
register int m = 0;
switch (*ms) {
case 'u':
m = (om & USER) >> 6;
goto dup;
case 'g':
m = (om & GROUP) >> 3;
goto dup;
case 'o':
m = (om & OTHER);
dup:
m &= (READ|WRITE|EXEC);
m |= (m << 3) | (m << 6);
++ms;
return m;
}
for (;;) switch (*ms++) {
case 'r':
m |= READ;
continue;
case 'w':
m |= WRITE;
continue;
case 'x':
m |= EXEC;
continue;
case 's':
m |= SETID;
continue;
case 't':
m |= STICKY;
continue;
default:
ms--;
return m;
}
}
我们使用指标来表示这些值,并形成简短的“权限声明”,例如 u+x,其中“u”表示“用户”(who),“+”表示添加(what),“x”表示执行权限 (where)。
- 代码运行结果
总结
chmod 命令修改文件的权限。 可以使用符号或数字模式来设置权限。更多了解,请参考官方文档。
欢迎关注微信公众号【程序猿编码】,需要chmod命令完整源码的添加本人微信号(c17865354792)