4 权限管理与root管理员
权限
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组后,也可以读写串口来进行通信了。
除非对root用户有明确规定,否则root用户享有rwx的完整权限。
比如上面的串口,root用户就不享有可执行权限。
越级行使权力–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权限,尤其对于新手来说,很容易因为指令的输错导致系统关键文件权限被修改,最后操作系统各种报错甚至无法启动,反而怪罪别人给的指令是错的。
修改文件权限的时候,务必遵循以下原则:
-
最小化。只赋予必须的权限,只修改必要的文件,不要随意使用通配符*将所有的文件都修改权限。
-
修改时三思。深入理解2、3、4三个章节的内容,确定自己所处的目录,弄清指令即将操作的对象,避免修改关键性文件。
-
及时备份。 一旦修改了关键性文件,系统损坏后极难抢救,此时最佳建议是重装系统或者恢复操作系统镜像。因此要留好备份以防万一。