嵌入式软件开发之Linux 用户权限管理
目录
Ubuntu 用户系统
权限管理
权限管理命令
权限修改命令 chmod
文件归属者修改命令 chown
Ubuntu 用户系统
Ubuntu 是一个多用户系统,我们可以给不同的使用者创建不同的用户账号,每个用户使用各自的账号登陆,使用用户账号的目的一是方便系统管理员管理,控制不同用户对系统的访问权限,另一方面是为用户提供安全性保护。
我们在安装 Ubuntu 系统的时候被要求创建一个账户,当我们创建好账号以后,系统会在目录/home 下以该用户名创建一个文件夹,所有与该用户有关的文件都会被存储在这个文件文件夹中。同样的,创建其它用户账号的时候也会在目录/home 下生成一个文件夹来存储该用户的文件,如下图所示就是我的电脑上“zhangyu”这个账户的文件夹,也就是用户账户的根目录。
装系统的时候创建的用户其权限比后面创建的用户大一点,但是没有 root 用户权限大,Ubuntu 下用户类型分为以下 3 类:
- 初次创建的用户,此用户可以完成比普通用户更多的功能。
- root 用户,系统管理员,系统中的玉皇大帝,拥有至高无上的权利。
- 普通用户,安装完操作系统以后被创建的用户。
以上三种用户,每个用户都有一个 ID 号,称为 UID,操作系统通过 UID 来识别是哪个用户,用户相关信息可以在文件/etc/passwd 中查看到,如下图所示:
从配置文件 passwd 中可以看到,每个用户名后面都有两个数字,比如用户“zhangyu”后面“1000:1000”,第一个数字是用户的 ID,另一个是用户的 GID,也就是用户组 ID。Ubuntu里面每个用户都属于一个用户组里面,用户组就是一组有相同属性的用户集合。
权限管理
在使用 Windows 的时候我们很少接触到用户权限,最多就是打开某个软件出问题的时候会选择以“管理员身份”打开。Ubuntu 下我们会常跟用户权限打交道,权限就是用户对于系统资源的使用限制情况,root 用户拥有最大的权限,可以为所欲为,装系统的时候创建的用户拥有root 用户的部分权限,其它普通用户的权限最低。对于我们做嵌入式开发的人一般不关注用户的权限问题,因为嵌入式基本是单用户,做嵌入式开发重点关注的是文件的权限问题。
对于一个文件通常有三种权限:读(r)、写(w)和执行(x),使用命令“ls -l”可以查看某个目录下所有文件的权限信息,如下图所示:
在上图中我们zy1.c为例讲解,文件zy.c文件信息如下:
-rw-rw-r-- 1 zhangyu zhangyu 0 3月 15 15:38 zy1.c
其中“-rw-rw-r--”表示文件权限与用户和用户组之间的关系,第一位表示文件类型,剩下的 9 位以 3 位为一组,分别表示文件拥有者的权限,文件拥有者所在用户组的权限以及其它用户权限。后面的“zhangyu zhangyu”分别代表文件拥有者(用户)和该用户所在的用户组,因此文zy1.c 的权限情况如下:
①、文件 zy.c 的拥有者是用户 zhangyu,其对文件 zy1.c 的权限是“rw-”,也就是对该文件拥有读和写两种权限。
②、用户 zhangyu 所在的用户组也叫做 zhangyu,其组内用户对于文件 zy1.c 的权限是“rw-”,也是拥有读和写这两种权限。
③、其它用户对于文件 zy1.c 的权限是“r--”,也就是只读权限。
对于文件,可读权限表示可以打开查看文件内容,可写权限表示可以对文件进行修改,可执行权限就是可以运行此文件(如果是软件的话)。对于文件夹,拥有可读权限才可以使用命令 ls查看文件夹中的内容,拥有可执行权限才能进入到文件夹内部。
如果某个用户对某个文件不具有相应的权限的话就不能进行相应的操作,比如根目录“/”下的文件只有 root 用户才有权限进行修改,如果以普通用户去修改的话就会提示没有权限。比如我们要在根目录“/” 创建一个文件 mytest,使用命令“touch mytest”,结果如下图所示:
在上图中,我以用户“zhangyu”在根目录“/”创建文件 mytest,结果提示我无法创建“mytest”,因为权限不够,因为只有 root 用户才能在根目录“/”下创建文件。我们可以使用命令“sudo”命令暂时切换到 root 用户,这样就可以在根目录“/”下创建文件 mytest 了。
文件的权限有三种:读(r)、写(w)和执行(x),除了用 r、w 和 x 表示以外,我们也可以使用二进制数表示,三种权限就可以使用 3 位二进制数来表示,一种权限对应一个二进制位,如果该位为 1 就表示具备此权限,如果该位为 0 就表示没不具备此权限,如下图所示:
字母 | 二进制 | 八进制 |
r | 100 | 4 |
w | 010 | 2 |
x | 001 | 1 |
如果做过单片机开发的话,就会发现和单片机里面的寄存器位一样,将三种权限 r、w 和 x
进行不同的组合,即可得到不同的二进制数和八进制数,3 位权限可以组出 8 种不同的权限组合,如下表所示:
权限 | 二进制数字 | 八进制数字 |
--- | 000 | 0 |
--x | 001 | 1 |
-w- | 010 | 2 |
-wx | 011 | 3 |
r-- | 100 | 4 |
r-x | 101 | 5 |
rw- | 110 | 6 |
rwx | 111 | 7 |
表 中权限所对应的八进制数字就是每个权限对应的位相加,比如权限 rwx 就是4+2+1=7。前面的文件 zy.c 其权限为“rw-rw-r--”,因此其十进制表示就是:664。
另外我们也开始使用 a、u、g 和 o 表示文件的归属关系,用=、+和-表示文件权限的变化,如下表所示:
字母 | 意义 |
r | 可读权限 |
w | 可写权限 |
x | 可执行权限 |
a | 所有用户 |
u | 归属用户 |
g | 归属组 |
o | 其他用户 |
= | 具备权限 |
+ | 添加某权限 |
- | 去除某权限 |
对于文件 zy.c,我们想要修改其归属用户(zhangyu)对其拥有可执行权限,那么就可以使用:u+x。如果希望设置归属用户及其所在的用户组都对其拥有可执行权限就可以使用:gu+x。
权限管理命令
我们也可以使用 Shell 来操作文件的权限管理,主要用到“chmod”和“chown”这两个命令。
权限修改命令 chmod
命令“chmod”用于修改文件或者文件夹的权限,权限可以使用前面讲的数字表示也可以使用字母表示,命令格式如下:
chmod [参数] [文件名/目录名]
主要参数如下:
- -c 效果类似“-v”参数,但仅回显更改的部分。
- -f 不显示错误信息。
- -R 递归处理,指定目录下的所有文件及其子文件目录一起处理。
- -v 显示指令的执行过程。
命令“chmod”修改一个文件的权限,在用户根目录下创建一个文件 test,然后查看其默认权限,操作如下图 所示:
在上图中我们创建了一个文件:test,这个文件的默认权限为“rw-rw-r--”,我们将其权限改为“rwxrw-rw”,对应数字就是 766,操作如下:
在上图中,我们修改文件 test 的权限为 766,修改完成以后的 test 文件权限为“rwxrwrw-”,和我们设置的一样,说明权限修改成功 。
上面我们是通过数字来修改权限的,我们接下来使用字母来修改权限,操作如下图所示:
上面两个例子都是修改文件的权限,接下来我们修改文件夹的权限,新建一个 test 文件夹,在文件夹 test 里面创建 a.c、b.c 和 c.c 三个文件,如下图所示:
在上图中 test 文件夹下的文件 a.c、b.c 和 c.c 的权限均为“rw-rw-r--”,我们将 test 文件夹下的所有文件权限都改为“rwxrwxrwx”,也就是数字 777,操作如下图所示:,我们利用递归来修改文件权限。
文件归属者修改命令 chown
命令 chown 用来修改某个文件或者目录的归属者用户或者用户组,命令格式如下:
chown [参数] [用户名.<组名>] [文件名/目录]
其中[用户名.<组名>]表示要将文件或者目录改为哪一个用户或者用户组,用户名和组名用“.”隔开,其中用户名和组名中的任何一个都可以省略,命令主要参数如下:
- -c 效果同-v 类似,但仅显示更改的部分。
- -f 不显示错误信息。
- -h 只对符号连接的文件做修改,不改动其它任何相关的文件。
- -R 递归处理,将指定的目录下的所有文件和子目录一起处理。
- -v 显示处理过程
在用户根目录下创建一个 test 文件,查看其文件夹所属用户和用户组,如下图所示:
从上图可以看出,文件 test 的归属用户为 zhangyu,所属的用户组为 zhangyu,将文件 test 归属用户改为 root 用户,所属的用户组也改为 root,操作如下图所示
命令 shown 同样也可以递归处理来修改文件夹的归属用户和用户组,用法和命令 chown一样。
相关文章:

嵌入式软件开发之Linux 用户权限管理
目录 Ubuntu 用户系统 权限管理 权限管理命令 权限修改命令 chmod 文件归属者修改命令 chown Ubuntu 用户系统 Ubuntu 是一个多用户系统,我们可以给不同的使用者创建不同的用户账号,每个用户使用各自的账号登陆,使用用户账号的目的一是方便…...
2023-03-15 RabbitMQ
RabbitMQ整合 官网erlang版本 : 20.3.8.x 官方rabbitMq版本: rabbitmq-server-generic-unix-3.7.14.tar.xz 1.安装 1.1 安装erlang 1.安装环境 yum -y install make gcc gcc-c kernel-devel m4 ncurses-devel openssl-devel2.在/usr/local/下创建erlangapp文件…...

二叉树链式结构的实现
文章目录1.二叉树的遍历1.1前序、中序以及后序遍历1.2代码测试1.3层序遍历1.4二叉树遍历习题2.节点个数以及高度2.1二叉树节点个数2.2叶子节点个树2.3第k层节点个数2.4树的高度1.二叉树的遍历 1.1前序、中序以及后序遍历 学习二叉树结构,最简单的方式就是遍历。所…...

蓝桥杯刷题冲刺 | 倒计时28天
作者:指针不指南吗 专栏:蓝桥杯倒计时冲刺 🐾马上就要蓝桥杯了,最后的这几天尤为重要,不可懈怠哦🐾 文章目录1.卡片2.数字三角形3.购物单4.回文日期1.卡片 题目 链接: 卡片 - 蓝桥云课 (lanqiao…...
一文带你吃透操作系统
文章目录1. 进程、线程管理2. 内存管理3. 进程调度算法4. 磁盘调度算法5. 页面置换算法6. 网络系统7. 锁8. 操作系统知识点文章字数大约1.9万字,阅读大概需要65分钟,建议收藏后慢慢阅读!!!1. 进程、线程管理 进程和线程…...
计算机网络英文简称汇总
分类名词全拼汉译概述B2CBusiness-to-Consumer商对客概述P2PPeer-to-Peer对等概述C/SClient-Server服务器-客户机概述ITUInternational Telecommunication Union国际电信联盟概述IEEEInstitute of Electrical and Electronics Engineers电气与电子工程师协会概述ICCCInternatio…...

腾讯云云服务器标准型S5性能配置简单测评
腾讯云服务器标准型S5实例CPU采用Intel Xeon Cascade Lake或者Intel Xeon Cooper Lake处理器,主频2.5GHz,睿频3.1GHz,标准型S5云服务器基于全新优化虚拟化平台,配有全新的Intel Advanced Vector Extension (AVX-512) 指令集&#…...

RK3568平台开发系列讲解(Linux系统篇)消息队列
🚀返回专栏总目录 文章目录 一、创建消息队列二、发送和接收消息三、内核结构沉淀、分享、成长,让自己和他人都能有所收获!😄 📢消息队列在如下两个方面上比管道有所增强: 消息队列中的数据是有边界的,发送端和接收端能以消息为单位进行交流,而不再是无分隔的字节流…...

2021电赛国一智能送药小车(F题)设计报告
2021电赛国一智能送药小车(F题)设计报告 【写在前面的话】 电赛是一个很奇妙的过程,可能有些人觉得电赛的门槛太高,那便意味着,当你决定要参加电赛的那一刻起,这一段路、这些日子就注定不会太轻松…...

刚工作3天就被裁了....
前言 还有谁?刚上三天班就被公司公司的工作不适合我,叫我先提升一下。 后面我也向公司那边讨要了一个说法,我只能说他们那边的说辞让我有些不服气。 现在之所以把这件事上记录一下,一是记录一下自己的成长轨迹,二是…...

docker安装elasticsearch与head教程完整版—.NET Core Web Api与elasticsearch打造全站全文搜索引擎
默认已经有docker环境 下载与安装 elasticsearch ,从hub.docker里面可以看到最新版本的镜像,选择你想要的版本 本教程是以 7.17.7 为案例,为啥不适用最新的,首先个人一般需用最新的版本,如果有亢很难填,其次…...
蓝桥冲刺31天之315
没有一个冬天不可逾越 也没有一个春天不会来临 所有美好的食物,都会有一个等待的过程 低谷时蛰伏,静默时沉淀 做三四月的事,在八九月自有答案 目录 A:0的个数 题目描述: 输入格式 输出格式 样例输入 样例输出 评测用例规模与…...

常见排序算法
/懂了和写出来是两码事啊啊......orz./ Talk is cheap, show me the code 一、快速排序 直接背模板就能过: 当xq[lr>>1]的边界情况 此时x取的是序列中间靠左的位置(如果序列个数为奇,则取正中间,如果为偶,则取中间靠左),此时如果元素个数为2, 则中间靠左就…...

C语言实现学生成绩管理系统思考
学生成绩管理系统思考 作业要求: 目录 思路 基本函数 学习理解大佬的代码: 完成作业: 思路 学生成绩管理系统,首先要初始化系统, 用C语言做学生实验管理系统要求实现对某班学生3门课程(包括语文、数…...

C++11中Lambda新特性
1.定义 lambda匿名函数的语法格式: [外部变量访问方式说明符](参数)mutablenoexcept/throw()->返回值类型 {函数体; };其中各部分的含义分别为: a.[外部变量方位方式说明符] []方括号用于向编译器表明当前是一个lambda表达式,其不能被省略…...

【jvm系列-01】初识虚拟机与java虚拟机
初识虚拟机与java虚拟机一,虚拟机与java虚拟机1,虚拟机2,java虚拟机3,jvm整体结构图4,jvm的架构模型5,jvm的生命周期6,jvm的种类划分6.1,Sun Classic Vm6.2,Exact VM6.3&…...
「Python 基础」数据库应用编程
Python 定义了一套 DB-API,任何数据库要连接到 Python,只需要提供符合 Python 标准的数据库驱动即可; 文章目录1. 连接 SQLite1. 建表、插入数据2. 查询数据2. 连接 MySQL1. 安装驱动2. 演示连接3. SQLAlchemy1. 安装2. DBSession3. add4. qu…...

一个nginx的小项目,不写代码,实现在局域网内访问其他电脑的网页
准备工作 下载nginx //官网 https://nginx.org/en/download.html //直接下载 https://nginx.org/download/nginx-1.23.3.zip解压 下载一个html项目,或者自己随便写一个 我是直接下载的,然后使用的是第一个01 https://gitee.com/StarPort/HTML_CSSTe…...

23.3.14打卡 2022年江西省大学生程序设计竞赛(正式赛)ABL
就写了签到, 其他题没写, 这场好像3题就银了 纪念一下3.14原粥率日 比赛链接:https://ac.nowcoder.com/acm/contest/43898 A题 Special Adjustment Method 题意 给出非负整数x, y, z 你可以让其中两个数字-1, 另外一个2, 使得x2y2z2x^2y^{2}z^{2}x2y2z2最大 题解 这题很容…...

用idea操作hbase数据库,并映射到hive
依赖条件:需要有Hadoop,hive,zookeeper,hbase环境映射:每一个在 Hive 表中的域都存在于 HBase 中,而在 Hive 表中不需要包含所有HBase 中的列。HBase 中的 RowKey 对应到 Hive 中为选择一个域使用 :key 来对…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...