Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel)“ ,但我们一般用户,不能直接使用kernel。而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。
从技术角度, Shell的最简单定义:命令行解释器(command Interpreter)主要包含:
1. 将使用者的命令翻译给核心(kernel)处理。
2. 将核心的处理结果翻译给使用者
对比windows GUI,我们操作windows 不是直接操作windows内核
,而是通过图形接口,点击,从而完成我们的操作
(比如进入D盘的操作,我们通常是双击D盘盘符.或者运行起来一个应用程序)。
shell 对于Linux,有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核。反馈结果在通过内核运行出结果,通过shell解析给用户
。
实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。当我们输入一些非法指令时候,shell会拒绝执行,所以它可以帮助我们保护操作系统。其实一般而言,shell本身并不执行对应的指令。而是通过派生子进程
的方式执行用户输入的指令。这么做其实也是为了保护shell。其实Windows的图形化界面。本质上也是一种外壳程序。
帮忙进行命令行传递和返回结果
保护操作系统
Linux下有两种用户:超级用户(root)和普通用户。那么,超级用户和普通用户分别又有什么不同,他们之间又有着什么样的关系呢?
超级用户: 可以再linux系统下做任何事情,不受限制
普通用户: 在linux下做有限的事情。
超级用户的命令提示符是“#”,普通用户的命令提示符是“$”
su 指令
命令:su [用户名]
功能:切换用户
例如,要从root用户切换到普通用户user,则使用 su user。 要从普通用户user切换到root用户则使用 su root(root可以省略),此时系统会提示输入root用户的口令
这里我们需要注意的是如果我们要是普通用户切换成root用户时,su 后面的root可以省略。同时,如果我们想要再次切换回我们原来的用户,那么可以按键盘上的 Ctrl + D
键来切换回去,或者输入指令:su 用户名
来完成。
Linux下的文件访问者可以分为以下三类:
文件拥有者:文件和文件目录的所有者: u—User
文件所属组:文件和文件目录的所有者所在的组的用户: g—Group
other: 其他用户,除了拥有者和所属组之外的用户称为other
对于文件拥有者和其他用户这两者都很好理解,那么什么是文件所属组呢?
如图所示,假定公司要求做一个产品,并打话考核一下A、B两个小组,且两个小组所做的工作是一模一样的,A组创建了一个目录A_code,B组创建了一个目录B_code,在这里如果张三写好了一个模块,且只开放给组内的成员看,那么作为同为一个组的成员的王五就可以看到他所写的内容,但是另一个小组的李四则看不到他所写的内容,所以,这样看来,A组就相当于文件所属组,其他组的用户是无法访问张三所写的内容的。
当我们用ll
指令来显示我们所在的用户下的所有文件详细信息时,就会发现有着好多文件信息的标志。
但是我们有没有发现,最前面还有10个字符呢,那么最前面的10个字符又是什么意思呢?
drwxrwxr-x
其实前10个字符代表了文件的属性,每一个字符都是有他的意义所在的,首先第一个字符就代表了文件的类型。那么在Linux操作系统中,不使用文件的后缀来区分文件类型的,而是用文件属性中的第一列中的第一个字符
来区分文件的类型。
在这里我们可以来看一个有趣的事情:
(一)我们先创建一个名字为test.c的文件。然后在里面写一个简单的C语言代码来打印 hello world
,然后我们修改一下这个可执行程序a.out
的后缀名,然后再来运行一下。
(二)在这里我们可以发现程序仍然可以运行。这里我们就可以证明了在Linux中文件类型和后缀名是没有关系的。
(三)如果我们要是把源文件的后缀名改了的话,然后再使用gcc这个编译器去编译的话就会发现编译不通过会报错,这又是什么原因呢?
其实原因也很简单,因为gcc是Linux中安装的一款软件,这款软件在进行编译的时候,他会通过文件后缀名来识别文件类型。在这里我们可以把Linux文件的后缀看成是文件名的一部分,因为我们可以根据文件名来判断文件的类型。
Linux中常见的文件类型
d: 文件夹
-: 普通文件
l: 软链接(类似Windows的快捷方式)
b: 块设备文件(例如硬盘、光驱等)
p: 管道文件
c: 字符设备文件(例如屏幕等串口设备)
s: 套接口文件
file指令
命令:file [选项] 文件或目录
功能:辨识文件类型
常用选项:
-c 详细显示指令执行过程,便于排错或分析程序执行的情形。
-z 尝试去解读压缩文件的内容。
下面我们来看一下file指令的用法:
刚才我们已经介绍了Linux下文件的类型,第1个字符代表的是文件的类型,那么我们现在再来看一下后9个字符所代表的含义吧。他们所代表的含义和文件权限又有什么样的关系呢?
文件自身具有的权限属性具有四种,r
、w
、x
和-
。这四种属性的含义如下所示:
r
(读)—— Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限w
(写)—— Write对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限x
(执行)—— execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限-
——表示不具有该项权限
这里我们把后9个字符分为了三组,前三列表示的是拥有者权限,中间三列表示的是所属组权限,最后三列表示的是other权限。
chmod指令: 修改拥有者、所属组、和other的相关权限
功能:设置文件的访问权限
格式:chmod [参数] 权限 文件名
other: R -> 递归修改目录文件的权限
说明:只有文件的拥有者和root才可以改变文件的权限
chmod命令权限的格式:
chmod 用户符号 +/-=权限字符
- +:向权限范围增加权限代号所表示的权限
- -:向权限范围取消权限代号所表示的权限
- =:向权限范围赋予权限代号所表示的权限
- 用户符号:
u:拥有者
g:拥有者同组用
o:其它用户
a:所有用户
下面我们来举几个例子:
(一)给拥有者 + 可执行x
的权限
(二)对全部用户都 - r
的权限
3位八进制数字修改文件权限:
这里我们可以使用三位八进制数字来修改文件的权限,三位数字按照顺序分别表示拥有者、所属组、other的权限。
在这里我们需要知道的是这三位八进制数字中的每一个数字都是由相应的三个二进制数字转换而来的。
比如说:拥有者具有1 0 0
这三个二进制数字,他所代表的八进制数字就是4,表示拥有者仅仅具有读(r
)文件的权限;所属组具有0 1 0
这三个二进制数字,他所代表的八进制数字就是2,表示所属组仅仅具有写(w
)文件的权限;other具有0 0 1
这三个数字,代表的八进制数字是1,表示了other仅仅具有执行(x
)文件的权限。
那我们就可以用指令将这三个数字连接起来(421)给文件赋予权限。
这里我们来总结一下分别总结一下r w x
的权值:
读取权限(
r
)=> 4
写权限(w
)=> 2
执行权限(x
)=> 1
权限值的总和,即在三个段中的每一个中的读取,写入和执行,都占给定文件或目录的完整权限。
chown指令
命令:chown [参数] 用户名 文件名
功能:修改文件的拥有者
chown指令的作用是修改文件的拥有者,这里我们先来演示一下:
这里我们打话将cjl.txt
这个文件的拥有者从Chenjiale改为Chenyuhang发现并不能修改成功,其实这也是显而易见的,因为就算在生活中我们要将一个东西给别人的时候也得经过别人同意。
当然Linux中也是这样的,既然我们普通用户无法将文件拥有者修改,当然了,我们还有root呢,root在Linux中就充当的是超级管理员的身份,他是可以强制帮我们将文件管理者修改。
这里我们可以看到,当我们用su指令
切换成root身份时,就可以很轻松的将文件拥有者修改掉了。
chgrp指令
命令:chgrp [参数] 用户组名 文件名
功能:修改文件的所属组
常用选项:
-R 递归修改文件或目录的所属组
同样的如果我们打话将文件所属组修改也必须要用su
指令来切换成超级管理员的身份来修改。
当然了我们也可以将chown和chgrp这两个指令连在一起用:用法为,sudo chown 用户名:用户名 filename
。
这里我们需要注意的是:这些权限约束的是普通的用户,对于root而言,是不受这些权限的约束的。
umask指令
命令:umask
功能:查看或修改文件掩码
常用选项:
umask 权限值
umask指令的作用是查看或修改文件掩码,新建文件夹默认权限=0666
,新建目录默认权限=0777
但实际上你所创建的文件和目录,看到的权限往往不是上面这个值。原因就是创建文件或目录的时候还要受到umask的影响。假设默认权限是mask,则实际创建的出来的文件权限是: mask & ~umask
。
目录的三种权限分别有不同的功能:
可读权限(
r
):如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容
可写权限(w
):如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件
可执行权限(x
): 如果目录没有可执行权限, 则无法cd到目录中
这里我们一定要注意如果如果要是一个目录没有了可执行权限x
,那么将不能进入该目录,并且也无法查看该目录下的文件信息。
背景
在使用Linux的时候,未来可能会有一些共享目录,被普通的用户共享,用来保护普通用户产生的临时数据。
但是在这里是有一个问题的:也就是说共享的文件是可以被别人随便删除的,想要文件不被人删除,我们可以将该共享目录的w
权限给关闭,但是如果要是将w
权限关闭,那么别的用户将也无法在这个目录下创建文件,那这个文件就达不到共享的目的了。所以为了解决这一问题,就有了粘滞位
这一概念。
我们先在root用户下创建一个共享文件夹public
,然后A用户先在其中创建一个test.c
的文件,然后把other的r
权限关掉,然后B用户去读该文件时,发现不能够读,但是B用户去删除的时候却发现可以成功。
为了让大家共享文件且用户创建的文件不能被随意删除。这里引入了粘滞位
,那么下面我们来演示一下粘滞位的用法:
root用户下: chmod +t public
,这样我们就成功给public文件夹设置了粘滞位。
当我们设置好粘滞位后,除了root这个超级管理员外,就发现别人想要删除我们的文件夹时,是删不掉的了。