权限

Linux有严格的权限等级,对于越级的操作,是一律禁止的。如果系统关键文件的权限错误,可能导致部分功能、程序无法使用,甚至是系统无法启动。

文件的权限分为三个方面,分别是读(read,r)、写(write,w)与可执行(execute,x),分别用r、w、x表示。如果有读取权限,则r=1,否则r=0,其他同理。

将rwx的数字连起来,就可以组成类似000、001、010之类的二进制数字,转换成十进制就是0~7,所以0~7八个数字就能准确表示一个文件的权限状态。

读取 写入 可执行 符号表示 二进制表示 数字表示 权限说明
- - - - - - 000 0 这个文件不接受任何操作
- - - - x 001 1 这个文件可执行,但不能修改和查看,一般是受保护的程序
- - - w - 010 2 文件可修改,但不能读取和运行
- - w x 011 3 文件可以修改、运行但不能读。
- - r - - 100 4 只读文件
- r - x 101 5 只读文件且可执行,一般是受保护的程序
- r w - 110 6 可读写和修改的文件,一般是文档或配置文件,创建的文件默认是这个状态
r w x 111 7 可读写、执行,可以被一切操作

上面表格中的“符号表示”,将会方便我们以后查看某个文件的具体权限情况;“数字表示”列会方便我们修改某个文件的权限。

查看文件的权限可以使用 ls -l查看。

用户和组

Linux是一个多用户操作系统,我们可以创建多个用户,同时在这个系统中进行操作。为了方便统一管理用户的权利范围,这些用户将会被纳入不同的组。默认情况下,用户属于的“组”与该用户同名。用户只能【属于】一个组,但可以【加入】不同的组以获得不同的权限。

root用户和root组是一个特殊的存在,类似于Windows系统中的Administrator管理员的存在,但拥有的权力更大,大到足以毁灭系统本身的程度。因此,普通用户是无法行使管理员的权力,需要借助其他工具,这个后面说。

查看文件的权限

上面讲到权限的三个方面:读、写、可执行,组成一个0~7的数字,但当我们使用ls -l指令查看某个文件权限的时候,发现不止三位,而是有10位。其中第一位是文件的性质标识,表示它是文件(-)、文件夹(d)或者其他情况。我们关注接下来的9位代码。

文件的权限是面向三个对象的,9位权限代码分别对应的所有者、所属组和其他人

对于文件的所有者和所属组,严格按照权限代码行使权力。举个例子🌰:

  unk@test-PC:~$ ls  -l  /dev/ttyS0
crw-rw---- 1 root dialout 4, 64 9月  19 06:22 /dev/ttyS0
  

上面是操作系统里面的串口对应的文件,可以看到它是属于root用户,属于dialout组,两者都有读写权限。而其他人不可访问这个串口。即root用户可以打开并使用串口进行通信,但普通用户是打开不了、使用不了的。当普通用户加入了dialout组后,也可以读写串口来进行通信了。

越级行使权力–sudo 提权

当一个文件或者程序权限限制或者所有者限制,导致我们不能修改或执行的时候,通常就需要“提权”,即提升当前操作的权限等级至root,以实现某些功能。

提权的方法很简单,利用上2-命令行与终端中提及的指令前缀sudo即可,一般情况下输入当前用户密码即可完成提权和执行。这个提权仅对这一行指令有效。

下面对于文件和程序,分开举例。

文件属于root,普通用户没有权限

  unk@test-PC:~$ ls  -l  /var/log/messages 
-rw-r----- 1 root adm 1404442 9月  19 06:52 /var/log/messages
# 可以看到,文件属于root用户,有读写权限;而其他用户没有任何权限

unk@test-PC:~$ cat /var/log/messages 
cat: /var/log/messages: 权限不够
# 查看文件肯定是失败的,提示是【某某文件: 权限不够】
# 有的时候是英文提示【some file: Permission Denied.】

# 如果要查看这个文件,必须要提权:
unk@test-PC:~$ sudo  cat  /var/log/messages
  

文件属于用户,但是只读的

  unk@test-PC:~$ ls -l ReadOnly.txt 
---------- 1 unk unk 26 9月  19 07:00 ReadOnly.txt
# 这个文件虽然属于普通用户,但是不可读写

unk@test-PC:~$ cat ReadOnly.txt 
cat: ReadOnly.txt: 权限不够

# 普通用户尝试读取,同样显示权限不够
# 但是我们使用sudo提权,就可以以root身份读取了
unk@test-PC:~$ sudo cat ReadOnly.txt 
这是一个只读文件
  

程序属于root,普通用户不能执行

  unk@test-PC:~$ ls -l run.sh 
-rwxrw-rw- 1 root root 39 9月  19 07:03 run.sh
# root用户可以执行,但是普通用户只能读写这个脚本文件

unk@test-PC:~$ ./run.sh
bash: ./run.sh: 权限不够

# 使用sudo提权执行,就可以运行了
unk@test-PC:~$ sudo ./run.sh
脚本执行成功!
  

特殊情况:root也没有权限

对于一些系统关键配置文件,root用户也是没有权限修改的,可能会造成程序不能运行乃至系统无法启动。这种情况,则不建议轻易修改文件内容,更不要按照后面的步骤去修改它的权限!

修改文件的权限

当一个文件的权限不满足需求的时候,我们可以修改它的权限。修改权限的指令是:

sudo chmod [目标权限] [-R] [目标文件]

参数[目标权限] 有两种主要的类型,第一种是使用三位0~7数字表示的,数字含义请参考前面的权限部分。比如777表示给所有用户和组赋予全部权限:sudo chmod 777 file

第二种是使用加减符号,加上权限的字母组合。比如’+x’表示添加可执行权限,’-wx’表示去除修改执行权限,让文件变成只读的。指令可以这样写sudo chmod +x start.sh

如果要操作的目标文件是一个文件夹,那么就需要考虑是否加上 ‘-R’参数了。sudo chmod 777 -R xxx。使用了-R参数后,文件夹及其子文件会被一起修改权限。否则,只有文件夹本身的文件被修改,子文件都保持原样。

文件权限修改的原则

虽然我们可以借助sudo工具随意使用和修改文件的权限,但是文件不能无脑赋予777权限,尤其对于新手来说,很容易因为指令的输错导致系统关键文件权限被修改,最后操作系统各种报错甚至无法启动,反而怪罪别人给的指令是错的。

修改文件权限的时候,务必遵循以下原则: