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

Linux文件结构与文件权限

基于centos了解Linux文件结构

了解一下文件类型

Linux采用的一切皆文件的思想,将硬件设备、软件等所有数据信息都以文件的形式呈现在用户面前,这就使得我们对计算机的管理更加方便。所以本篇文章会对Linux操作系统的文件结构和文件权限进行讲解。

首先我们键入到达~目录

    cd ~   

然后键入ll查看所有非隐藏文件,可以看到在每个文件最前方都有一个由10个字符构成的字符串,就以第一行为例-rw-------.,可以看到第一行的10字符的第一个字符是-,在Linux操作系统中,这个符号就代表着文件是一般文件,也就是我们日常配置、文本文件等这类文件。

在这里插入图片描述

除了一般文件以外,每个文件第一栏的第一个字符还可能出现以下几种情况:

  1. d:代表当前文件为文件夹
  2. l:代表当前文件为超连接文件
  3. b:该文件提供为提供给系统存取的设备,例如你计算机的硬盘所存储的数据内容,可能都会保存在这个类型文件中
  4. c:代表着连接到你计算机的一些硬件设备,例如鼠标、键盘等配置文件开头都是以c开头的

为了验证这一点,我们随意创建一个文件夹:

mkdir /tmp/dir

然后使用ll命令查看其文件属性:

ll /tmp/

可以看到我们创建的文件夹是以d打头的

在这里插入图片描述

上文还提到了一个b打头的文件,这个文件是提供系统存储的数据且可能硬盘也可能是其他存储设备的,这类型文件一般都在设备目录dev下,我们可以进入dev目录看到这些文件:

ll /dev/sda

在这里插入图片描述

而c打头的文件则是硬件设备,我们不妨键入 ll /dev查看一下,如下图所示的BUS总线,以及CPU等这些都是硬件设备:

在这里插入图片描述

同样的在上文中我们也有提到关于隐藏文件的概念,在Linux中隐藏文件大多以.开头,这些文件使用常规的ll、ls等命令是看不到的,必须使用al选项查看所有文件才能看到(补充一句a的意思就是all):

ls -al查看

于是在当前目录的所有文件列表下,我们看到了隐藏目录:

在这里插入图片描述

文件名的限制

在现如今的Linux,文件系统基本采取XFS,所以文件名长度限制基本是255byte以内,说通俗一点,你的文件要是以英文命名就可以起一个长度为255的文件名,若为汉字则长度大约是127。注意由于Linux命令中常会用到-以及一些特殊符号,所以文件命名应该尽量避免以下几个特殊符号:

* ? > < ; & ! [ ] | \ ' " ` ( ) { } -

树形目录结构

Linux的文件结构总的来说类似于一棵树,用户可以按照规范约定在相应的文件夹下存储文件,就例如在var目录下可以存储一些与系统的运作有关的文件例如程序日志文件、在tmp目录下存储一些临时文件等。
需要了解的是,无论是何种Linux系统,他的目录都会遵循一个标准,包括下图中的文件结构,而这个标准名为Filesystem Hierarchy Standard (FHS)

在这里插入图片描述

FHS规定文件的整体结构应该是这样的:

1. /:根目录,与开机系统有关
2. /usr(unix software resource):与软件的安装和执行有关
3. /var(variable):与系统的运作有关

首先介绍一个根目录/,它的子节点文件基本都是和系统开机相关、各种程序、库函数的文件夹,所以在根目录这一级是非常重要的,所以FHS希望后续使用Linux的时候尽量不要将用户的文件夹或者文件存储到这一层级以避免误操作到重要文件导致系统崩溃。

在这里插入图片描述

根目录下有个bin文件夹,我们日常使用Linux的时候都会用到lscattouchmkdir等基本操作命令都存放于bin目录下:

在这里插入图片描述

接下来是/boot,这个目录存放的基本都是Linux开机会用到配置文件,像Linux kerner常用到的文件名 vmlinuz就会存放在这个文件夹下

在这里插入图片描述

接下来是/dev,这个文件夹基本存放的都是硬件设备,我们都知道Linux主张一切皆文件,所以所有的鼠标、键盘、硬盘的设备信息都是存放在这个文件夹下:

在这里插入图片描述

/etc目录则是存放配置文件的地方,常见我们的用户文件/etc/passwd,以及密码文件/etc/shadow,还有系统文件/etc/rc等都会存放在这个目录下。
除此之根目录下还有一些文件夹如下所示,这里就不一一介绍了:

  1. mnt存放挂载相关。
  2. lib存放库函数相关、
  3. sbin存放开机、系统还原、修复等众多指令。
  4. tmp存储临时文件习惯。

我们再来聊聊FHS规范中一个命名比较特殊导致用户使用时常受到误导的文件夹/usr,很多人最初都会误以为这是user的缩写,其实这个单词是unix software resource的缩写,这个文件夹是FHS规定存放软件资源相关的文件夹,他们建议用户软件相关的资源尽可能都放到这个目录。

首先来看看/usr/bin目录,这个目录实质上就FHS希望用户能够将一般用户所能够的使用的指令都放到这个目录下,所以我们在日常软件安装时对应各种启动指令脚本都建议存放到这个位置。此外usrbin目录下还存放了系统指令的软连接,参见下图:

在这里插入图片描述

除此之外usr下还有3个常见的目录:
1./usr/lib与根目录的lib功能相同,存放的基本是lib目录下的软链接。
2. /usr/local/则是FHS希望用户将下载的软件都放到这个目录下统一管理
3. /usr/sbin同样也是将根目录的sbin目录下的指令软链接到此。

最后我们再来介绍一些/var,这个目录FHS认为应该存放那些经常发生变化的文件,例如日志,他们希望日志统一存放到/var/log下。/var/lib存放的则是会临时改变的库文件。而/var/lock存放的则是被某个程序锁定的文件,已确保其他程序不会同时使用到这个文件。

在这里插入图片描述

绝对路径和相对路径

绝对路径则是以根节点作为其实节点的文件搜寻办法,例如我们想到达tmp文件夹,如果使用绝对路径的方式则是

cd /tmp

假如我们在boot目录下,而tmp和他一样都属root的子节点,所以使用相对路径的方式是先退到root目录,然后再进入tmp文件夹,如下图,所以在boot目录下,我们进入tmp文件夹的命令为 cd ../tmp/:

在这里插入图片描述

演示结果参见下图:
在这里插入图片描述

注意:../代表着退到上一级,那么就会有这么一个指令./,代表当前目录,这个指令是干什么用的是,很简单,假如我们Linux中某个sh文件不在binsbin/usr/bin这样的目录下,Linux规定我们执行可执行sh文件文件时都必须标明./,例如我在tmp目录下有个执行脚本test,那么我在test目录下执行这个脚本的格式就必须是

sh ./test.sh

文件权限

权限对应角色

我们在随意一个目录下键入ll查看文件信息,如下图我们可以看到每个文件的第一栏除去第一个字符串代表着文件类型外,其余字符都会显示rwx-相关,其含义为:

  1. r代表读权限。
  2. w代表写权限。
  3. x代表执行权限。

在这里插入图片描述

我们以dir的文件描述为例,第一个字符d代表它是个文件夹,2-4代表当前所有者权限为读写执行都有,而5-7代表所属组权限,即这个文件所属的组所拥有的权限为读和执行,最后一行代表其他人的权限也是读和执行。

d   rwx   r-x     r-x.

针对dir文件夹,可以看到第3列为root,说明这个文件属于root的,root用户拥有这个文件夹的读写执行权限。而第4列也为root,说明属于root组的用户拥有读写执行的权限。

假如此时有个名为xiaoming的用户进来,它属于xiaomingzu,那么对于这个dir文件夹而言,他就是other用户,那么它的权限只有读和执行。

文件夹与文件对应权限的相似与区别

Linux系统下文件系统下,文件的可执行权限和文件夹的可执行权限是有所不同的。假如一个用户对文件夹只有读和写权限,那么他就无法进入到这个目录,如下所示,我们有root创建一个testDir,所以对于其他用户来说只有读和写权限。
注意一下笔者赋权的命令,这里我们需要了解一下Linux中读权限用4表示,写权限用2表示,执行用1表示,所以766(4+2+1)+(4+2)+(4+2)代表着所属者读写执行,所属组和其他都是读和执行:

# 进入tmp目录cd /tmp/# 创建testDir文件夹
mkdir testDir# 设置这个文件夹 所属者有所有权限 所属组和其他用户只有读和写权限
chmod 766 testDir/

当笔者以其他用户登录(这个用户不是所属者root也不属于root组)时,就会报出没有权限的问题

在这里插入图片描述

这时候我们希望其他用户可以有执行的权限,要怎么做呢?很简单,我们也可以参考上面的数学公司对其他用户增加执行权限:

chmod 777 /test/testDir

当然我们也可以单独对其他用户增加一个可执行权限,命令如下所示,可以看到其他为o,增加一个可执行权限为+x。同理可知若是所者为u,所属组为g。增加权限用+,减去权限用-,赋值权限用=:

其他用户对于testDir文件夹的操作增加执行权限
chmod o+x testDir/

所以我们若希望所属者赋值为所有权限则是u=rwx,所属组和其他都希望是读和执行,那就是g和o合在一起写,并=rx,如下所示:

 chmod u=rwx,go=rx testDir/

当然有时候你希望这个文件改变所属组,你可以使用chgrp 指令,如下所示,这样意义文件夹所属组就改为otheruser

# 将文件夹testDir所属组改为otheruser
chgrp otherusertestDir/

同理若你希望改变所有者则可以使用chown :

chown otherusertestDir testDir/

当然,若你希望所有者和所属组都能改变则可以:

# 将testDir所有者改为冒号左边的root,将所属组改为冒号右边的root
chown root:root testDir/

在这里插入图片描述

回到问题,为了方便演示文件和文件夹可执行权限的区别,我们将文件夹所属者和所属者都改为root,并且所有用户都具备所有权限:

chmod 777 testDir/
chown root:root   testDir/

在这里插入图片描述

然后进去该文件夹,创建一个file1的文件,权限设置为700,即所属者才有权限,所属组和其他没有任何权限:

cd testDir/touch file1chmod 700 file1

使用ll -d查看testDir文件夹以及文件夹下对应的文件file1的权限,可以发现对于其他用户而言文件夹有所有的权限,而文件没有任何权限:

ll -d  /tmp/testDir/ /tmp/testDir/file1

在这里插入图片描述

所以我们使用别的账户可以进入路径,但是无法读写该文件如下图:

在这里插入图片描述

vim file1

在这里插入图片描述
但是以为其他用户拥有file文件的目录testDir的执行权限,所以它可以将这个文件删除。所以得出结论,文件夹的可执行权限意为着可以删除这个文件夹下所有的文件,但是并不意味着可以修改或者读取文件夹下文件的内容。

这种情况我们完全可以将文件夹testDir看作一个抽屉,任何人对其都有任何权限。此时root往里面放了一个小保险盒,读写权限只有root有。所以其他用户是无法打开或者修改盒子中的内容。但是他具有抽屉(testDir)的所有权限,所以他可以将这个保险盒扔掉。

在这里插入图片描述

以下这张表格就说明了操作文件夹下某些文件所需的最低权限,可以看到像删除、复制等这些无需读取文件内容的操作,文件所对应的文件夹甚至不一定需要rw的权限。用上面抽屉和文件的例子来说,我们删除完完全全可以看不到抽屉内部文件的具体的内容,复制文件不需要知道文件夹内有什么文件,我们完完全全可以瞎摸出来放到别的目录。
在这里插入图片描述

umask设置默认权限

默认情况下,用户创建的文件权限为:rw-rw-rw-,对应的数字为666,而文件夹则是:rwxrwxrwx对应数字是777。那是什么原因导致我们最后创建出来的文件权限变成rw-r--r--(644)以及文件夹变成rwxr-xr-x(755)呢?

答案就是umaskumask和默认权限进行取反和按位与运算,从而得出文件和文件夹创建的实际文件。
先来演算一下文件的权限运算,加入我们创建一个文件file

touch file

可以看到它的权限为0644(因为权限位最前面是-,说明是一般文件,可直接视为0)

-rw-r--r-- 1 root root    0 Dec  6 14:39 file

以上文所说,默认是0666,然后和0022进行取反按位与运算,所以我们首先对0022进行取反得到7755

在这里插入图片描述

然后和0666进行按位与运算,最终得出文件默认权限为rw-r--r--,文件夹同理这里就不多做演示:

  7755
& 06660644

上述运算属于标准的推算步骤,对于取反按位与这种运算,读者可直接视为减法,例如文件默认权限为0666,而umask为0022,两者直接相减即可直接得到0644。

如果我们希望文件权限保持最原始的权限,那么我们可以将umask改为0000

umask 0000

创建的文件权限就是 666,创建的文件夹就是 777

参考文献

鸟哥的Linux私房菜:https://book.douban.com/subject/4889838/

循序渐进Linux(第2版):https://book.douban.com/subject/26758194/

相关文章:

Linux文件结构与文件权限

基于centos了解Linux文件结构 了解一下文件类型 Linux采用的一切皆文件的思想&#xff0c;将硬件设备、软件等所有数据信息都以文件的形式呈现在用户面前&#xff0c;这就使得我们对计算机的管理更加方便。所以本篇文章会对Linux操作系统的文件结构和文件权限进行讲解。 首先…...

CentOS上安装和配置Apache HTTP服务器

在CentOS系统上安装和配置Apache HTTP服务器可以为您的网站提供可靠的托管环境。Apache是开源的Web服务器软件&#xff0c;具有广泛的支持和强大的功能。下面是在CentOS上安装和配置Apache HTTP服务器的步骤&#xff1a; 步骤一&#xff1a;安装Apache HTTP服务器 打开终端&am…...

前端知识(十二)———ES6迭代器

ES6中的迭代器是一种新的对象&#xff0c;它具有一个next()方法。next()方法返回一个对象&#xff0c;这个对象包含两个属性&#xff1a;value和done。value属性是迭代器中的下一个值&#xff0c;done属性是一个布尔值&#xff0c;表示迭代器是否已经遍历完所有的值。迭代器是一…...

云端仓库平台

SpringBoot MySQL Vue 等技术实现的云端仓库 技术栈 核心框架&#xff1a;SpringBoot 持久层框架&#xff1a;MyBatis-Plus 前端框架&#xff1a;Vue 数据库&#xff1a;MySQL 项目包含源码和数据库文件。 效果图如下&#xff1a;...

php第三方skd自动加载

把mugou-sdk复制到项目下在composer.josn找到classmap加入sdk "autoload": {"classmap": ["mugou-sdk"] },在composer.josn找到files加入sdk "autoload": {"files":[mugou-sdk] },项目目录下运行 composer dump-autoload…...

Golang channle(管道)基本介绍、快速入门

channel(管道)-基本介绍 为什么需要channel&#xff1f;前面使用全局变量加锁同步来解决goroutine的通讯&#xff0c;但不完美 1)主线程在等待所有goroutine全部完成的时间很难确定&#xff0c;我们这里设置10秒&#xff0c;仅仅是估算。 2)如果主线程休眠时间长了&#xff0c…...

盘点六款颇具潜力的伪原创AI工具

写作作为信息传递的主要媒介&#xff0c;在庞大的信息海洋中&#xff0c;为了在激烈的竞争中脱颖而出&#xff0c;伪原创AI工具成为越来越多写手的神秘利器。在本文中&#xff0c;我们将深入盘点六款颇具潜力的伪原创AI工具&#xff0c;为你揭开它们神秘的面纱。 1. 文心一言 …...

基于SSM的健身房预约系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…...

postgresql自带指令命令系列二

简介 在安装postgresql数据库的时候会需要设置一个关于postgresql数据库的PATH变量 export PATH/home/postgres/pg/bin:$PATH&#xff0c;该变量会指向postgresql安装路径下的bin目录。这个安装目录和我们在进行编译的时候./configure --prefix [指定安装目录] 中的prefix参…...

ABAP - Function ALV 02 简单开发一个Function ALV

了解Function ALV&#xff1a; https://blog.csdn.net/HeathlX/article/details/134879766?spm1001.2014.3001.5501程序开发步骤&#xff1a;① TCODE:SE38创建程序 ② 编写程序 DATA gt_spfli TYPE TABLE OF spfli.** Layout 变量定义 (固定使用 直接粘贴复制即可) DATA gs…...

IDEA启动失败报错解决思路

IDEA启动失败报错解决思路 背景&#xff1a;在IDEA里安装插件失败&#xff0c;重启后直接进不去了&#xff0c;然后分析问题解决问题的过程记录下来。方便下次遇到快速解决。也是一种解决问题的思路&#xff0c;分享出去。 启动报错信息 Internal error. Please refer to https…...

密码学学习笔记(二十三):哈希函数的安全性质:抗碰撞性,抗第一原象性和抗第二原象性

在密码学中&#xff0c;哈希函数是一种将任意长度的数据映射到固定长度输出的函数&#xff0c;这个输出通常称为哈希值。理想的哈希函数需要具备几个重要的安全性质&#xff0c;以确保数据的完整性和验证数据的来源。这些性质包括抗碰撞性、抗第一原象性和抗第二原象性。 抗碰…...

STM32-GPIO编程

一、GPIO 1.1 基本概念 GPIO&#xff08;General-purpose input/output&#xff09;通用输入输出接口 --GP 通用 --I input输入 --o output输出 通用输入输出接口GPIO是嵌入式系统、单片机开发过程中最常用的接口&#xff0c;用户可以通过编程灵活的对接口进行控制&#xff0c;…...

Go语言基础知识学习(一)

Go基本数据类型 bool bool型值可以为true或者false,例子&#xff1a; var b bool true数值型 类型表示范围int8有符号8位整型-128 ~ 127int16有符号16位整型-32768 ~ 32767int32有符号32位整型-2147783648 ~ 2147483647int64有符号64位整型uint8无符号8位整型0 ~ 255uint16…...

Vue 3项目的目录结构

使用vite创建完VUE项目后&#xff0c;使用VS Code编辑器打开项目目录&#xff0c;可以看到一个默认生成的项目目录结构 下图是目录结构&#xff1a; 详细介绍.vscode&#xff1a;存放VS Code编辑器的相关配置。 node_modules&#xff1a;存放项目的各种依赖和安装的插件。…...

RPG项目01_技能释放

基于“RPG项目01_新输入输出”&#xff0c; 修改脚本文件夹中的SkillBase脚本&#xff1a; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; //回复技能&#xff0c;魔法技能&#xff0c;物理技能…...

Leetcode—209.长度最小的子数组【中等】

2023每日刷题&#xff08;五十六&#xff09; Leetcode—209.长度最小的子数组 实现代码 class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {int left 0, right 0;int ans nums.size() 1, s 0;for(; right < nums.size(); righ…...

Nacos源码解读12——Nacos中长连接的实现

短连接 VS 长连接 什么是短连接 客户端和服务器每进行一次HTTP操作&#xff0c;就建立一次连接&#xff0c;任务结束就中断连接。 长连接 客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭&#xff0c;客户端再次访问这个服务器时&#xff0c;会继续使用这一条已经建立…...

k8s 安装部署

一&#xff0c;准备3台机器&#xff0c;安装docker&#xff0c;kubelet、kubeadm、kubectl firewall-cmd --state 使用下面命令改hostname的值&#xff1a;(改为k8s-master01)另外两台改为相应的名字。 172.188.32.43 hostnamectl set-hostname k8s-master01 172.188.32.4…...

TCP/IP五层(或四层)模型,IP和TCP到底在哪层?

文章目录 前言一、应用层二.传输层三.网络层&#xff1a;四.数据链路层五.物理层&#xff1a;六.OSI七层模型&#xff1a;1.物理层&#xff08;Physical Layer&#xff09;&#xff1a;2.数据链路层&#xff08;Data Link Layer&#xff09;&#xff1a;3.网络层&#xff08;Ne…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...