【Linux网络编程】 --- Linux权限理解
Welcome to 9ilk's Code World

(๑•́ ₃ •̀๑) 个人主页: 9ilk
(๑•́ ₃ •̀๑) 文章专栏: Linux网络编程

🏠 shell命令以及运行原理
📌 引入例子理解shell

假设八里村有一个人叫张三,他的父亲是这个村的村长。张三喜欢隔壁的如花,但是张三本人不擅长交际,却想跟如花谈恋爱结婚,于是希望村里的王婆帮其说媒。在这个场景下,我们的张三相当于是用户,而如花相当于是系统内核,王婆相当于是外壳程序(kernel),张三想让王婆帮他和如花说媒相当于是用户想访问系统内核,需要通过指令让外壳程序帮我们返回内核。
Linux严格意义上说的是一个操作系统,我们称之为"核心(kernel)",但我们一般用户,不能直接使用kernel。而是通过kernel的"外壳"程序,也就是所谓的shell,来与kernel沟通。

📌 shell三问
- Q1 : 为什么需要外壳程序?
在上面这个例子中,张三不擅长跟人交流,需要王婆帮助他解释他的需求给如花。对应的,用户不擅长也无法直接访问内核,他需要外壳程序解释他的需求。
因此广义上Linux系统 = Linux内核 + 外壳程序。
而技术角度shell的最简单定义是命令行解释器,它包括:
1. 将使用者的命令翻译给核心(kernel)处理。
2. 同时将核心的处理结果翻译给使用者。
在这里shell这个命令行解释器就相当于王婆,将指令(也就是张三的要求)解释给内核(如花)。
注 :
1.对比Windows GUI,我们操作windows不是直接操作windows内核,而是通过图形接口,点击,从而完成我们的操作。(比如我们进入D盘的操作通常是通过双击D盘盘符)。
2.shell对于Linux,有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核。反馈结果再通过内核运行出结果,通过shell解析给用户。
- Q2 :shell是如何进行指令解释的?
我们故事继续,王婆知道如花不喜欢张三,但是迫于张三的父亲是村长,怕自己说媒不成功丢了招牌,因此不管说媒结果如何都要办这件事,于是王婆决定成立说媒公司,她通过招实习生来帮助她给张三说媒,这样即使说媒没成功也可以说是实习生干的,同时不会丢了她自己的招牌。
从这个故事我们可以类比理解,其实外壳程序shell是通过创建子进程,让子进程来帮忙进行命令解释,以此来保证自身的安全和稳定性。
- Q3 : Shell和Bash是什么关系?
王婆她是个媒婆,媒婆是她们这一行的统称,而王婆是一个具体的媒婆;类比理解,其实王婆相当于是bash,而媒婆就是shell外壳。
也就是说,我们对不同平台的外壳程序统称为shell,它是包在操作系统外面的一个软件层,而Linux的外壳程序叫bash。
🏠 理解Linux权限
📌 一个认识
假设你是张三,是一个学校的校长,你能在学校活动发表讲话是因为你此时的身份是学校校长,而张三这两个字对你而言代表你是一个具体的人,校长代表的是你的角色/身份。
我们需要认识到:我们在现实生活什么可为什么不可为是由我们的身份/角色决定的。类似的,你在Linux系统中能做什么不能做什么也是由你的身份决定的。
📌 Linux下的用户
- Linux下分为两种用户:超级用户和普通用户。
1. 超级用户:可以在Linux系统下做任何事情,不受限制。
2. 普通用户:在Linux下做有限的事情。
超级用户的命令提示符是"#",而普通用户的命令提示符是"$"。

- 用户之间的切换
1. 普通用户->超级用户
su -
su root
su
注 : 由于超级用户权限大因此切换到root时需要输入密码。同时切换之后如果想退到上次登录可以使用ctrl + d和exit。

2. 超级用户->普通用户
su user

注 : 由于超级用户权限大,因此切换到普通用户不需要输入密码。
- 普通用户提权操作
若我们想让普通用户能使用一些超级用户才能使用的指令或想不切换为root用户而使用root权限做某些事,此时我们可以使用提权操作。
sudo + 命令

但是注意普通用户需要切换成root加进相关配置文件(/etc/sudoers)才能用sudo进行超级用户权限执行。
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
tommy ALL=(ALL) ALL
在ubuntu系统使用sudo提权可能会出现这样错误:

此时可以先切换到root输入如下指令,将用户名添加到sudoers文件:
sudo adduser image sudo //image是你要恢复的用户名
然后su image切回到在使用的用户就可以正常使用了。

- 新建用户
adduser + 新建用户名 //新建用户
passwd + 用户名 //设置密码
🏠 Linux权限管理
📌 文件权限
📒 文件访问者的分类(人)
1. 文件和文件目录的所有者 : u --- User。
2. 文件和文件目录的所有者所在的组的用户 : g --- Group。
3. 其他用户 :o --- Others。

- Q1 : 为什么other没有被列出来呢?
对于文件,拥有者只有一个人,所属组只有一组,而other可以是多人不需要再列出,而且也没必要列出,因为不是拥有者和所属组就是other。
- Q2 :为什么文件访问者需要所属组?

假设张三和李四两个好朋友进入同一个公司且由于团队赛马,他们两分进了同一个项目,但是并未分进同一个组,张三在A组,李四在B组,哪组的成果比较好谁的成果就会被在项目上实施。A组组长让张三写了一个code.c,有一天组长想查看张三的代码进度,此时只有拥有者张三和other两个访问权限,想让组长看就只能让other也能看,但这样难免会被B组偷窥,因此我们需要一个所属组访问者分类,让A组的人都能看到。
由此我们可以理解到,所属组是为了进行更细粒度的权限管理。
- Q3 : 如何理解权限与访问者的关系?
所谓权限其实就是等于人 + 事物的属性。
比如我们程序员喜欢在leetcode上刷算法题,但是你不能在leetcode上看电影,为什么?那是因为leetcode这个网站没有对应的属性。也就是说,即使我是拥有者但是事物没有对应属性也是白费力气,即使这个事物有对应属性但是我的人所处的角色没有办法使用这些属性也是白搭。
同样的,常见的文件有读(r) , 写(w) , 执行(x)三种权限,权限 = 人 + 事物属性,我们的用户相当于是一个具体的人,而拥有者,所属组以及other是我们这些人在不同文件中扮演的不同角色,用户在文件中的权限就是看你这个用户在这个文件扮演的角色是否能使用这个文件对应的属性!

📒 文件类型和返回权限(事物属性)
在Linux中我们可以使用ll命令查看文件的相关属性:

- 文件类型
d:文件夹
-:普通文件l:软链接(类似Windows的快捷方式)
b:块设备文件(例如硬盘、光驱等)
p:管道文件
c:字符设备文件(例如屏幕等串口设备)
s:套接口文件
- 基本权限
i.读(r/4):Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限。
ii.写(w/2):Write对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限。
iii.执行(x/1):execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限。
iv.“—”表示不具有该项权限。
-
Q1 : 如何描述一个文件?
![]()
描述文件从人和属性来描述,比如对于这个file.txt文件它对应的拥有者有可读可写不可执行权限,所属组有只读权限,其他用户只有可读权限。
- Q2 : 如何进行身份认证?
![]()
假如对于zqh这个普通用户它对于test.txt这个文件,它不是拥有者,也不是所属组,那他就是other,他就只能读文件。
注意:在进行身份认证时,只认证一次,认证顺序是拥有者,所属组,other前一个验证失败,才到下一个。

比如对于file.txt它的所属组和拥有者是file.txt,但是所属组有写权限,拥有者没有,当对zhuang用户进行身份认证时从左到右是将它认证成拥有者,因此他对于file.txt这个文件并没有写权限!
- 理解x(执行)权限

为什么对于main和file.txt他们都有x权限,但是一个可执行一个不可执行呢?
那是因为可执行权限和文件能不能执行无关,一个文件要被执行需要:1.具有可执行权限。2.本身是个可执行文件。
📒 文件权限的更改

我们怎么更改权限呢?
我们知道权限 = 人 + 属性 ,那么更改权限要么从角色入手要么从文件权限属性入手。比如对于zhuang用户要想对file读写,要么将拥有者修改为zhuang,要么更改他作为other的文件权限s属性。
✈️ 从属性入手
chmod
功能 : 设置文件的访问权限
格式 : chmod [参数] 权限 文件名
常用选项 : -R 递归修改目录文件的权限。
- chmod + u/g/o/a +/- rwx组合 + 文件名
字符说明:
1. u/g/o/a :
u表示拥有者
g表示所属组
o表示other
a表示所有用户
2. +/- :
+表示向权限范围增加权限代号所表示的权限
-表示向权限范围取消权限代号所表示的权限
注 : 可以一次性对多个角色进行权限更改,但是要用逗号隔开。

- 使用八进制:chmod 八进制 文件名


- 只有文件的拥有者和root才能改变文件的权限。

- 对于普通文件即使root是所属组且文件属性显示没有对应权限,它也能进行相关操作。

✈️ 从角色入手
1. chown
功能 : 修改文件的拥有者
格式 : chown [参数] 用户名 文件名
# chown user1 f1
# chown -R user1 filegropu1
2. chgrp
功能 : 修改文件或目录的所属组
格式 : chgrp [参数] 用户组 文件名
常用选项:-R 递归修改文件或目录的所属组
- 更改拥有者必需切换到原有的拥有者;更改所属组要么切换到原有所属组,要么切换到其拥有者。

但是注意对于root用户它可以无视上面规则:

- 普通用户在改变所属组/拥有者时需要sudo提权或者切换成root用户。

普通用户把文件给别人需要征求别人同意,而root可以强制给。
📌 目录权限
- 目录的可读权限
如果目录没有可读权限,则无法使用ls等命令查看目录中的文件内容。

- 目录的可写权限:如果目录没有可写权限,则无法在目录中创建文件/目录,也无法在目录中删除文件/目录。

拓展:我们可以得到一个文件的新建删除并不取决于这个文件的本身读写权限,而是取决于所在目录给它的权限。因此Linux系统里普通用户一般默认无法进入到另一个普通用户的家目录里,如果进入且在里面新建文件目录也没事,因为这个目录拥有者可以删除。

- 目录的可执行权限:如果没有可执行权限,则无法cd到目录中。

📒 权限掩码

为什么我们新建一个目录的默认权限是775,新建一个文件默认权限是664?其实不然。
最终权限 = 起始权限 & (~权限掩码)
其实目录的起始权限是777,普通文件的起始权限是666;当起始权限按位与权限掩码的取反时(二进制运算)才得到文件/目录的最终权限!
比如:起始权限是666 -> 110 110 110;umask为244 -> 010 100 100取反得到101 011 011
因此最终权限为100 010 010 也就是422
怎么查对应的权限掩码呢?
umask
将现有的存取权限减去权限掩码后,即可产生建立文件时预设权限。超级用户默认掩码值为0022,普通用户默认为0002。


怎么修改对应的权限掩码呢?
umask 044//修改权限掩码

权限掩码有什么意义呢?
假设一个开发团队在同一个系统上工作,系统管理员可以设置一个合适的umask值,比如002,用来确保新文件和目录默认允许组内其他成员读取和写入,但禁止其他用户访问.这种设置可以有效的支持团队协作,同时保护文件 不被其他不相关用户访问。
🏠 file指令
功能 : 辨识文件类型。
语法 :file [选项] 文件/目录

常用选项:
1. -c : 详细显示指令执行过程,便于排错或分析程序执行的情形。

2. -z :尝试去解读压缩文件的内容。
🏠 粘滞位
- 加上粘滞位操作 : chmod +t 文件/目录

- 当一个目录/文件被设置成"粘滞位",则该目录下的文件只能由
1. 超级管理员root删除
2. 该目录的所有者删除
3. 该文件的所有者删除

需求:在一个目录下要求任何人都能进去新建文件/目录等,但不允许删除别人文件和文件夹时可以使用粘滞位。
总结:
1.shell是我们的指令解释器,是用户和内核之间沟通的桥梁。
2.Linux权限 = 人 + 事物属性,描述文件也要从人跟事物属性谈。
3.文件和目录对应的读写执行权限含义不同。
4.更改文件权限可以从角色入手(chown chgrp),也可以从属性入手(chmod)。
5.最终权限 = 起始权限 & ~(权限掩码)。
相关文章:
【Linux网络编程】 --- Linux权限理解
Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: Linux网络编程 🏠 shell命令以及运行原理 📌 引入例子理解shell 假设八里村有一个人叫张三,他的父亲是这个村的村长…...
Qt/C++ 调用迅雷开放下载引擎(ThunderOpenSDK)下载数据资源
目录导读 前言ThunderOpenSDK 简介参考 xiaomi_Thunder_Cloud 示例ThunderOpenSDK 下载问题 前言 在对以前老版本的exe执行程序进行研究学习的时候,发现以前的软件是使用的ThunderOpenSDK这个迅雷开放下载引擎进行的项目数据下载,于是在网上搜索一番找到…...
深入详解 Java - Spring MVC
在 Java 企业级开发领域,Spring MVC 是一个极为重要的框架,它为构建强大、灵活且高效的 Web 应用程序提供了坚实的基础。本文将深入详解 Java 之 Spring MVC,带你领略其强大之处。 一、Spring MVC 概述 Spring MVC 是 Spring 框架的一个重要模块,全称为 Spring Web Model-V…...
Spring Boot技术中小企业设备管理系统设计与实践
6系统测试 6.1概念和意义 测试的定义:程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为: 目的:发现程序的错误; 任务:通过在计算机上执行程序,暴露程序中潜在的错误。 另一个…...
动态渲染组件
引言 在现代前端开发中,动态渲染组件是一种常见的需求,特别是在构建复杂的应用程序时。动态渲染组件允许我们在运行时根据不同的条件或数据来决定渲染哪个组件,从而提高代码的灵活性和可维护性。本文将详细介绍如何在 Vue.js 中实现动态渲染…...
一个神秘的新图像生成模型red_panda出现 轻松击败Midjourney与OpenAI
一个神秘的新图像生成模型在众包人工分析基准测试中击败了 Midjourney、黑森林实验室和 OpenAI 的模型。这个名为"red_panda"的模型在人工分析的文本到图像排行榜上领先排名第二的黑森林实验室的 Flux1.1 Pro 约 40 个 Elo 分数。 Artificial Analysis 使用 Elo&…...
云计算平台上的DevOps实践
文章目录 什么是DevOps云计算平台上的DevOps优势自动化部署弹性伸缩地理分布 实施DevOps的关键组件版本控制系统持续集成/持续交付工具配置管理工具监控和日志管理 实践案例使用AWS CodePipeline进行持续集成/持续交付利用AWS Auto Scaling实现弹性使用AWS CloudFormation进行基…...
JS新功能之:全新 Set 方法
JavaScript 的内置Set类将新增一些方法,以便执行集合论中常见的操作,包括: Set.prototype.intersection(other):返回两个集合的交集。 Set.prototype.union(other):返回两个集合的并集。 Set.prototype.difference(o…...
Flume的安装配置
一、上传解压 tar -zxvf apache-flume-1.9.0-bin.tar.gz -C /usr/local/soft/#***在环境变量中增加如下命令,可以使用 soft 快速切换到 /usr/local/soft***alias softcd /usr/local/soft/ 二、配置环境变量 soft #重命名 mv apache-flume-1.9.0-bin/ flume-1.9.0…...
3.1.3 虚存页面的映射
3.1.3 虚存页面的映射 文章目录 3.1.3 虚存页面的映射3.1.3 虚存页面的映射MmCreateVirtualMapping()MmCreateVirtualMappingUnsafe()MiFlushTlb()MmDeleteVirtualMapping()MmPageOu…...
【SSM详细教程】-14-SpringAop超详细讲解
精品专题: 01.《C语言从不挂科到高绩点》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482 02. 《SpringBoot详细教程》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12789841.html?spm1001.20…...
虚拟机桥接模式连不上,无法进行SSH等远程操作
说明:以下情况在window10上遇到,解决后顺便做了个笔记,以防后续再次用到,也给同道中人提供一个解决方案 一、首先按照以下步骤进行检查 1、是否连接了对应的wifi 2、是否设置了桥接模式 3、上述1、2确认无误的情况下请查看右上…...
jmeter基础01-1_环境准备-windows系统安装jdk
课程大纲 一、步骤解说 step1. jdk官网下载 Java Downloads | Oracle step2. 安装/解压(二选一) 1. 安装包格式(后缀.exe/.msi/.dmg):双击跟随界面向导安装,可以指定安装位置等。 2. 压缩包格式(后缀.z…...
第六天: C语言核心概念与实战技巧全解析
1 主函数(main) 大家好,今天我们来深入探讨一下C语言中非常特殊的一个函数——main函数。虽然大家对它并不陌生,但是它的重要性和特殊性值得我们再次回顾。 main函数的定义 main函数是我们整个C源程序的入口点。计算机在运行程…...
初始JavaEE篇——多线程(5):生产者-消费者模型、阻塞队列
找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏:JavaEE 文章目录 阻塞队列生产者—消费者模型生产者—消费者模型的优势:生产者—消费者模型的劣势: Java标准库中的阻…...
2024年下教师资格证面试报名详细流程❗
⏰ 重要时间节点: (一)下半年笔试成绩查询:11月8日10:00 (二)注册报名:11月8日10:00-11日18:00 (三)网上审核:11月8日10:00-11日18:00 (四&#x…...
软考:常用协议和端口号
常用协议及其对应的端口号如下: TCP/IP协议: TCP(传输控制协议):端口号为6UDP(用户数据报协议):端口号为17 网络应用协议: HTTP(超文本传输协议)…...
Linux更改符号链接
目录 1. 删除旧链接 2. 创建新的符号链接 例如我的电脑上有两个版本的cuda,11.8和12.4 1. 删除旧链接 rm cuda 2. 创建新的符号链接 ln -s /usr/local/cuda-11.8/ /usr/local/cuda...
int main(int argc,char* argv[])详解
#include <stdio.h> //argc 是指命令行输入参数的个数; //argv[]存储了所有的命令行参数, //arg[0]通常指向程序中的可执行文件的文件名。在有些版本的编译器中还包括程序文件所在的路径。 //如:"d:\Production\Software\VC_2005_Test\Win32控制台应用程序\Vc_T…...
单片机原理及应用笔记:C51流程控制语句与项目实践
作者介绍 周瑞康,男,银川科技学院,计算机人工智能学院,2022级计算机科学与技术8班本科生,单片机原理及应用课程第八组。 指导老师:王兴泽 电子邮箱2082545622qq.com 前言: 本篇文章是参考《…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
【Veristand】Veristand环境安装教程-Linux RT / Windows
首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...
《Docker》架构
文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器,docker,镜像,k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...
阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)
cd /home 进入home盘 安装虚拟环境: 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境: virtualenv myenv 3、激活虚拟环境(激活环境可以在当前环境下安装包) source myenv/bin/activate 此时,终端…...

