对于Linux权限的讲解,对于指令的运行原理、Shell命令和运行原理让我们体会到权限的作用,对于用户分类讨论(root/普通用户),通过ll指令展开文件属性,对于文件权限的认识,权限的修改chmod,改变文件所有组chgrp,改变文件所有者chown,最后由初始化文件权限,认识到umask(可以查看/修改文件掩码),原来文件的初始化是要经过文件掩码之后的数值,最后由共享目录引入粘滞位(-t)观念, -t 是特殊的-x可执行权限,有 -t 的目录不能删除非所有者的文件,保护的共享,保护了大家!!!
对于前文基本的常用指令,我们应该熟悉使用,我们下面简单的理解一个概念,指令的运行原理是什么
指令运行原理
1.输入指令的过程,本质上是输入字符串
2.指令的本质,就是编译好的程序和脚本,在一定系统的特定路径下存放,如:/usr/bin
我们可以通过find/which/whereis指令查找到指令所在的文件位置
find不只是查找指令,主要是查找目录下指定的文件,将适合的文件输出
which专门查找指令所在路径位置的(从/usr/bin下查找),如 which ls,会显示出ls指令所在的位置
whereis是介于find和which之间的,可以查找指令加上相关的安装包、man信息等
alias指令(指定指令的别名)
为系统内置指令指定别名,如:alias ac='ls',那么输入ac,就会调用ls指令
所有指令实际上即使脚本或者可执行程序
对于Linux来讲,这是一种操作系统,我们称为linux核心,但是对于我们这样的用户,不能直接使用核心,所以我们需要一定的凭借,牵线搭桥,让我们的想法指令来和linux的核心进行交互
为什么我们这些普通用户并不能直接使用核心呢?
这是因为,我们的所有指令最终是要在操作系统内部运行,但是操作系统使用的难度比较高,不适合我们直接和操作系统沟通,所以我们创建了一座桥 “ Shell” 来帮助我们和操作系统进行沟通
Shell定义
Shell是命令行解释器
- 将使用者的命令翻译给核心(kernel)处理。
- 同时,将核心的处理结果翻译给使用者。
存在的意义
所以Shell方便了用户,也保护了操作系统(核心)
Linux上只要两类用户,root(超级用户)和普通用户
权限区别
创建方式
用户切换方式
Linux下的所有用户,都要有密码,无论是root还是其他,即便是多个普通用户,也都要设置密码,但是建议root的密码要和普通用户密码不一样
提权
提权意思是,将普通用户的权限放大,使用类似root用户的权限来实现某些指令,比如安装git的时候
使用指令 yum install -y git 在普通用户下不能安装,我们需要提权,使用关键字sudo
权限:一件事情是否被允许去做
认识文件
Linux下一切皆文件,那么我们通过ll/ls -l指令显示的那些文件第一列的内容到底说明什么意思呢?
首先告诉你的是,这是文件的权限(读取、写入、访问等)
文件类型
- d:文件夹
- -:普通文件
- l:软链接(类似Windows的快捷方式)
- b:块设备文件(例如硬盘、光驱等)
- p:管道文件
- c:字符设备文件(例如屏幕等串口设备)
- s:套接口文件
目前阶段常遇到的是普通文件(-)和目录(d)
基本权限
- 读(r/4):Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限
- 写(w/2):Write对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限
- 执行(x/1):execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限
- “ - ”:表示不具有该项权限
r=4,w=2, x=1 这是因为将rwx=111,这是对应的二进制的结果,我们为了更加方便使用这个权限,那么将二进制转换成八进制,使得rwx=7,r--=4诸如此类
chmod可以对于文件的权限进行更改,使用方法有两三种,但是都是离不开rwx
语法
chmod [ 选项 ] 权限 文件名
常用选项
R 递归修改目录文件的权限
只有文件的所有者和root用户才能改变文件的权限
1.使用ugoa
上文可知,u表示的是user(所有者),g表示的是group(所有组),o表示的是(其他成员)a表示的是所有成员
chmod u+r,g+w,o-x test.txt
chmod u=rwx test.txt(连续的ugo的使用需要加上逗号)
使得test.txt文件的权限改变,所有者加上了可读,所有组加上了可写,其他用户加上了可执行权限
2.使用八进制
我们知道对应权限的八进制的大小,所以可以通过八进制来表示所有者、所有组、其他用户对于该文件的权限
chmod 777 test.txt
---------- 1 root root 1492 May 15 18:25 test.txt
-rwxrwxrwx 1 root root 1492 May 15 18:25 test.txt
如果本身就有这个权限了,再加上还是那个权限,不会发生变换。如rw- 加上 r 还是rw-
对于目录,我们如果想让里面的文件和该目录都成一样的权限
chmod -R 777 test
功能:更改文件的所有者
语法格式:chwon [ 选项 ] 用户名 文件名
常见选项:
-R 对于目录以及里面的文件进行递归修改所有者
chown -R user1 test 将test目录下的所有文件以及该目录的所有者更改为user1
常见用法:
chown user1 test
功能:修改文件或者目录所在的组
**语法格式:chgrp [ 选项 ] 用户组名 文件名 **
常用选项:
-R 递归修改文件或者目录所在的所有组
chgrp group1 test
chgrp -R group1 test
我们创建一个文件or目录的时候,有没有注意到,都是一样的初始权限
- 对于一个普通文件,我们需要的基本权限是可读可写(可执行程序有可执行权限),所以我们创建一个普通文件的时候,一般都是rw- ,这样看来应该是rw-rw-rw-,但是实际上显示的是rw-rw-r—
- 对于一个目录来讲,可读使得我们可以查看目录里面的内容,可写使得我们可以在目录中创建or删除文件,可执行使得我们能进入文件,所以初始目录权限应该为rwxrwxrwx,但是实际为rwxrwxr-x
假设默认权限是mask,则实际创建的出来的文件权限是: mask & ~umask
umask可以查看或者修改文件掩码
语法:
umask 755 设置权限值
umask 查看掩码值
新建文件默认权限0666
新建目录默认权限0777
& 位运算,有0则为0
超级用户默认掩码值为0022,普通用户默认为0002
计算过程:
//如果是创建文件 且是普通用户0002----000 000 010
110 110 110 666
111 111 101 (反码)
------------------
110 110 100 664
//超级用户 0022 换成八进制,也就是 000 010 010
去掉第一位0 然后后面三位是分别对应所有者、所有组、其他成员
110 110 110 666
111 101 101 (反码)
------------------
110 100 100 644
权限掩码:凡是在umask中出现的权限,不会再最终的文件权限中出现
最终权限=起始权限 &(~umask)
实际上将对应位置的数字进行相减就可以 如普通文件的0666 减去0002 自然就是0664 其中的664就是初始文件权限
功能: 辨别文件类型
语法:file [ 选项 ] 文件or目录
- -c 详细显示指令执行过程,便于排错或分析程序执行的情形。
- -z 尝试去解读压缩文件的内容
目录中的rwx和文件的rwx在某些方面上是有区别的
文件权限
文件
r就是可以读取文件中的内容,w是可以在文件中写入和删除一些文本,x是可以打开这个文件
目录权限
我们知道我们的家目录权限为700,也就是说,只允许自己和root用户进入,那么我在自己家目录下创建的文件别人看不到
在工作中,为了多人使用同一个目录,想要多个用户进行文件数据的共享,我们创建的共享文件,不能在任何一个人的家目录下
可能又人说了,我们直接改变家目录的权限不久可以了吗?
实际上,我们是作为普通用户是无法改变家目录的权限的,只有root用户可以
解决共享方法:自行创建一个目录,但是这个目录会将其他用户拉进去这一个组中,因为共享,所以都要有rwx权限
上述方法,有一个缺陷,如果说我自己写了一个文件,别人某一天误触(bushi)删除了这个文件,我很生气,干了一架。为了避免这样的事情发生,我们有一下的解决措施(想法)
想法
- 我们将其他用户的w权限关闭 (但是关闭之后,那就不是共享了,失去了共享目录的意义)
- 能不能有一种方式既能保护这个文件又可以共享呢?
针对于上述问题,系统推出了粘滞位这一概念,作用为,保护了创建文件,又可以防止别人删除自己创建的文件(但是别人可以进入查看编辑)
功能:给目录设置,一般是共享目录,大家可以通过在目录进行各自文件的增删查改,只允许文件拥有者/root用户能删除这个文件,其他人一概不允许,-t是一种特殊的x权限
加上粘滞位
chmod +t 指定目录(共享目录)
有粘滞位的目录的特点
- 有粘滞位的目录中文件能被root删除
- 能被所有者删除
- 目录的可执行权限是表示你可否在目录下执行命令。
- 如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd 进入目, 即使目录仍然有-r 读权限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)
- 而如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读权限所以在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档。