一、Linux 下的用户分类
- 超级管理员:root,只有一个,不受约束,命令行提示符是 #
- 普通用户:可以有多个,受权限约束,命令提示符是 $
su [用户名]
功能:切换用户
su (省略 root),在同一个 bash 下切换身份为 root
su - ,目录也会切换为 /root,让 root 进行重新登录
普通用户户切换为其他普通用户或者 root,需要其密码
root 切换为其他用户,不需要密码(root 不受约束)
需要将用户加入信任列表,才可以使用 sudo 命令,对单条指令进行提权
sudo 命令
功能:以 root 身份执行该命令
二、Linux 文件权限
1. 文件的三种权限
- r: 可以用 cat、more、less等指令读取文件的内容
- w:可以用 echo 和 重定向、nano等指令向文件写入内容
- x:可以执行文件
2. 文件访问者的分类
- 文件拥有者:创建该文件的用户
- 文件所属组:和文件拥有者属于同一个组
- 文件的 other:不是创建该文件的用户
3. Linux 文件类型
通过 ls -l 命令,可以查看当前目录下的子目录和文件的详细信息
-bash-4.2$ ls -l
drwxrwxr-x 4 al al 4096 Jan 3 22:25 dir
-rw-rw-r-- 1 al al 136 Jan 3 19:30 my.txt
在 Linux 系统中,是通过文件详细信息第一列的第一个字符来区分文件类型的
有如下文件类型
-:普通文件(代码源文件,文本文件,HTML文件等)
d:文件夹
l:软链接(类似Windows的快捷方式)
b:块设备文件(例如硬盘、光驱等)
p:管道文件
c:字符设备文件(例如键盘、屏幕等串口设备)
s:网络套接口文件
在 Linux 系统中,不会通过文件后缀来区分文件类型
例如:将 C语言代码编译后生成的 a.out 文件,改名还是可以运行的
-bash-4.2$ touch test.c
-bash-4.2$ ls
test.c
-bash-4.2$ nano test.c
-bash-4.2$ cat test.c
#include <stdio.h>
int main()
{
printf("hello Linux\n");
return 0;
}
-bash-4.2$ gcc test.c
-bash-4.2$ ls
a.out test.c
-bash-4.2$ ./a.out
hello Linux
-bash-4.2$ mv a.out a.txt
-bash-4.2$ ls
a.txt test.c
-bash-4.2$ ./a.txt
hello Linux
但是 Linux 上的一些软件是通过文件后缀来区分文件类型的
例如:将C语言代码的文件后缀改为 txt,gcc 编译便会报错
-bash-4.2$ ls -l
total 4
-rw-rw-r-- 1 al al 72 Jan 7 14:50 test.c
-bash-4.2$ gcc test.c
-bash-4.2$ ls -l
total 16
-rwxrwxr-x 1 al al 8440 Jan 7 14:53 a.out
-rw-rw-r-- 1 al al 72 Jan 7 14:50 test.c
-bash-4.2$ rm a.out
-bash-4.2$ ls -l
total 4
-rw-rw-r-- 1 al al 72 Jan 7 14:50 test.c
-bash-4.2$ mv test.c test.txt
-bash-4.2$ ls -l
total 4
-rw-rw-r-- 1 al al 72 Jan 7 14:50 test.txt
-bash-4.2$ gcc test.txt
test.txt: file not recognized: File format not recognized
collect2: error: ld returned 1 exit status
4. 文件属性
为什么文件的详细信息中没有 other 属性?
不是拥有者,不是所属组的人就是 other,因为 other 人太多了,所以 Linux 不记录文件的 other 属性
三、修改文件权限
只有文件的拥有者和 root 才可以修改文件的访问权限
chmod [参数] 文件
功能:更改文件的访问权限
- + 向权限范围增加权限代号所表示的权限
- - 向权限范围取消权限代号所表示的权限
- = 向权限范围赋予权限代号所表示的权限
用户符号:
- u:拥有者
- g:所属组
- o:其它
- a:所有人
chmod 可以修改一个或多个人的一个或多个权限
-bash-4.2$ ls -l
total 4
---------- 1 al al 72 Jan 7 14:50 test.txt
-bash-4.2$ chmod u+rw,g+r,o+r test.txt
-bash-4.2$ ls -l
total 4
-rw-r--r-- 1 al al 72 Jan 7 14:50 test.txt
也可以用三位的 8 进制数表示权限,三个字母为一组,并且每一组中的每一位只有两种情况,可以理解为有权限代表 1,没有权限代表 0,因此可以将每一位看做二进制位,三位作为一个 8 进制位
chmod xxx 文件
-bash-4.2$ chmod 000 test.txt
-bash-4.2$ ls -l
total 4
---------- 1 al al 72 Jan 7 14:50 test.txt
-bash-4.2$ chmod 664 test.txt
-bash-4.2$ ls -l
total 4
-rw-rw-r-- 1 al al 72 Jan 7 14:50 test.txt
在更改文件的拥有者和所属组时,需要得到别人的同意,但是客观条件下不可能得到别人的允许,所以只能强制给别人,因此只有 root 可以改变文件的拥有者和所属组
chown 用户名 文件
功能:修改文件的拥有者
chown 用户名:用户名 文件
功能:修改文件的拥有者和所属组
chgrp 用户名 文件
功能:修改文件的所属组
file 文件或目录
功能:辨识文件类型
可以根据文件内容来辨识文件类型
列如:我在 file.txt 中写了c代码
-bash-4.2$ file file.txt
file.txt: C source, ASCII text
-bash-4.2$ cat file.txt
#include <stdio.h>
int main()
{
printf("hello\n");
return 0;
}
四、目录权限
- r:必须同时拥有 x 权限,才能正常显示目录下的子目录和文件信息,否则只能显示文件名
- w:必须同时拥有 x 权限,才能在目录下新建或删除文件,或者修改文件属性
- x:可以在目录下执行命令,如 cd 进入目录
五、默认权限
为什么创建的普通文件(不包括可执行文件)的默认权限是 664,而创建的目录的默认权限是 775(不同的操作系统默认权限可能不一样)
-bash-4.2$ touch my.txt
-bash-4.2$ mkdir my
-bash-4.2$ ls -l
total 4
drwxrwxr-x 2 al al 4096 Jan 7 15:04 my
-rw-rw-r-- 1 al al 0 Jan 7 15:03 my.txt
因为系统用权限掩码 umask 屏蔽了起始权限
起始在 Linux 系统中,普通文件的起始权限被设置为 666,目录的起始权限被设置为 777
但是系统为了更好的控制文件权限,会通过权限掩码(umask),对起始权限做处理
掩码:在 1010 1011 中提取后四位,可以这样做 1010 1011 & 0000 1111,0000 1111 就被称作 掩码
权限掩码:在起始权限中,去掉在 umask 中出现的权限,并且不能影响其他任何权限
因此 默认权限 = 起始权限 & (~umask)
umask
功能:查看umask
umask 0005 第一位不管
功能:修改 umask
六、粘滞位
背景:在使用 Linux 时,未来可能会让 root 创建一些共享目录,用来保存普通用户产生的临时数据,普通用户可以选择不放开文件的权限,也可以选择放开文件的权限,让其他普通用户可以对该文件进行操作,因此共享目录的 other 权限(r:让普通用户可以查看共享目录下有哪些文件,w:让普通用户可以在共享目录下新建或删除文件,或者修改文件的属性(文件名,权限等),x:让普通用户可以进入该共享目录)必须是放开的,即使在共享目录下,普通用户之间也会受到权限的约束,那么会存在这种情况,张三在共享目录下创建了一个文件,突然有一天,张三不想给其他普通用户(李四)提供权限时,李四就无法操作该文件,但是由于目录的 w 和 x 权限一定是放开的,那么李四就可以把张三的文件给删了(你不给我权限,那我就把你的文件删了),这很不合理,于是为了让普通用户之间可以共享文件,并且还要防止其他普通用户删我的文件,就有了粘滞位的概念
只能给目录添加粘滞位:因为问题产生的原因是目录
chmod +t 目录
功能:给指定目录添加粘滞位
加了粘滞位的目录,只有该目录的 other 权限的 x 权限会变成 t
具有粘滞位的目录,只有 root,文件拥有者,目录拥有者、所属组(一般都是 root)才可以删除该文件