目录
一、shell
1.出现原因
2.作用
3.windows与linux的shell
(1)windows
(2)linux
4.存在意义
(1)便于用户与操作系统之间的沟通
(2)保护操作系统
5.运行模式
二、linux权限
1.linux权限的概念
(1)用户分类
(2)用户切换
(3)不切换用户执行对应指令
2.linux权限管理
(1)文件访问者的分类(人)
(2)事物属性
3.权限掩码
(1)权限掩码的作用
(2)查看umask
(3)修改umask值
三、粘滞位
1.创建公共目录
2.普通用户在公共目录下操作
3.粘滞位的作用
4.粘滞位的设置
四、sudo提权相关操作
(1)添加为受信任用户
在使用linux时,我们都说linux相较于windows,linux没有图形化界面,是用命令行进行操作。但是命令行的方式也并非是对计算机的直接操作。
我们知道计算机的底层其实就是由0和1组成,每个命令的传达最终都会转变为0,1信号传输给计算机让计算机运行相应的指令。但如果让大众都用这种方式操作计算机,无疑会非常的困难。
linux操作系统作为一个核心(kernel),用户不能直接对其进行操作。而是通过shell来与计算机沟通。“shell”的英文释义有“外壳”的意思,即存在于操作系统之上的“命令行解释器”,用于将用户的命令翻译给核心(kernel)处理,核心(kernel)再将处理结果翻译给用户
shell其实就可以看做是用户与操作系统之间的一位翻译员,用户与操作系统语言不通无法直接进行沟通,而是通过shell进行翻译后进行对话
在使用windows时,用户无法直接操作windows的内核,而是通过点击shell形成的图形化界面进行相关操作
在linux中,shell则是对我们的指令进行解析,将解析指令传给linux内核,反馈结果再通过内核运行出结果,将结果通过shell解析给用户
通过shell,用户可以用更加简便的方式使用操作系统,学习成本也会大大下降。
shell的另一个存在意义就是为了保护操作系统。通过对用户非法或无效指令的拦截,避免操作系统进行无用或有害的操作。比如我们在linux下输入一串乱码,shell就会将该命令拦截并返回
shell在执行命令时,会通过派生子进程的方式执行用户的指令,而shell本身一般并不会执行对应的指令。
可以将shell本身看做一个翻译派遣公司的总裁,用户有翻译需求时就向shell发出请求,而shell作为一个派遣公司总裁,一般不会亲自上门服务,而是派遣手下的其他翻译人员去服务,以应对繁多复杂的需求。这些外派的翻译人员就是一个个子进程。
权限就是操作系统中对用户的约束
在linux下,用户分为两种。一种是超级用户,即root。另一种是普通用户。
1.超级用户(root)
root用户有且仅有一个。同时,root用户拥有对该操作系统的最高权限。
可以认为,root用户在操作系统就像是古代国家的皇帝,不受任何法律条文的约束。在root用户下,执行任何命令都不会受到权限的限制。下可访问其他普通用户的文件并对其进行修改、删除。上可执行删除操作系统的根目录,数据库等会对操作系统造成严重损害乃至崩溃的操作
因此,root账户的密码一定要设置的复杂并保存好。
root用户的命令提示符是“#”
(2)普通用户
普通用户可以存在多个。普通用户会受到权限的约束。这些权限约束来自于系统和root用户。
普通用户的命令提示符是“$”
在linux下,可以使用“su”命令切换用户
在这里,你要登录谁的账户就要输入该账户的密码。因此,每个账户的密码都尽量要设置成不一样的
要退出该账户的话,输入exit或者使用快捷键“ctrl d”即可
注意:在普通用户下“su”,需要输入对应用户的密码。但是,在root用户下“su”,无需输入对应用户密码
如果我们是普通用户,但此时我们需要执行的一条指令需要root权限,而我们又不想切换用户去执行,此时就可以使用“sudo”命令。该命令可以短暂的提升普通用户的权限。
注意:在输入密码时,是输入本用户的密码,而不是root用户的密码
但此时我们会出现以下报错:
这就是因为该普通用户并不是root的信任用户,在root的对应文件中并不存在该普通用户,导致无法进行“sudo”命令
在linux中,权限由“人”和“事物属性”组成。人指的是进行操作的用户,事物属性则是指文件的属性
在linux中,文件的访问者分为三类:拥有者(onwer)、所属组(group)、其他人(other)。与root用户和普通用户是一个具体的人不同,文件访问者中的三类是一个比较抽象的概念,可以看做是一种角色。即其他用户在该文件下的身份。例如,一个普通用户在自己的目录的文件看来可能是所有者和所属组,但在其他用户的文件看来就可能是其他人
1.所属组存在原因
有人可能会疑惑,文件的拥有者和其他人都好理解,拥有者就是文件的创建者,other就是除了创建者之外的用户,那文件的所属组有什么意义呢?
假如现在我们有团队A和团队B在同一台linux机器上开发产品,此时,团队A的成员实现了一个模块,团队领导想查看该模块内容。如果linux中存在owner和other,因为owner是我们自己,那么领导要查看代码时,我们就需要将other的权限放开。但另一个团队也被该文件视为other,放开other就意味着不仅领导能看,另一个团队也能看你的代码,就容易造成代码泄漏。为了避免这种情况,就需要所属组。我们只需要将领导添加为该文件的所属组并放开所属组的权限即可,这样就可以在无需开放other权限的情况下向领导开放代码
现在我们有以上一个test.c文件,可以看到,在这个文件文件名前存在一大串的属性。在之前,我们最多知道“Oct 25 16:43”是上次修改时间,100是该文件按字节计算的该文件磁盘占用。但是前面的属性我们就不认识了。
1.文件访问者
上文中我们也提到了文件访问者的分类,其实在上图中的第一个root就代表所有者,第二个root则是指所属组。而other则并没有显示,因为除了这两个用户以外的用户就属于other,不必显示
2.文件类型
我们都知道,在linux中,文件的后缀是无意义的。因为linux不会通过文件后缀区分文件类型。但这不意味着linux中没有文件类型。linux的文件类型通过“ll”显示的属性列中第一列中的第一个字符来区分。而在上图中可以看到,在test和test.c的第一个字符分别是“d”和“-”的字符。而这两个字符其实就是文件的类型。
(1)linux中的常见文件类型
-: 普通文件
主要包括源代码、库文件、可执行程序、文档压缩包等
d:目录文件
c:字符设备文件
主要为硬件,例如键盘、显示器等
b:块设备文件
例如磁盘
l:链接文件
以windows为例,桌面上的快捷方式其实就是一种链接文件。快捷方式链接着对应软件的启动程序。在linux下,我们执行“ln -s a.out test”命令:
此时就为a.out文件创建了一个链接文件test,而该文件的开头其实就是“l”,代表着链接文件
如果我们要执行a.out文件,就可以使用test:
p:管道文件
管道文件涉及到进程间通信,这里就不详讲,现在只需要知道有这种文件存在即可
3.文件权限
可以看到,在这里除了第一个字符是文件类型外,还剩下了9个字符。同时我们知道文件访问者分为三类,而这9个字符中每三个字符就代表着一种访问者的访问权限。
(1)文件权限分类
文件权限分为三类即“r”、“w”、“x”。
“r”代表着读,即阅读该文件。“w”代表着写,即修改该文件内容。'“x”代表着执行,即执行对应文件
每个文件的访问者权限都由这三个权限组成。以“rwx”的方式排序。如果对应的权限上为“-”,即未拥有该权限
如上图中的权限“rwx -xr r-x”,就表示所有者有读写执行权限;所属组有读写权限,没有执行权限;访问者有读和执行权限,没有写权限。这里加空格只是为了方便区分,实际显示不会有空格
(2)权限修改
1.逐个修改
linux中的权限也是支持修改的,修改时要使用“chomd”命令。例如,我们要将下图中的执行者权限修改为“-wx”,就可以执行“chomd u-r test”:
这种形式下,“u”代表拥有者,“-”代表去掉对应权限。而“g”代表所属组,“o”代表其他人。如果想修改其他访问者权限,对应的修改“u”即可。如果想加上某种权限,则可以将“-”变更为“+”。
当然,增删权限时也可以用多访问者多权限的形式,如“chmod u-rwx,g-rwx test”:
如果想修改所有访问者的权限,也可以将“u、g、o”修改为“a”带上对应权限,这里就不演示了。
2.修改文件所有者及所属组
修改文件所有者,需要有对应的权限,否则则需要使用“sudo”提权。修改文件所有者的命令为“chown 对应用户 文件名”:
如果要修改所属组,就使用“chgrp”命令,使用方法和“chown”相同,这里就不演示了
如果要同时修改拥有者和所属组,就使用“chown 用户名:用户名 文件名”命令,使用方法也是一样的:
此处使用的是root用户,使用无需sudo,普通用户则需要sudo。
对于other,无需修改,因为除了拥有者和所属组以外的用户就是other
3.权限同时修改
我们说过,在计算机中,所以的命令都是0,1信号的方式传递的。
权限存在有和无两种状态,也是由0,1组成的。“rwx”就可以看做是“111”,“---”则可以看做是“000”。而这些二进制如果转换为八进制,则是“7”和“0”。由此,权限的八进制范围可以看为是“[0, 7]”。在八进制中,“r”表示4,“w”表示2,“x”表示1
由此,在修改权限时,我们除了用“u-”这类形式去修改外,还可以以八进制的形式修改。即“chmod 三个访问者的八进制数字组合 文件名”。如“chmod 777 test”:
这种修改方式,在需要修改多个访问者权限时,就比第一种逐个修改要便捷
注意:这种方式如果不写全,如写“7”、“35”这种形式,系统是从后往前,即从other->group->owner的方向修改,因为此时其他权限默认为0不显示。如下图:
其实新建目录的起始权限是777,新建文件夹的起始权限是666。但是我们实际看到的却不是这样的。原因就在于创建文件或目录时会受到umask(权限掩码)的影响。
umask值,即权限掩码中存在的权限,系统会自动配置好。在生成文件或目录时,都要去掉权限掩码中的权限。
要查看umask值,直接输入“umask”命令即可:
这里的第一个0我们不用管,在第一个0后面的就是每个访问者要去掉的权限。即在系统的默认中,每个新建的文件或目录的所有者无需去掉权限,所属组需要去掉2,即写权限;其他人需要去掉2,即写权限
在文件的起始权限666中去掉022,目录的起始权限777中去掉022就是上图中的权限。
要注意,普通用户和root用户的umask值是不同的。普通用户的umask值为002,root用户则是022
umask值虽然可以由系统默认生成,但是也可以手动进行修改。
修改方式是“umask 0对应权限”。如“umask 0444”:
可以看到,修改umask值后,新建的文件的默认权限中的对应权限就被去掉了
注意:umask值不是用初始权限去减权限值,而是去掉对应的权限。例如文件的初始权限时666,此时我们将umask值修改为0111。如果用减法就会变成555,即“r-xr-xr-x”。但实际上应该是去掉1对应的“x”权限,即依然是“666”权限,即“rw-rw-rw-”:
有人可能会疑惑,为什么目录的起始权限时777,而文件的起始权限时666。原因就在于要进入一个目录,需要的是执行权限,即“x”权限:
如果是在root用户下执行上述操作,则可以进入无“x”权限的目录,因为root用户不受权限约束
有时我们可能会遇到一台linux机器有许多人在使用,我们有时需要在一个公共目录下对临时文件进行操作。就好比在一个家庭中,每个人都有自己的房间,这就是用户自己的目录。而这个房子里面又存在客厅,家庭成员会在客厅这个公共区域活动,这个客厅就是公共目录
而在实际中,我们可能会遇到需要在同一个公共目录下写代码的情况。为了避免权限问题,这个公共目录就是由root来创建的。由于是root创建,这个公共目录一般是放在根目录下的。
我们先在根目录下创建一个公共目录“mytmp”:
而要让mytmp成为公共目录,就意味着所有人都可以操作,因此我们将该目录的权限改为“777”:
由于根目录下的mytmp文件权限全部放开,因此作为普通用户,我们也能进入该文件并进行操作。
现在以普通用户tjj的方式创建目录:
而现在,又有另一个普通用户Temporary_users在该公共目录下创建了文件:
此时对于用户tjj的文件而言,用户Temporary_users是other,只有读权限,没有写和执行权限:
现在看起来是很正常的。但是如果此时Temporary_users用户想搞事情,把用户tjj的test1.txt文件删除掉,这是否可以呢?答案是可以的:
可以看到,这里Temporary_users用户没有执行任何多余的命令,直接就将用户tjj的文件删除了。这就很奇怪,我的文件你没有权限去执行和写,却可以删除。这就好比我有一本书,我可以借给你看,但我不让你在上面乱涂乱写,于是你就恼羞成怒把我的书扔了,不合情理。
这个问题归根到底还是权限的问题。在前面我们提到了文件的权限包括读、写、执行,但却没有提到删除。这是因为删除文件的权限并不是由文件决定的,而是由目录决定。
这种不同用户可以删他人的文件的行为在现实看来不合理,但是在系统看来是合理的。因为删除文件并没有突破“读写执行”的权限。
文件的删除权限是由目录决定的,而目录在生成时就默认可以删除文件。为了解决这个问题,让不同用户之间不能互删文件,linux中便有了“粘滞位”。
简单来讲,粘滞位就是用于给目录设置“禁止不同用户互删文件”的权限。是一种特殊的权限
设置粘滞位,要执行“chmod +t 目录名”命令。由于公共目录一般都是由root或者其他上级目录生成,因此其他用户对于公共目录就是other,因此粘滞位都是设置给other,无需带上访问者选项。以公共目录“mytmp”为例,要给它设置粘滞位,就可以执行“chmod +t /mytmp”:
可以看到,执行上述命令后,就会将other的“x”权限位置修改为“t”,这就表明粘滞位设置成功
此时再以Temporary_users用户的身份删除tjj用户的文件就会显示“该操作不被允许”
如果大家使用的是没有经过配置的普通用户,那么是无法使用“sudo”进行提权操作的。原因就在于能够使用“sudo”命令的用户都是“受信任用户”。可以认为,这些受信任用户在一定程度上等同于root用户。因此,每个新创建的用户都是默认不受信任,无法使用sudo的
注意,以下操作都必须在root用户下执行
添加为受信任用户,简单来讲就是在root用户下的对应文件中将该用户添加进去即可。
执行“vim /etc/sudoers”命令,进入sudoers文件:
进入文件后来到大概100行左右,会有以下代码:
这里就是添加受信任用户的地方。然后按下“yy p”组合键,即两下“y”键后按下“p”键,此时就会复制一份光标所在行代码。然后按下“i”键进入插入模式,在这里将复制好的代码的root改为你的用户名,其他的都不要改。
改好后按下“shift ;”组合键,然后输入“wq!”即可保存并退出
如果你的上述操作没有错误,那么此时你对应的普通用户就已经是受信任用户,可以使用“sudo”进行提权
注意,在sudoers文件里面,不要随意修改其他代码!