文章目录
Linux权限
这里插入一个知识点:
Shell外壳:从原理上来说,Shell是Linux操作系统中的外壳程序,它扮演着"用户和Linux内核之间的桥梁"的角色。具体而言,Shell将用户输入的命令解析并传递给Linux内核处理,同时将Linux内核的处理结果翻译并返回给用户。因此,通过Shell,用户能够更加高效、安全、低成本地使用Linux内核。(我的理解是相当于操作系统的系统调用的功能)
Shell本质是一个执行起来的一个程序(进程),系统启动期间,一直存在。
查看该进程指令:
ps jax | grep bash
对于Shell来说,低风险、容易的指令可以自己执行,高风险、复杂的会创建一个子进程,交给子进程去执行。为什么要创建子进程去执行高风险指令?因为该指令可能会导致进程关闭(比如除0的指令),如果交给Shell主进程来执行,那么异常关闭的将会是Shell主进程,这将影响其他指令的执行。
这里我们来试验一下Shell创建子进程执行命令。
执行这段代码:先
vim proc.c
,再gcc proc.c
,再./a.out
c#include <stdio.h> #include <sys/types.h> #include <unistd.h> int main(){ printf("我的pid:%d\n",getpid()); printf("我的父进程pid:%d\n",getppid()); return 0; }
执行结果:我们发现当前进程
id
为21932
,父进程id
为8231
。我们再来查看Shell主进程
id
,指令为:ps ajx | head -a && ps ajx | grep 8231我们看到确实是Shell主进程id为
8231
,也就是id
为21932
进程的父进程,即Shell确实是创建了子进程来运行某些指令。
1、Linux用户
- Linux下有两种用户:超级用户(root)、普通用户。
超级用户:可以再linux系统下做任何事情,不受限制
普通用户:在linux下做有限的事情。
超级用户的命令提示符是"#",普通用户的命令提示符是"$"。
-
命令:su [用户名]
-
功能:切换用户
-
举例 :
su xp
。其中,如果普通用户想切换为root用户,直接使用指令su
就行了,不用加root用户名,或者使用指令su -
,需要注意的是这个指令执行之后需要输入root用户的密码。但是如果是root用户切换为普通用户,直接输入su [用户名]
,不用输入密码。普通用户切换为普通用户也需要密码。
普通用户不切换用户但是想用root权限则使用sudo命令:
格式:在命令前面加上sudo
举例 :
sudo cd dirb
这里我们发现:xp2不在sudoers文件中。说明我们想要sudo提权需要在sudoers中添加这个xp2用户,这个只能root用户才能操作(后面会讲)。
2、文件访问者的分类(人)
- 文件和文件目录的所有者:u --- User
- 文件和文件目录的所有者所在的组的用户:g --- Group
- 其它用户:o --- Others
3、文件类型和访问权限(事物属性)
-
文件类型:
-
d:文件夹
-
-:普通文件
-
l:软链接(类似Windows的快捷方式)
-
b:块设备文件(例如硬盘、光驱等)
-
p:管道文件
-
c:字符设备文件(例如屏幕等串口设备)
-
s:套接口文件
-
-
基本权限:
- 读(r/4):Read对文件而言,具有读取 文件内容的权限;对目录来说,具有浏览该目录信息的权限
- 写(w/2):Write对文件而言,具有修改 文件内容的权限;对目录来说具有删除移动目录内文件的权限
- 执行(x/1):execute对文件而言,具有执行 文件的权限;对目录来说,具有进入目录的权限
- "-":表示不具有该项权限
-
权限是约束人的,对应的操作对象,一定要有对应的满足人的需求的属性。如:我们只能在leetcode写算法题,不能在leetcode刷短视频;我们只能在抖音刷短视频,不能在抖音写算法题。
4、文件权限值的表示方法
-
字符表示方法:
Linux表示 说明 Linux表示 说明 r-- 仅可读 -w- 仅可写 --x 仅可执行 rw- 仅可读写 -wx 仅可写和执行 r-x 仅可读和执行 rwx 可读可写可执行 --- 不可读不可写不可执行 -
8
进制数值表示方法:权限符号(读写执行) 八进制 二进制 r 4 100 w 2 010 x 1 001 rw 6 110 rx 5 101 wx 3 011 rwx 7 111 --- 0 000
5、文件访问权限的相关设置方法
5.1、chmod
-
格式:chmod [选项] 权限 文件名
-
功能:设置文件的访问权限
-
选项:
- R -> 递归修改目录文件的权限
- 说明:只有文件的拥有者和root才可以改变文件的权限
-
chmod命令权限值的格式:
-
用户表示符+/-=权限字符:
- +:向权限范围增加权限代号所表示的权限
- -:向权限范围取消权限代号所表示的权限
- =:向权限范围赋予权限代号所表示的权限
- 用户符号:
- u:拥有者
- g:拥有者同组用
- o:其它用户
- a:所有用户
-
举例 :
chmod -R u+rwx,g+rwx,o+rwx dirb
-
三位8进制数字:
每个用户权限表示范围:000~111 即0~7
所以总的范围为:000~777
可以看上述8进制数值表示方法。
-
举例:
chmod -R 750 dirb
-
-
5.2、chown
-
功能:修改文件的拥有者
-
格式:chown [选项] 用户名 文件名
-
常用选项:-R --- 递归修改此目录下所有文件的拥有者
-
举例 :
sudo chown -R xp test_dir
,非root用户需要sudo提升权限操作。
5.3、chgrp
-
功能:修改文件或目录的所属组
-
格式:chgrp [选项] 用户组名 文件名
-
常用选项:-R 递归修改文件或目录的所属组
-
举例 :
sudo chgrp -R xp test_dir
5.4、umask
-
功能:查看或修改文件掩码。
- 新建文件 默认权限 =
0666
- 新建目录 默认权限 =
0777
- 但实际上你所创建的文件和目录,看到的权限往往不是上面这个值 。原因就是创建文件或目录的时候还要受到
umask
的影响。假设默认权限是mask
,则实际创建的出来的文件权限是:mask & ~umask
。
- 新建文件 默认权限 =
-
格式:
- umask:查看当前用户的权限掩码
- umask 权限码:设置当前用户的权限掩码
-
说明 :将现有的存取权限减去 (这里不是单纯的减法,而是对应权限位去除1。如原权限是0666,每个位转换为三位的二进制即为
000110110110
,若权限掩码为0002
,那么权限掩码转换为000000000010
,所以就是把原权限位的倒数第二个二进制位置为0,即y原权限变为000110110100
,每三位转换为8
进制即0664
。注意,如果原权限对应的权限掩码的二进制位为0
,则不进行去除,保持为0
,即不是单纯的减法。)权限掩码后,即可产生建立文件时预设权限。超级用户默认掩码值为0022
,普通用户默认为0002
。所以普通用户默认新建文件后的权限码为0664
,新建目录后的权限码为0775
。 -
举例 :
umask
和umask 003
和umask 004
6、file指令
-
功能:辨识文件类型
-
格式:file [选项] 文件或目录
-
常用选项:
- -c 详细显示指令执行过程,便于排错或分析程序执行的情形。
- -z 尝试去解读压缩文件的内容。
-
举例 :
file a.out
7、目录的权限
这里修改权限可以用之前的
chmod
,修改所有者使用chown
,修改所属组使用chgrp
。
-
可执行权限:如果目录没有可执行权限, 则无法cd到目录中。
-
可读权限:如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容。
-
可写权限 :如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件。
换句话来讲, 就是只要用户具有目录的写权限, 用户就可以删除目录中的文件, 而不论这个用户是否有这个文件的写
权限。比如,属于xp的目录文件,如果xp2有w的权限,就可以把这个目录里面的文件删除!
那么问题来了,怎么解决这个问题?有人会说,把这个
other
的权限设置为没有w
权限。但是有些情况是有些文件需要团队共同编写的,那么其他人都创建不了文件。这样治标不治本。所以引入了粘滞位。
8、粘滞位
-
功能:防止其他用户删除自己的文件
-
格式:chmod +t 或者 chmod o+t
-
说明:当一个目录被设置为"粘滞位"(用chmod +t),则该目录下的文件只能由
-
一、超级管理员删除
-
二、该目录的所有者删除
-
三、该文件的所有者删除
-
-
举例:
那么好,Linux权限就到这里,如果你对Linux和C++也感兴趣的话,可以看看我的主页哦。下面是我的github主页,里面记录了我的学习代码和leetcode的一些题的题解,有兴趣的可以看看。