当前位置: 首页 > news >正文

Linux - #操作系统概念 #权限

文章目录

前言

一、Linux操作系统 与 shell 

1、对于Linux操作系统 :

2、对于命令行:

二、什么是操作系统

三、Linux 权限的概念

1、Linux 的文件类型

2、Linux 的用户

2.1 新增用户

2.2 问题

3、权限的理论理解

4、权限的操作实验

4.1 修改文件的权限属性:

方法一:符号模式 (Symbolic Mode)

方法二:八进制模式 (Octal Mode)

4.2 更改文件的拥有者和所属组

总结


前言

路漫漫其修远兮,吾将上下而求索;


一、Linux操作系统 与 shell 

Linux 严格意义上说是一个操作系统,我们称之为”核心“, 但是用户一般不会直接使用 ”核心“,而是通过”外壳“程序 Shell 来与”核心“进行沟通

Shell命令行解释器 (command interpreter) 主要功能:

  • 1、将使用者的命令翻译给”核心“处理
  • 2、将”核心“ 处理的结果翻译给使用者

Q: 为什么不能直接使用”核心“?

  • 门槛高,使用起来很复杂,许多东西需要自己编程来访问;且操作系统容易被恶意修改;

在windows 中,我们使用windows 并不只直接操作windows 的内核,而是通过windows 的图形化接口与内核进行“交互”;

Shell 对于 Linux 也有同样的作用,通过对我们的指令进行解析给Linux 内核 , 通过内核运行出结果shell 再解析给用户;

1、对于Linux操作系统 :

狭义上Linux操作系统Linux 内核

广义上Linux操作系统内核 + shell 外壳程序 + 系统中默认安装的软件

Q:Ubuntu、CentOS 等操作系统的区别?

  • 可以认为Ubuntu、CentOS 等操作系统的内核是完全一样的,区别在于其外壳程序、系统中默认安装的软件不同

注:安卓操作系统的底层就是Linux, 也可以认为安卓操作系统是封装出来的套壳程序;

Q:为什么要有外壳程序?

  • 1、保护操作系统
  • 2、方便用户操作,减少用户使用操作系统的成本;

Q:外壳程序是如何进行工作的?

  • 在Linux 中外壳程序是命令行;在windows 中,外壳程序是图形化界面;在安卓上,外壳程序是图形化界面外壳程序的核心作用帮助我们进行命令行解释,将用户的需求、指令转递给操作系统,操作系统执行完了以后再将结果通过外壳程序传递给用户;因为外壳程序的存在,对于内核来说可以保护内核,另一方面,可以提高用户的使用体验;

此外,我们在Linux 中所使用的外壳程序严格意义上不叫作shell ,而是bash(在绝大多数的Linux 操作系统中);如下:

在我们登录时,bash 程序就已经跑起来了,给我们形成一个新的命令行让我们去进行输入;

Q: shell 与 bash  有什么区别?

  • shell 是所有种类外壳程序的总称,而bash 是其中一种具体的外壳程序

2、对于命令行:

云服务器登录Linux (eg.Ubuntu )会弹出命令行让你输入命令, 如下:

其中 ubuntu 为用户名, @VM-12-10-ubuntu 为主机名 , ~Test/Linux-git 为当前工作目录

二、什么是操作系统

操作系统(Operating System,简称 OS) 是管理计算机硬件软件资源系统软件,同时也是计算机系统的内核与基石。

你可以把它想象成一个公司的总经理、一栋建筑的物业管理部门或者一个国家的政府

  • 没有操作系统的计算机就是一堆冰冷的、无法沟通的硬件(CPU、内存、硬盘等),我们普通用户无法直接使用。

  • 有了操作系统,它就在我们用户和计算机硬件之间搭建了一座桥梁,负责所有复杂的底层沟通和管理工作,让我们能够轻松、高效、安全地使用计算机。

简单来说,操作系统是一款进行软硬件资源管理的软件

Q:为什么要有操作系统?

  • 操作系统做好软硬件的资源管理就可以给用户提供一个稳定、高效、安全运行环境;

三、Linux 权限的概念

1、Linux 的文件类型

在Windows中区分文件类型,使用文件后缀名来区分的;而Linux 区分文件类型,依靠于文件属性列

注:虽然Linux 不以文件后缀名来区分文件名,但是不代表用户不可以使用后缀;eg. gcc、g++ 等编译器在编译的时候也是需要看文件后缀名的,gcc、g++ 等关心的后缀与Linux 系统同不关心文件后缀并不冲突;

文件属性列,如下:

文件类型:

  • d : 目录(文件夹)
  • - 普通文件;eg. 源代码、库文件、文本文件、可执行文件、音视频、各种文档...
  • l : 软连接(类似于 windows 中的快捷方式)
  • b : 块设备文件(eg. 磁盘、硬盘、光盘... ; 支持随机访问,读取数据时以块为单位
  • p : 管道文件
  • c : 字符设备文件(eg. 显示器、屏幕等;不支持随机读取,以字符为单位进行读取
  • s : 套接口文件

2、Linux 的用户

当代操作系统均是多用户操作,即一个操作系统允许多个人同时使用;

用户一般分为两类:

  • 1、root 账户,Linux 管理员,只有一个;可以 Linux系统下做任何事情,不受限制
  • 2、普通用户,可以有多个,普通用户的权限是受管控的,旨在特定目录下才允许做特定的操作

2.1 新增用户

在root 账号下:

//新增
adduser 你的用户名
//输入密码
passwd 你的密码

若想要删除此用户,在root 账号下执行:

userdel -r 所要删除的用户名

2.2 切换

CentOS中有root 账户 , Ubuntu 中没有;

2.2.1 普通用户 -> root

su root
//输入root的密码

2.2.2 root->普通账户

//zjx 为我的普通账号
su zjx
//输入账号zjx 的密码

需要注意的是,在不知道另外一个普通账号密码的前提之下,普通账号之间不能进行切换;另外,su 只是单纯地进行身份的切换,不会更改当前所在地工作目录;还可以使用 su - +账号 的形式来进行账号切换,不过 su - 会进行重新登录,如下:

//root-> 普通
su - zjx//普通 -> root
su - root

2.2 问题

Q1:如果我想做需要提高权限才能做的事的,该怎么办?

  • 方法一:让自己变成root ,使用su root 或者 su - root 进行身份切换便可;
  • 方法二:sudo + 指令指令提权功能,以root 身份运行该命令
//假设想要以root 的身份运行 ls 命令
sudo ls
//在CentOS中需要输入当前账号的密码

Q1: 既然普通用户仅需要输入密码就可以使用sudo 而拿到root 的权限,那么root 存在的意义是什么?

  • 需要注意的是,默认新增的用户无法执行sudo , 新用户不受系统信任,而只有 root 才可以修改sudoers

sudoers 的路径:/etc/sudoers

3、权限的理论理解

结合实际,权限 = 人 + 事物属性,eg.你想要在gitee 上看电影是不行的,因为gitee 并没有看电影这一功能 , 所以想要执行某一功能就要知道这个事物是否支持该功能;

人 = 角色 + 真实的你eg. 张三是校长,学校的老师、同学尊重张三是在尊重张三“校长”这一身份……在这个世界上,人 = 扮演的社会角色 + 真实的自己,而权限的约束往往不是针对某一个具体的人,而是约束这个人所扮演的社会角色,eg. 老师、学生才可以进学校;

Linux 中一切皆文件,那么 文件权限 = 用户 + 文件权限属性

Q:文件的属性有哪些?

  • 文件的属性有 r、w、x ,即对应 读、写、可执行

Linux 上的用户有很多,Linux 为了做权限管理,在Linux 系统中引入了三种角色拥有者、所属组、other

Q:什么是所属组?为什么需要所属组?

  • 在一些公司中会将开发人员分为两组,分别各自研发一款软件(赛马机制), 最后如软件的发布看这两组谁开发的软件更好;组内人员之间可以看到彼此的文件,但是两组之间不能相互查看;所属组的存在以支持定向让组内成员查看,并且在权限管理的过程中提供了更好的灵活性

注:所属组可以一人一组也可以多人一组;

至于文件权限占了 9 byte, 3byte 为一组分别对应:拥有者、所属组、other 的权限,如下图:

表述文件test.c 的权限:(权限 = 角色 + 文件的权限属性)

test.c 的拥有者为 ubuntu 具有 读、写权限,所属组 ubuntu 具有读、写权限,其他人具有读权限;

Q:为什么文件属性中没有other?

  • 只要不是拥有者、所属组就是other;

Q: root 、普通账户 与拥有者、所属组、other 的关系是什么?

  • 拥有者、所属组、other 是一种角色身份,而root、普通用户具体的人角色身份由具体的人来扮演;

所以对于文件权限的操作(文件权限 = 人 + 文件权限属性) , 要么是对文件的权限属性做操作,要么就是修改人;

4、权限的操作实验

4.1 修改文件的权限属性:

方法一:符号模式 (Symbolic Mode)

chmod

功能:设置文件的访问权限

选项:-R 递归修改目录文件的权限

chmod [谁][操作符][权限] filename

谁 (Who)

  • u:拥有者 owner   
  • g:所属组 group 
  • o:other 其他用户
  • a:所有人(all,即 u+g+o),是默认值如果省略

操作符 (Operator)

  • +:添加权限
  • -:移除权限
  • =:精确设置权限(覆盖原有的)

权限 (Permissions)

  • r:读
  • w:写
  • x:执行

即:chmod u/g/o[+/-]rwx filename 

CentOS中如果有多人,中间用 , 分隔开(eg. 增加文件test,c  u、g 的写属性):chmod u,g+w test.c

Ubuntu 中多人:chmod ug+w test.c

方法二:八进制模式 (Octal Mode)
chmod 八进制 filename

使用数字代表权限每个数字对应一组权限(u/g/o)

  • 4 = 读 (r)  八进制4 = 二进制 100

  • 2 = 写 (w)  八进制2 = 二进制 010

  • 1 = 执行 (x) 八进制1 = 二进制 001

将所需权限的数字相加,就能得到该组的权限值
例如:

  • 7 (4+2+1) = 读 + 写 + 执行 (rwx)

  • 6 (4+2) = 读 + 写 (rw-)

  • 5 (4+1) = 读 + 执行 (r-x)

  • 0 (0) = 无权限 (---)

三个数字按顺序分别代表拥有者、所属组、other的权限

注:只有文件的拥有者才和root 才可以修改文件的权限属性;

操作如下:

//设置权限为 rwxr-xr--
//u: rwx = 4+2+1 = 7
//g: r-x = 4+0+1 = 5
//o: r-- = 4+0+0 = 4
chmod 754 test.sh//最常用的几个权限:
chmod 755 test.sh   //rwxr-xr-x (常用于可执行程序或目录)
chmod 644 test.txt //rw-r--r-- (常用于普通文件)
chmod 600 .ssh/id_rsa  //rw------- (常用于私密文件,只有自己能读写)//非常危险的操作,赋予所有用户所有权限,谨慎使用
chmod 777 test.sh  //rwxrwxrwx

需要注意的是, root 是管理员,root 可以无视权限;

另外:

Q:为什么上面的test.c ubuntu 作为所属组明明有读权限,而却读不到呢?

  • 在身份匹配的时候,先匹配拥有者再匹配所属组;若拥有者匹配上了,就以拥有者的权限来约束该用户访问文件,一旦权限不具备,不查看下一个角色;即,身份只能匹配一次

Q:为什么只能匹配成功一次?

  • 因为身份认证只需要一次;

我们可以验证一下:将拥有者的身份改为 zjx 的,所属组仍然为 ubuntu ,让ubuntu 获取文件中的内容:

Q:什么情况下会去掉自己的权限?

  • 防止自己误操作该文件;

Q:x 什么意思,是否只要文件具备 x 权限就就可以执行?

尝试了一下,显然这是行不通的;这是因为可执行和能执行是两码事,一个可执行文件既要有可执行权限又要自己本身可以执行才能执行

一个可执行文件 = 可执行权限 + 本身可以执行

4.2 更改文件的拥有者和所属组

chown chown - change owner(改变拥有者)

  • 功能:修改文件的拥有者
chown [选项] [新拥有者][:新所属组] 文件或目录

chgrp (chgrp - change group (改变所属组))

  • 功能:修改文件或目录的所属组
  • 选项:-R 递归修改文件或目录的所属组
chgrp [选项] 新所属组 文件或目录

需要注意的是,拥有者修改文件的rwx 权限,修改的是自己文件的属性,所以没有什么限制,所以使用chmod 不需要管理者权限;但倘若要将文件给别人,是需要争得对方的允许,所以使用chown、chgrp 的时候,无论在CentOS 中还是在Ubuntu 中均需要带上sudo 或者转换为root 身份;

Q: 想要进入一个目录需要什么权限?

  • x权限;

r (Read - 读)

  • 对于文件:可以查看文件内容(如用 catless 查看)
  • 对于目录:可以列出目录内的内容(如用 ls 列出)

w (Write - 写)

  • 对于文件:可以修改或覆盖文件内容
  • 对于目录:可以在目录内修改、新建、删除文件或子目录(即使你不是该文件的所有者!)

x (eXecute - 执行)

  • 对于文件:可以将文件作为程序或脚本执行
  • 对于目录:可以进入该目录(如使用 cd 命令)

我们创建一个目录:

目录的默认权限中,拥有者、所属组、other 的权限均有x ,这是因为创建目录就是要进入的;

Q:上图中的dir、test.txt 均为新建文件,其默认权限分别为 rwxrwxr-x 以及 rw-rw-r-- ;Linux 中的文件(普通文件、目录文件)在新建的时候、缺省的权限为什么是我们现在所看到的样子?

普通文件:(起始权限):666

目录文件:(起始权限):777

而在普通文件、目录文件起始权限的基础上丢弃掉权限掩码就是我们新建文件、目录时所看见的默认权限的样子了,即最终权限= 起始权限 去掉 权限掩码 -->  起始权限&(~umask)

权限掩码过滤掉权限掩码中出现的权限;

注:

  • 1、在不同的系统中,权限掩码umask 的值可能不同;
  • 2、权限的计算只能是  起始权限&(~umask) 而不能是 起始权限-umask ,因为减法会借位,而这3个八进制数字分别代表的是拥有者、所属组、other 的权限;

在Linux 系统中,可以手动设置 umask, 如下:

5、目录权限

r (Read - 读)

  • 对于文件:可以查看文件内容(如用 catless 查看)
  • 对于目录:可以列出目录内的内容(如用 ls 列出)

w (Write - 写)

  • 对于文件:可以修改或覆盖文件内容
  • 对于目录:可以在目录内修改、新建、删除文件或子目录(即使你不是该文件的所有者!)

x (eXecute - 执行)

  • 对于文件:可以将文件作为程序或脚本执行
  • 对于目录:可以进入该目录(如使用 cd 命令)

操作如下:

一个文件是否能被删除,权限是依赖该文件所处目录是否具有w 权限;

另外,对于家目录:

普通用户的家目录只有自己和root 账户可以进入,other 没有进入的权限;

Q:如果想让多个普通账号之间进行文件或者数据的共享,该如何实现?

  • 一般不能放在任何一个普通账号之下,因为普通账号之间不可以互相“串门”,故而应该在root 账号之下创建,公共目录下的普通人以other 的身份去访问;同时为了避免互删文件的情况,可能会想到的处理方法:将该共享文件所在目录的 w 权限去除掉,这样做是不可行的,虽然可以解决“互删”的问题,但是就不能在此目录下新建文件了;正确的处理方式:对该目录设置粘滞位;

当一个目录被设置为“粘滞位”(使用chmod+t ), 则该目录下的文件只能由:

  • 1、超级管理员root 删除
  • 2、该目录的拥有者删除
  • 3、该文件的拥有者删除


总结

1、操作系统;

  • 狭义上Linux操作系统Linux 内核
  • 广义上Linux操作系统内核 + shell 外壳程序 + 系统中默认安装的软件

2、操作系统是一个进行软硬件资源管理的软件;操作系统做好软硬件的资源管理就可以给用户提供一个稳定、高效、安全运行环境;

3、Linux 中一切皆文件,而文件权限 = 用户 + 文件权限属性

4、文件的属性有 r、w、x ,即对应 读、写、可执行

5、修改文件权限:chmod 、chown 、chgrp

http://www.dtcms.com/a/360478.html

相关文章:

  • 获取某天的零点日期
  • Java 异常处理全解析:从基础到实践
  • Rust 登堂 之 枚举和整数(八)
  • OpenCL C++ 平台与设备
  • 集合-单列集合(Collection)
  • DrissionPage 实战:动态 IP 代理与百度翻译 API 数据抓取
  • LeetCode算法日记 - Day 27: 计算右侧小于当前元素的个数、翻转对
  • Linux wlan 之网络问题定位分析 实例一
  • 如何确定虚拟机的IP
  • Qt QML连接数据库如何解决重复创建连接问题
  • 【嵌入式】【电机控制】基础知识列表
  • K8s调度核心:从Pod分配到节点优化
  • MATLAB R2010b系统环境(四)MATLAB帮助系统
  • LeetCode 每日一题 2025/8/25-2025/8/31
  • 模拟在线测试六线测试相关知识
  • 如何快速学习新技能
  • io进程线程;标准IO;0831
  • Java全栈开发面试实录:从基础到微服务架构的深度解析
  • Augment 宣布 Auggie CLI正式向所有用户开放
  • 利用DeepSeek编写验证xlsx格式文件中是否启用sharedStrings.xml对读写效率影响python程序
  • Ring Buffer解析
  • Thread、ThreadLocal、ThreadLocalMap
  • 用户态 kill 与 pthread_kill 的区别?
  • 动态链表:结构体模拟单链表的终极指南
  • ts 定义类型
  • Linux学习:简单模拟实现C++中的线程类
  • C++算法学习专题:前缀和
  • 【Linux网络编程】应用层协议-----HTTP协议
  • PostgreSQL表膨胀的危害与解决方案
  • More Effective C++ 条款19:理解临时对象的来源(Understand the Origin of Temporary Objects)