(1). Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。
(2). Shell 既是一种命令语言,又是一种程序设计语言。
(3). Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问 Linux 内核的服务。
(1). Shell 脚本(shell script),是一种为 shell 编写的脚本程序,一般文件后缀为 .sh。
(2). 业界所说的 shell 通常都是指 shell 脚本,但 shell 和 shell script 是两个不同的概念。
Shell 编程跟 java、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
Shell 的解释器种类众多,常见的有:
(1). sh - 即 Bourne Shell。sh 是 Unix 标准默认的 shell。
(2). bash - 即 Bourne Again Shell。bash 是 Linux 标准默认的 shell。
(3). fish - 智能和用户友好的命令行 shell。
(4). xiki - 使 shell 控制台更友好,更强大。
(5). zsh - 功能强大的 shell 与脚本语言。
Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel)“ ,但我们一般用户,不能直接使用kernel。而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。因为如果用户直接使用kernel的话,首先用户需要对操作系统非常熟悉才可以正确的使用操作系统,而且用户可能会烦一些错误,所以在操作系统kernel与用户之间就多了一层操作系统提供的shell外壳程序,外壳程序是用户和操作系统交互中间软件层,可以在一定程度上,起到保护操作系统的作用。
从技术角度,Shell的最简单定义:命令行解释器(command Interpreter)主要包含:
将使用者的命令翻译给核心(kernel)处理。
同时,将核心的处理结果翻译给使用者。
对于windows GUI,我们操作windows 不是直接操作windows内核,而是通过图形接口,点击,从而完成我们的操作(比如进入D盘的操作,我们通常是双击D盘盘符.或者运行起来一个应用程序)。
shell对于Linux,有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核。反馈结果再通过内核运行出结果,通过shell解析给用户。而Linux标准默认的 shell就是bash。
Linux下有两种用户:超级用户(root)、普通用户。
超级用户:可以再linux系统下做任何事情,不受限制
普通用户:在linux下做有限的事情。
超级用户的命令提示符是“#”,普通用户的命令提示符是“$”。
语法:su [用户名]
功能:切换用户。
例如,要从root用户切换到普通用户user,则使用 su user。 要从普通用户user切换到root用户则使用 su root(root可以省略),此时系统会提示输入root用户的密码。
需要注意的是如果从root用户直接su到user用户,此时不需要输入用户的密码,而且切换到user用户后此时所在目录还是刚刚root所在的目录。
如果从user用户直接su到root用户,则需要输入root用户的密码,而且切换到root用户后此时所在目录还是刚刚user所在的目录。如果使用su - 切换root目录,则切换后的root用户会在/root 目录下。
如果从一个user1用户直接su另一个user2用户,则需要输入user2用户的密码,而且切换到user2用户后此时所在的目录还是刚刚user1所在的目录。
ctrl+d通常代表着:『键盘输入结束(End Of File, EOF 戒 End OfInput)』的意思,但是也可以退出账户登录。
当我们使用 ls - l 指令显示出当前目录下文件的详细信息时。我们可以看到每个文件的详细信息,那么这些信息都分别表示文件的什么信息呢?
我们可以从每个文件信息的第一列信息开始看,下图中红色方框内的每一个文件的第一个信息其实代表了该文件为什么类型。Linux下不以文件后缀来区分文件类型。
d:文件夹
-:普通文件
l:软链接(类似Windows的快捷方式)
b:块设备文件(例如硬盘、光驱等)
p:管道文件
c:字符设备文件(例如屏幕等串口设备)
s:套接口文件
在Linux系统中,一个文件的访问者可以分为下面的三类用户。
文件和文件目录的所有者(拥有者):u — User。
文件和文件目录的所有者所在的组的用户(和文件所有者同组的用户):g — Group。
其它用户(和该文件和文件目录所有者没有关系的普通用户):o — Others。
下面为文件信息中文件所有者和所在组的信息。
在Linux中,每个文件都具有以下三种权限。
读权限: r — 读,Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限。
写权限: w — 写,Write对文件而言,具有修改文件内容的权限;对目录来说,具有删除、创建、移动目录内文件的权限。
执行权限:x — 执行,Execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限。
下面我们再分析每个文件的这些权限在文件信息的哪些位置。
字符表示法
在文件信息中,表示文件类型的字母后面的九个字母三三为一组,第一组表示该文件所有者对该文件的权限,第二组表示文件所有者所在组的其它用户对该文件的权限,第三组表示other(其他人)对该文件的权限。
例如下面第一个文件aa.pdf文件的信息表示,拥有者具有读写权限,没有执行权限;所属组具有读权限,没有写和执行权限;other(其他人)具有读权限,没有写和执行权限。这九个字母中三三一组,顺序永远为rwx,并且结果只有两种,有或者没有,其中 - 就代表没有。
其实除了使用字符rwx表示文件的权限外,还有一种八进制数值表示法,即将九个字母分成三组后,每一组对应一个八进制数字。具体转换如下图所示。即如果该文件有读权限,就将二进制的第一位置为1。如果有写权限就将二进制的第二位置为1,如果有执行权限就将二进制的第三位置为1,如果没有这些权限就将对应的二进制位置为0。然后将该二进制转为八进制。
功能:设置文件的访问权限
格式:chmod [参数] 权限 文件名
常用选项:
(1). R -> 递归修改目录文件的权限
说明:只有文件的拥有者和root才可以改变文件的权限
chmod命令权限值的格式: 用户表示符 + - = 权限字符
用户符号:
u:拥有者
g:拥有者同组用
o:其它用户
a:所有用户
权限操作符:
+:向权限范围增加权限代号所表示的权限。
-:向权限范围取消权限代号所表示的权限。
=:向权限范围赋予权限代号所表示的权限。
root用户的权限是最大的,就算没有对文件的读写执行权限,也可以对文件进行读写执行。
所谓的权限是限制普通用户,root一直有权限,root不受权限约束。root还可以更改文件的拥有者、所属组、other访问者的权限
上面我们使用了chmod指令来修改拥有者、所属组、other(其他人)对文件的一些权限,而chown指令是修改文件的拥有者的,即将该文件的拥有者改为另一个用户。
功能:修改文件的拥有者
格式:chown [参数] 用户名 文件名
常用选项:-R 递归修改文件或目录的所属组
举例:
如果一个普通用户user1将他拥有的myfile.txt文件给另一个普通用户user2时,这个过程是无法完成的,此时需要切换到root用户下,然后才有权限将myfile.txt文件的拥有者从user1改为user2。
功能:修改文件或目录的所属组
格式:chgrp [参数] 用户组名 文件名
常用选项:-R 递归修改文件或目录的所属组
举例:
普通用户user1虽然不能将文件的拥有者修改,但是如果该文件的拥有者为user1,但是所属组为user2,则此时user1可以将该文件的所属组改为user1。但是如果该文件的所属组为user1后,user1就没有权限再将该文件的所属组改为user2了。
权限只会认定一次,哪怕一个用户即是拥有者,又是所属组,但是判断了拥有者的权限后,不会再判断所属组的权限。
进入一个目录,需要该目录的执行权限 – x。
查看目录下的文件列表需要该目录的读权限 – r。
在目录下创建、删除或者移动文件需要该目录的写权限 – w。
在linux中,一个目录被创建后,起始权限是:777;一个普通文件被创建后,起始权限是:666。但是当我们查看时发现新创建的目录起始权限为:775;而新创建的文件起始权限为:664。出现这个问题的原因就是因为umask码的存在。当一个目录被创建后任何人都可以修改、删除这个目录中的文件,当一个文件被创建后,任何人都可以修改该文件的内容,这样对于目录和文件来说是非常不安全的。所以就有了umask码的产生,umask就是防止文件、文件夹创建的时候,权限过大,当新文件被创建时,其最初的权限由文件创建掩码决定。
最终权限运算:最终权限 = 起始权限&(~umask)
我们可以通过umask指令来查看当前用户的umask码,还可以通过umask指令后面加新的umask码来修改当前用户的umask码。并且需要注意的是**别设置umask值为奇数。**这是因为文件默认是没有x权限的,x权限一般用于二进制可执行文件;如果遮罩码设置为奇数,创建的文件权限会自动+1变成偶数权限。
不过上面的方式修改umask码只是临时修改,当再次开机时就没有了,如果想要将umask码的值永久生效,需要将umask值写入用户环境变量文件。
当了解了Linux的权限问题后,我们不难理解一个用户是否能够删除一个文件和该文件的权限没有关系,和该用户是否具有该文件所在目录的写权限有关。
经过上面的案例我们就能想到这样一个场景。当有一个项目需要多个人在一个home目录下共同开发时,因为每个人都要参选开发,所以每个人都要有home目录的读写执行权限,这样就造成了每个人都可以删除该目录下别人创建的文件。如果我们将每个人对home目录的写权限取消,那么每个开发人员不但没办法删除home目录下的文件了,而且也不能创建文件了,这就没办法进行开发了。所以在这种场景下,就可以使用粘滞位。
下面为将project目录设置粘滞位。粘滞位是x的一种,所以project的其他人执行的权限变为t。
下面为切换到slw用户来验证上面的分析的结果。这样就实现了该目录下每个用户只能删除自己所拥有的文件,但是可以创建文件。并且当一个目录被设置为"粘滞位"(用chmod +t),则该目录下的文件只能由
(1). 超级管理员(root)删除
(2). 该目录的所有者删除
(3). 该文件的所有者删除
sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具。即当普通用户有时遇到一些问题,想要用root用户的权限来执行某个指令时,此时可以使用sudo来完成。但是并不是每个普通用户都可以随便使用sudo指令的,只有在/etc/sudoers文件中添加信任的普通用户才可以执行sudo指令。下面为如何将普通用户添加为信任用户。
此时slw用户不是信任用户,所以不可以执行sudo指令。
需要root用户打开/etc/sudoers。
然后在sudoers文件中的100行左右,在%wheel ALL=(ALL) ALL下面添加一句slw ALL=(ALL) ALL即可。然后保存并退出文件。
然后在slw用户下再次执行sudo指令,需要先输入slw用户的密码,当密码成功后,slw用户就获得了5分钟的权限,在这期间可以使用sudo指令来进行一些root用户的操作。如果slw用户超过期限则必须重新输入密码。