【Linux】文件归属与迁移:chown修改拥有者、chgrp调整所属组,解决团队协作中的权限交接问题

【Linux】文件归属与迁移:chown修改拥有者、chgrp调整所属组,解决团队协作中的权限交接问题
封面
🔥个人主页:爱和冰阔乐
📚专栏传送门:《数据结构与算法》【C++】【Linux】
🐶学习方向:C++方向学习爱好者
⭐人生格言:得知坦然 ,失之淡然
在这里插入图片描述

🏠博主简介

在这里插入图片描述

文章目录


前言

本文我们来聊聊 Linux 系统中的权限问题,让我们明白 Linux 中的权限是什么,为什么要有权限,以及怎么操作我们的权限,我们一起来看看吧!!

一、shell命令以及运行原理

Linux严格意义上说的是⼀个操作系统,我们称之为“核心(kernel)“,但我们⼀般用户,不能直接使⽤kernel。⽽是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。如何理解?为什么不能直接使⽤kernel?

从技术⻆度,Shell的最简单定义:命令⾏解释器(command Interpreter)主要包含:

  • 将使⽤者的命令翻译给核心(kernel)处理
  • 同时,将核⼼的处理结果翻译给使⽤者

对⽐windows GUI,我们操作windows 不是直接操作windows内核,⽽是通过图形接⼝,点击,从⽽完成我们的操作(⽐如进⼊D盘的操作,我们通常是双击D盘盘符.或者运⾏起来⼀个应⽤程序)(图形窗口是外壳

shell 对于Linux,有相同的作⽤,主要是对我们的指令进⾏解析,解析指令给Linux内核。反馈结果在通过内核运⾏出结果,通过shell解析给用户(命令行是外壳

举例:
帮助理解:如果说你是⼀个闷骚且害羞的程序员,那shell就像媒婆,操作系统内核就是你们村头漂亮的且有让你⼼动的MM⼩花。你看上了⼩花,但是有不好意思直接表⽩,那就让你你家⼈找媒婆帮你提亲,所有的事情你都直接跟媒婆沟通,由媒婆转达你的意思给⼩花,⽽我们找到媒婆姓王,所以我们叫它王婆,它对应我们常使⽤的bash(bash是属于shell的一种)

注意:在本故事中,小花就是操作系统,你就是用户,因为用户不擅长和操作系统内核打交道,那么王婆就是外壳shell,因此如果用户输入错误指令是通过shell进行返回给用户的

总结:
使用外壳程序的原因便是:
1.方便用户操作
2.同时为防止用户输入非法指令,外壳程序会拦住指令不传给内核,变向的保护了内核

二、Linux的用户

Linux下有两种用户:超级用户(root)、普通用户

  • 超级用户:可以再linux系统下做任何事情,不受限制
  • 普通用户: 在linux下做有限的事情
  • 超级用户的命令提⽰符是“#”,普通用户命令提⽰符是“$”。

命令: su [用户名] / su -

功能: 切换用户

例如,要从root用户切换到普通用户user,则使⽤ su user。
要从普通用户user切换到root⽤⼾则使⽤ su root(root可以省略),此时系统会提⽰输⼊root用户的⼝令。

注意:su命令不会让用户重新登录,只是身份的切换,即不影响当前所处的目录下,su -则是以root/user身份重新登录,即用户所处的当前路径发生变化

热键: ctrl +d

功能: 退出当前用户,回到原用户,等同于输入exit

在这里插入图片描述

命令:sudo

作用:用来进行指定的短暂提权的

作用:安装软件,安装到系统时,需要管理员root权限——安装的所有程序其实只安装了一份,允许大家同时使用

在sudo提权时输入的是普通用户的密码,那么代表人人都是root?

举例:

在这里插入图片描述


那肯定不是!我们需要在root权限中,进行 vim /etc/sudoers将普通用户添加到sudoers中,输入自己的密码是为了验证 当前操作是否为该用户本人发起,这里不做仔细介绍,在后续vim使用的文章会有详细介绍

三、权限的概念

权限的本质是:能或者不能做什么事情

权限的作用:
1.控制用户的行为,防止错误的发生,如法律
2.权限首先限制的是角色(人)
3.权限要求目标必须具备对应的属性(如:在牛客上看不了电影,其没有视频播放的属性)

总结·:权限= 角色 + 目标权限属性

Linux下一切问题,面对的都是文件,而文件涉及到的权限属性便是:读,写,执行

3.1 角色分类及其作用

角色分为两类:
1.拥有者(创建的 和 属于者)
2 所属组(⽂件和⽂件⽬录的所有者所在的组的⽤⼾)
3 other(在Linux中不被记录)

在这里插入图片描述

注意:用户账号(root,普通用户)与角色并不冲突,把用户账号理解为张三(具体的人),其扮演的角色是校长,两者并不冲突,是互相补充的

所属组:更精细化的权限管理,首先要有更精细化的身份角色

帮助理解:程序员A和B在同一家公司的不同组中,各自开发相同的程序,若A开发成功则公司奖励A,如果在开发过程,属于A组的组长想看A写的代码,而Linux的角色中只有拥有者和other概念,那么只能把权限公开给other,而组长和B均属于other范围,那么便会导致内容泄密,因此就需要所属组只开放权限给其组内成员

3.2 属性

对于任意一个文件必定包括:读,写,执行,这三个属性,在Linux中的读是 r ,写是 wx 是可执行

在这里插入图片描述

权限位:由于每个权限位均有三个字符,在world.txt文件中,如果允许读 / 写 /执行便出现对应的 r / w / x,不允许便是 -,注意第一个只能是读,第二个是写,不能颠倒顺序

到这,我们便学完了权限的角色和属性,我们便可以小试牛刀来描述下world.txt的权限信息是什么了

该文件的拥有者是root,该文件的拥有者具备读和写文件但不能执行,该文件的所属组是root,其可以对当前文件进行读,不能写和执行,other只能进行读

四、文件访问权限的相关设置方法

4.1 chmod 指令修改属性

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

格式: chmod [参数] 权限 ⽂件名

常用选项:

  • R -> 递归修改⽬录⽂件的权限
  • 说明:只有⽂件的拥有者和root才可以改变⽂件的权限

chmod命令权限值的格式:

  • 用户表⽰符+ /- = 权限字符
  • +: 向权限范围增加权限代号所表⽰的权限
  • -: 向权限范围取消权限代号所表⽰的权限
  • =: 向权限范围赋予权限代号所表⽰的权限
  • 用户符号:
  • u:拥有者
  • g:拥有者同组⽤
  • o:其它用户
  • a:所有用户

实例:
▪ chmod u+w /home/abc.txt
▪ chmod o-x /home/abc.txt
▪ chmod a=x /home/abc.txt• 三位8进制数字 ◦
实例:
▪ chmod 664 /home/abc.txt
▪ chmod 640 /home/abc.txt

修改权限无非是修改属性和角色,那么我们先进行修改其属性

touch my.txt #删除拥有者的读chmod u-r my.txt #添加拥有者读,写,可执行权限chmod u+rwx my.txt #删除所属组的读写权限chmod g-rw my.txt #给other加上写的权限chmod o+w my.txt #进行多个角色的权限修改chmod u-rw,g+rw,o+r my.txt #给所有角色添加读的权限使用achmod a+r my.txt 
在这里插入图片描述


在这里插入图片描述

1.用户只能更改自己的文件权限,如果是root账号便可以改旗下的普通用户权限

在这里插入图片描述

2.如果没有权限,系统会拒绝让我们访问

举例:
去掉文件的读的权限,但是拥有写的权限

touch ll.txt #删除其读的权限chmod u-r ll.txt cat ll.txt echo"hello Linux">ll.txt echo"hello Linux">> ll.txt # 删除其写入权限chmod u-w ll.txt echo"hello Linux">>ll.txt 
在这里插入图片描述


可以写

在这里插入图片描述


最后再去掉其的写入权限

在这里插入图片描述

3.确定权限的信息的时候,系统会先确定用户是谁?拥有者,所属组还是other?

在Centos下,用户角色确定只确定一次,通过判文件的拥有者/所属组和用户是谁进行匹配,顺序是:依次查拥有者,所属组,other(如果先确定你是拥有者,那么只查看拥有者的权限,只确定一次,)

pwdwhoami

4.rootd用户的权限不受权限的约束

5.理解可执行程序的深层含义
举例:
1.自身不可被执行,但拥有可执行权限

touch hello.txt ll echo"你好">>hello.txt chmod u+x hello.txt ./hello.txt 
在这里插入图片描述


2.自身可以被执行,但没有可执行权限

touch cmd.c nano cmd.c #include<stdio.h> int main(){ printf("hello");return0;} gcc cmd.c -o cmd chmod u-x cmd.c ./cmd.c 
在这里插入图片描述

总结:中国有句古话说得好:给你机会你不中用,从中我们便可以看出,想要实现某个事情,需要机会+能力,放在权限里便是,给了该文件的可执行权限,只是表示该文件将来可以被执行,但不代表该文件本身是个可执行文件,因此可执行代表是拥有可执行权限并且本身可以被执行

注意:
1.可执行权限不等于文件可以执行(取决于是不是二进制的可执行文件)
2. 给空文件可执行权限,但其自身是不可被执行的,需要注意的是在centos环境下没有报错的原因是:Bash 把它当作空脚本解析时,因无错误而成功退出,所以没有报错

4.2 八进制修改属性

下面我们通过把拥有者,所属组,其他各自对应的3个字符换算成十进制,看做为八进制(因为其最大的111进行换算是7)进行修改属性,因此以后想要修改属性除了上述的u/g/o方法外,还可以使用八进制

举例:

#拥有者,所属组,其他的读写,可执行权限均被限制chmod ooo cmd #所有角色的读权限加上了chmod444 cmd 
在这里插入图片描述
在这里插入图片描述

4.3 chown /chgrp 指令之修改角色

chown:
功能
:修改⽂件的拥有者

格式:chown [参数] 用户名 ⽂件名

chgrp:
功能:
修改⽂件或⽬录的所属组
格式:chgrp [参数] 用户组名⽂件名
常⽤选项:-R 递归修改⽂件或⽬录的所属组

举例:
将自己的文件交给别人

chown root cmd 
在这里插入图片描述


系统默认不允许我们把文件给别人,是合理的

如果想要给别人则必须提高权限,如root

chown hxx1 hello.txt sudochown hxx1 hello.txt 
在这里插入图片描述

``

可以不用chgrp,只用chown进行修改拥有者和所属组

#一次性修改拥有者和所属组:拥有者:所属组sudochown root:root cmd #只修改所属组还是使用chgrpsudochgrp root cmd 

五、目录权限的管理

5.1 进入目录需要的权限

如果我们想要进入一个目录需要什么权限?

先将文件和用户进行匹配,发现角色为拥有者

whoami
在这里插入图片描述


1.先删除拥有者的读权限,其并没有影响进入目录的权限

chmod u-r lesson cd lesson 
在这里插入图片描述


2.删除写的权限,不影响进入目录

chmod u-w lesson cd lesson 
在这里插入图片描述


3.删除可执行的权限,影响进入目录

chmod u-x lesson cd lesson 
在这里插入图片描述

5.2 r与w权限对目录的影响

那么读和写对于目录有什么意义?

删除读的权限,则无法查看该目录的内容

chmod u-r lesson cd lesson ll #但是可以创建touch1.txt 
在这里插入图片描述


在这里插入图片描述

如果对目录没有w,无法在指定目录内部新建文件

chmod u-w lesson cd lesson touch2.txt 
在这里插入图片描述

默认情况下,我们新建的目录,一般情况下要求rwx权限都要有

5.3 多用户互相隔离

Linux下建立许多个互相不影响的用户,为什么?
在LInux系统中每建立的普通账号是放在/home目录下新建一个特定用户名命名的文件夹:/home/hxx1

hxx1文件夹的拥有者与所属者均为我自己hxx1,只对我自己开放所有权限,对于所属组和other权限是关闭的,那么意味着任何用户无法进入其他用户的家目录,因此用户便可以在权限上实现隔离

在这里插入图片描述


注意:只有root可以修改

5.4 缺省权限

为什么默认(缺省)权限是我们看到的样子?

在这里插入图片描述

对于普通文件来讲:起始权限是从666开始的,默认不带可执行权限

对于目录文件来讲:起始权限是从777开始的,默认携带x

但是在我们自己创建的目录和文件,却和我上述的示例不同,这是因为系统默认会存在一个叫权限掩码的概念

umask
在这里插入图片描述


权限掩码的第一个0不用考虑(与用户有关),002为八进制,对应的二进制便是(000,000,010)

公式:最终权限=起始权限&(~umask)

我们以目录的777为例,其对应的二进制便是 111 111 111,umask为 000 000 010,再对其取反为:111 111 101,再对两者按位与为:111 111 101,对应的八进制为775,因此我们创建的hxx目录为775

umask的目的是什么?

希望凡是在umask中出现的权限,都不应该在最终权限中出现

为什么要有umask?
1.解决 “默认权限不可控” 问题:默认情况下,系统会按固定规则(如文件 666、目录 777)分配权限,无法提前调整;而umask 允许用户 / 系统在创建文件前预设 “权限掩码”,通过 “最大默认权限 - umask” 自动计算最终权限
2.特殊情况下,通过配置umask就可以控制文件的默认权限,让我们的代码是可控的

那么我们怎么修改umask?

umask 0777 mkdir ll 
在这里插入图片描述

5.5 粘滞位——t

一个文件是否能被删除,与文件本身无关,与文件所处的目录权限有关(与文件所处的目录的w权限有关),即毁灭你与你何干

问题:那么如果两个用户之间要进行文件级别的协作,因此协作的文件不能放在任何一个私人账号里,可以放在tmp路径下,文件/目录是共享的,放在根目录/temp下,其权限放开了other的w权限,因此是可以删除文件的,但是我们并不想非文件的拥有者删除对应的文件

在这里插入图片描述


需求:任何一个人都能在共享目录下新建文件,但是不能让非文件拥有者删除,因此Linux中创建了一个新的权限标志位:t(粘滞位),

chmod +t temp_backup rm whb.txt 
在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


由于temp已经添加了粘滞位,我们想要创建共享的文件时,只需在这里面创建即可

总结:
特征:只能给需要共享的目录添加粘滞位
当⼀个⽬录被设置为"粘滞位"(⽤chmod +t ),则该⽬录下的文件只能由超级管理员删除该⽬录的所有者删除该⽂件的所有者删除

总结

以上便是Linux的权限的介绍,学完本文,一定要注意我们文件和目录的权限设置及其保护,可千万别破坏了自己的重要文件哦!!!

坚持到这里,已经很棒啦,希望读完本文可以帮读者大大更好了解Linux的内容!!!如果喜欢本文的可以给博主点点免费的攒攒,你们的支持就是我前进的动力🎆

资源分享:Linux26个重要指令的介绍

Read more

Java微服务架构设计模式:构建云原生时代的分布式系统

Java微服务架构设计模式:构建云原生时代的分布式系统

Java微服务架构设计模式:构建云原生时代的分布式系统 在云计算与微服务盛行的时代,分布式系统已成为企业级应用的核心架构。Java凭借其强大的生态系统和成熟的并发模型,在分布式系统开发中占据主导地位。本文将深入解析Java微服务架构的设计模式、实战经验与最佳实践。 一、微服务架构基础与演进 1.1 从单体架构到微服务 传统单体架构面临的主要挑战包括: * 技术栈僵化:难以采用新技术 * 可扩展性差:只能整体扩展,无法按需缩放 * 交付周期长:微小修改需要整体部署 * 可靠性低:单点故障导致整个系统崩溃 微服务架构通过将应用拆分为一组小型服务解决了这些问题,每个服务: * 围绕业务能力构建 * 可独立部署和扩展 * 拥有独立的数据存储 * 通过轻量级机制通信 单体应用网关服务用户服务订单服务产品服务用户数据库订单数据库产品数据库 图:从单体架构到微服务架构的演进 1.2 Java微服务生态体系 Java拥有最完善的微服务开发生态: 组件类型主流框架特点开发框架Spring Boot快速开发、自动配置服务治理Spring Cloud Netfl

By Ne0inhk
Java 内部类

Java 内部类

文章目录 * 内部类 * 实例内部类 * 静态内部类 * 匿名内部类 * 局部内部类 内部类 1. 一个事物的内部,还需要一个完整的结构进行描述,而这个结构只为外部服务,这个内部的完整结构叫内部类 2. 可以将一个类定义到另一个类内,或一个方法内,里面的是内部类,外面的是外部类 实例内部类 1. 如何实例化内部类 2. 外部类的成员在内部类中都能直接访问 packagetest2;class outClass{privateint a =3;publicstaticint b =2;class inClass{privateint a =1;// 在运行时确定的// static修饰的调用不需要实例化就能调用,而这个变量在内部类需要实例化内部类才能使用// public static int d = 2;publicstaticfinalint d =3;// 在编译的时候就确定了,是个常量,不依赖于实例化publicint

By Ne0inhk
Java最新面试题(全网最全、最细、附答案)

Java最新面试题(全网最全、最细、附答案)

一、Java基础 1、基础概念与常识Java 语言有哪些特点? 1. 面向对象 * 支持封装、继承和多态三大特性 * 代码以类和对象为组织单位 * 示例: publicclassAnimal{publicvoidsound(){System.out.println("动物发出声音");}}publicclassDogextendsAnimal{@Overridepublicvoidsound(){System.out.println("汪汪汪");}} 2. 平台无关性(Write Once, Run Anywhere) * 通过 Java 虚拟机(JVM)实现跨平台 * 编译后的字节码可在不同操作系统运行 * 依赖 JVM 的版本兼容性保证 3. 强类型语言 所有变量必须先声明类型 编译时进行严格类型检查 示例: java int number

By Ne0inhk
Java 泛型擦除深度解析:原理与限制全揭秘

Java 泛型擦除深度解析:原理与限制全揭秘

Java 泛型的设计有个独特之处:类型信息只存在于编译期,运行时会被彻底擦除。这种 “擦除” 机制让很多开发者困惑:为什么List<String>和List<Integer>在运行时是同一个类型?为什么不能用基本类型作为泛型参数?为什么创建泛型数组会报错?今天我们就从泛型擦除的底层原理讲起,彻底搞懂这些问题,看清泛型的 “真面目”。 一、泛型擦除:Java 泛型的 “编译期幻术”         泛型是 Java 5 引入的特性,但为了兼容之前的版本(Java 5 之前没有泛型),Java 采用了类型擦除(Type Erasure) 的实现方式:编译时检查泛型类型合法性,运行时擦除所有泛型信息。也就是说,泛型只在编译期起作用,运行时 JVM 根本不知道泛型参数的存在。 1. 擦除的核心过程:从泛型到原始类型

By Ne0inhk