Linux-Linux的原理和权限问题
1.命令
这是命令行提示符:![]()
这也是命令行提示符:![]()
命令行提示符是怎么构成的呢?
首先@前面的部分如:root和tan这是当前用户名,@后面':'前面是当前机器的主机名,如果各位用的是云服务器,那么这个主机名是所购买的云服务器平台自己设定的主机名,如果用的是虚拟机的话,这个名字是你配置虚拟机在这个界面设置的Your server's name:

因为我当时设置的名字为tan-dan所以此时的主机名为tan-dan。
‘:’后面是提示符,不同平台提示符可能不一样,如VMware为这样:

XShell为这样:
![]()
而且提示符在普通用户(除root外都是普通用户)和root用户的提示符也不一样:
![]()
Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel)”,但我们一般用户,不能直接使用kernel,而是通过kernel的“外壳”程序,也就是所谓的shell来与kernel沟通。如何理解呢?
举个例子:小张是一个程序员,他不善表达,但是他也渴望有个女朋友,因为他不善表达,所以需要有个人来撮合他和另外一个女生,这个人在我们看来就叫:王婆(媒婆),小张给王婆说:帮我找一个女朋友,然后王婆找到了一个女生叫如花,王婆给如花说小张多好多好,但是如花拒绝了王婆,并说小张不好看,然后王婆把这句话传回去说,如花拒绝了你,理由是你不好看。
所以我们可以这样看,小张就是用户,王婆就是shell外壳程序(命令行解释器),如花就是操作系统。我们把小张说需求给王婆是:用户输入指令,王婆给如花说是:把指令交给操作系统取执行,如花拒绝了称为:指令执行失败,王婆反馈结果:给用户打印失败结果的原因。
因此,为啥要有外壳?
(1)可以保护操作系统(如果小张提出不合理的请求(非法请求),就会被外壳拒绝了,就可以保护内部的操作系统!),因为王婆直接看到用户的非法请求,所以直接拒绝了。如:指令不合理

还有权限不足:

之后还会讲到权限这一部分,很多权限拒绝就是有外壳程序来的,权限都没有,自然啥都不能执行!
(2)方便用户操作,减少用户使用操作系统的使用成本。(小张不会说话,就不能准确表达自己的爱意,所以需要王婆来做处理才能让如花理解,也就是说,小张不用学会底层操作系统如何沟通,而只需要知道怎么与外壳沟通即可)
外壳是怎么工作的呢?
我们在Linux下命令行解释器大都为bash(相当于王婆),而不为shell(媒婆)。因为shell是所有外壳种类的总称,而bash是shell的一种(我们不能仅仅靠王婆就能说媒,只是王婆比较出名,媒婆中又不止王婆一个)。
什么是操作系统?为啥要有操作系统?
如果我们只把每个硬件连接到电脑上,那么电脑不一定能用,所以每隔硬件要配上驱动程序(这个驱动程序一般由硬件厂商提供),操作系统要进行进程管理、内存管理、文件管理、多驱动管理(管理底层硬件的,我们不用了解),用户通过先访问外壳层来访问操作系统,操作系统再调用驱动程序,驱动程序因此来调动底层硬件。
因此,可以说操作系统是一款进行软硬件资源管理的软件,它具有承上启下的作用,对上,操作系统要给用户提供一个良好(包括:稳定、高效、安全)的运行环境(目的)。对下,它还要做好软硬件的管理工作(手段)。

2.权限
Linux下有两种用户:超级用户(root)、普通用户
超级用户:可以在Linux下做任何事情,不受限制
普通用户:在Linux下做有限的事情
超级用户的命令提示符为'#',普通用户的命令提示符为'$'
如何切换用户登录呢?
用su指令可以root切换成普通用户,可以普通用户切换普通用户,可以普通用户切换为root。
除了root切换成普通用户不需要密码外,其余的切换都需要密码!
su切换用户前需要先创建用户,用adduser来创建新用户:
![]()
在root下可以通过adduser dan来添加用户名为dan的用户,此时回车会有:
我们现在要先设置一下这个dan用户的密码(密码不回显),输入密码后再次回车会提示:

此时我们需要再次输入刚刚输入的密码就会弹出:

这个是设置成功,然后它会问你全名为什么,你可以如实填写,可以直接回车,这个一点都不重要!

问完全名后还会问你房间号,工作电话,家庭电话,其他信息,这些可以自己填写也可直接全部回车即可。最后一句Is the information correct?询问你是否信息正确,如果输入Y就能创建成功,如果输入n就是不创建!
最后我们可以通过id dan来查看这个用户相关信息,如果想要看当前有多少用户,且用户名为什么,直接ls /home即可:

因为系统会在我们创建用户时在/home下创建一个用户对应的目录,目录名即为用户名!
此时我们就可以用su来演示了!
root切换为普通用户:

普通用户切换为普通用户:

输入的密码是不回显的,而且在tan用户下我们是位于/home/tan路径下的,也就是说,切换用户并不会改变用户所在的路径,也就是不更改工作目录,而切换用户后如果没在该用户的路径下就会显示在:的后面!
普通用户切换为root:

此外我们想要删除某个用户,在root账号下输入userdel -r dan这样就能删除dan这个用户了:

也有可能出现如下问题

这是因为用户dan当前有进程正在运行系统为了保护正在运行的程序,禁止删除正在被使用的用户。
原因分析:因为你之前可能用 su - dan 切换到了 dan 用户,或者 dan 用户通过 Xshell 登录了,所以系统里还残留着 dan 的进程(比如 Shell 会话)。
在以后的学习中建议还是用普通用户来进行学习,因为root权限大,如果不小心删除一些文件会导致问题出现!
我们可以使用ls -l看到文件的详细信息:

在windows下我们可以通过后缀来区分文件类型:

还有.c文件,.cpp文件,.py文件,.zip文件,.jpg文件等待!
Linux区分文件类型使用文件的属性列来区分的!在Windows下我们如果把后缀改了可能就会报错,在Linux下我们可以随便改,如:我们写一个code.c文件,编译,然后运行:

此时我们把a.out重命名为c.txt能不能运行?

所以说我们真的没必要那么规范的文件名吗?
之前介绍tab指令时,我们如果不把压缩的包以.tgz结尾,而是类似普通文件的命名方式,那么在我们用ls -l打印时就会发现它的颜色和普通文件一样,如果我们不记住就无法区分它是压缩文件还是普通文件,很容易弄混!
虽然Linux不以文件后缀区分文件类型,但是并不代表用户不可以使用后缀。我们可以把可编译程序文件名改成任意的后缀。
但是如果我们把c.txt文件删除,然后把code.c命名为code.txt,此时用gcc code.txt就不能过了:

不是说Linux不关心后缀名吗,这是怎么回事?
这是因为Linux != gcc,gcc是工具,因为实际上用户使用的工具可以使用后缀,但并不代表用户或用户使用的工具不可以使用后缀。因为工具有时需要规范文件后缀!
我们在当前路径下ls -l有:

我们发现实际上文件有很多信息,文件属性在你创建文件的那一刻就生成了,第一个字母代表文件的类型:
(1)-:普通文件(源代码,文本文件,可执行程序,音视频,各种文档,库文件);(2)d:文件夹;(3)l:软链接。
如果想要生成软链接,用如下方式就行:
ln -s /usr/bin/ls myls

(4)b:块设备文件。
ls -l /dev
此时我们可以看到:

这些就是块设备文件。
(5)p:管道文件。
mkfifo pipe

(6)c:字符设备文件(显示器和键盘(不支持随机读取,按字符为单位))
ls /dev/pts -l

以后我们会学到通过两个Linux机器实现在一个机器上输入,回车却显示在另外一个显示器上的操作。
虽然有这么多文件类型,但只要知道前两个就行!
我们发现ls -l每一行前面第一个字符后第一个空格前面有很多rwx-这些符号,这些代表权限。如果我们在普通用户下执行cp code.c /usr/bin操作:

这个错误的意思是:你没有权限将文件 code.c 复制到 /usr/bin 目录下。也就是说Permission的意思是:权限拒绝,因为普通用户所能修改文件路径多为用户家目录下的文件即在/home下的文件,当然如果想要执行这个操作,可以通过sudo这个指令来暂时提高自己的权限:
sudo cp code.c /usr/bin

此时我们需要输入tan用户对应的密码才能完成操作,但是建议不要用这个例子来操作,我们可以在root账号下创建一个目录这样操作:

此时我们在tan下就可以这样写:
sudo cp code.c /root/test
在root路径下我们查看一下:

因此,可以用sudo来短暂提高权限,如果我们再次在tan下:
sudo cp -r test /root/test

为啥这次不用输入密码了?
因为sudo有个特性,sudo输入正确的密码后10分钟之内(不同平台可能不一样)就不用再次输入密码了。想执行更高的等级操作,直接用sudo即可!
那这不久代表普通用户只要每次操作时多输入一个sudo后再输入自己的密码就能变得和root有一样的权限了,那root的意义在哪里?
有个特性:默认新增的用户,无法直接执行sudo,新用户不受系统信任!如,我创建一个用户dan,然后执行sudo操作:


它的意思就是用户 dan 没有使用 sudo 的权限。所以如果新用户想执行sudo指令需要root账号把这个成员(dan)添加到sudoers里面,这样操作:
nano /etc/sudoers
回车后显示这个界面:

找到:

在这个root ALL=(ALL:ALL) ALL下一行加:
dan ALL=(ALL:ALL) ALL
或者复制第一行粘贴后把root改为dan即可。

此时dan就能完成操作了,如果到时候添加更多用户也可以这样操作。sudoers相当于Linux系统的白名单!
如果我们在tan(没在白名单的用户)下:
nano /etc/sudoers
则会显示:

显示:Error reading /etc/sudoers: Permission denied,因为我们没有权限阅读。
如果在dan(在白名单的用户)执行刚刚的指令有:

在root下执行刚刚指令有:

为啥呢?
我们在root下ls -l /etc/sudoers有:

因为在-r--r-----代表:为普通文件,对于root只读,对于同组只读,对于其他人,什么权限都没有。这也就是为啥每个账号显示的不一样的原因了!权限=人+事物属性,在Linux下一切皆文件,所以文件权限=用户+文件属性(权限属性:读或写)。人=角色(如:老板/老师/学生)+真实的你(名字)(权限取决于你所扮演的角色,而不取决于你,因为是Linux是看你以哪个身份登录的,而不关心你是否真的是root或普通用户),且Linux下有三种角色:拥有者(谁创建的文件、所属组、其他)。如果Linux只有拥有者和other两个,那么如果对other放开了权限,无法做到定向给组内的人看,所以所属组就算是小范围内的组,在权限管理过程中,提供更好的灵活性!
-r--r-----其中第2,5,8可以为r/-,第3,6,9可以为w/-,第4,7,10可以为x/-。第一个root代表拥有者,第二个root代表所属组,1692代表文件大小(单位:字节),Aug 7 9:37代表最后修改的时间为8月7日,9点37分,最后的/etc/sudoers是文件名!
剩下的部分请见下一章!
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)