六十天Linux从0到项目搭建(第五天)(file、bash 和 shell 的区别、目录权限、默认权限umask、粘滞位、使用系统自带的包管理工具)
1. file [选项] 文件名
- 用于确定文件类型的实用工具。它会通过分析文件内容(而不仅仅是文件扩展名)来判断文件的实际类型
示例输出解析
$ file /bin/bash
/bin/bash: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=..., stripped
这段输出告诉我们:
- 这是一个 ELF 格式的可执行文件
- 64位架构,x86-64指令集
- 动态链接
- 为 GNU/Linux 系统编译
- 已被剥离调试符号
2. bash 和 shell 的区别
-
Shell:是用户与操作系统内核交互的命令行界面,是统称
-
Bash (Bourne Again Shell):是Shell的一种具体实现,是Linux系统中最常用的shell
类比法就是
-
Shell 是「智能家居中控系统」的通用标准(比如所有品牌都支持的 Zigbee 协议)。
-
Bash 是某品牌的中控系统(比如小米 HomeKit),功能更强大、用户最多,但本质仍是 Shell 的一种实现
3 目录权限的深度解析(从文件系统角度理解)
1. 进入目录(cd)需要什么权限?
必须权限:x(执行权限)
-
为什么?
-
目录的本质是一个记录子文件位置的特殊文件,
x权限控制你能否“执行”这个目录(即访问其内容)。 -
类比:进入房间需要钥匙(
x),即使你知道房间里有东西(r),没有钥匙也进不去。
-
验证:
chmod -x dir/ # 移除 x 权限
cd dir/ # 报错:Permission denied
2. 目录的 r(读权限)代表什么?
作用:允许查看目录下的文件名和基础属性(如 ls)
-
无
r权限时:-
ls dir/→ 报错Permission denied,但已知完整路径的文件仍可访问! -
文件系统原理:
-
r仅控制读取目录条目(dirent结构),不影响通过完整路径访问文件。
-
-
验证:
chmod -r dir/ # 移除 r 权限
ls dir/ # 失败
cat dir/known_file # 成功(需有文件本身的 r 权限)
3. 目录的 w(写权限)代表什么?
作用:允许修改目录内容(创建/删除/重命名文件)
-
无
w权限时:-
touch dir/new_file→ 报错Permission denied -
关键点:删除文件需要父目录的
w,而非文件本身的权限!
-
文件系统原理:
-
目录的
w权限控制其inode中“子文件列表”的修改权。
验证:
chmod -w dir/
touch dir/new_file # 失败
rm dir/old_file # 失败(即使 old_file 可写)
4. 目录权限的底层逻辑(文件系统视角)
| 权限 | 对应操作 | 影响的文件系统操作 |
|---|---|---|
r | 读取目录条目 | readdir() 系统调用 |
w | 修改目录条目 | unlink()(删除)、rename()(重命名) |
x | 进入目录/访问子文件元数据 | open() 文件时需要检查父目录的 x |
为什么这样设计?
-
安全分层:防止用户绕过权限直接操作文件(如通过
rm删除只读文件)。 -
性能优化:
x权限避免频繁检查子文件权限。
5. 特殊场景与误区
(1) 无 r 但能访问已知文件
chmod -r dir/
cat dir/secret.txt # 成功(若 secret.txt 有 r 权限)
-
原因:文件系统通过完整路径直接定位 inode,不依赖父目录的
r。
(2) 无 x 但能 stat 文件
chmod -x dir/
stat dir/file # 失败!需父目录 x 权限
-
原因:访问文件元数据(如大小、时间)需要父目录的
x。
(3) 目录粘滞位(t)
chmod +t /tmp # 仅文件所有者可删除自己的文件
-
用途:共享目录(如
/tmp)中防止他人删除你的文件。
6. 总结:目录权限三要素
| 权限 | 关键作用 | 无权限时的表现 |
|---|---|---|
r | 查看目录内容(文件名) | ls 失败,但已知路径可访问文件 |
w | 修改目录内容(增删改文件) | 无法创建/删除/重命名文件 |
x | 进入目录或访问子文件元数据 | cd 和 stat 均失败 |
4. 文件与目录默认权限的底层逻辑(umask 机制详解)
1. 默认权限的起点
-
普通文件:系统设定的起始权限是
666(-rw-rw-rw-)-
所有用户可读、可写,但不可执行(安全考虑,避免随意运行未知文件)。
-
-
目录:系统设定的起始权限是
777(drwxrwxrwx)-
所有用户可读、写、进入(目录需要
x权限才能访问内容)。
-
为什么目录比文件多
x?
文件
x是“执行”,目录x是“进入/搜索”,二者含义不同。目录必须允许
x,否则无法cd或访问子文件。
2. 权限掩码(umask)的作用
-
umask 是系统的一个权限过滤器,用于从起始权限中屏蔽某些权限。
-
规则:
最终权限 = 起始权限 & (~umask)
(即从起始权限中移除 umask 指定的权限)
查看当前 umask:
umask # 默认输出(如 0022)
umask -S # 符号格式(如 u=rwx,g=rx,o=rx)
3. 默认 umask 值(常见场景)
-
Linux 普通用户:
0002→ 屏蔽other的w权限。 -
Linux root 用户:
0022→ 屏蔽group和other的w权限。
计算示例:
-
普通文件(起始
666)-
umask
022→ 移除group和other的w666: rw- rw- rw- & ~022: rw- r-- r-- ------------------- 644: rw- r-- r-- -
实际权限:
-rw-r--r--(所有者可读写,其他人只读)。
-
-
目录(起始
777)-
umask
022→ 移除group和other的w777: rwx rwx rwx & ~022: rwx r-x r-x ------------------- 755: rwx r-x r-x -
实际权限:
drwxr-xr-x(所有者全权,其他人不可修改目录内容)。
-
4. 为什么普通文件默认 664(而非 644)?
-
现代 Linux 发行版(如 Ubuntu)默认 umask 为
0002(而非0022):-
普通用户创建文件时:
666 & ~002 = rw- rw- r-- → 664
-
目的:允许同组用户协作编辑文件(适合多用户环境)。
-
验证:
umask 0002 # 临时设置 umask
touch test.txt
ls -l test.txt # 输出 -rw-rw-r--
5. 修改 umask 的注意事项
-
临时修改(仅当前会话有效):
umask 0027 # 屏蔽 group 的 w 和 other 的所有权限 -
永久修改:
将umask 002添加到~/.bashrc或/etc/profile。 -
安全建议:
-
root 用户应保持
umask 022或更严格(如027)。 -
共享目录可设
umask 002(组内协作)。
-
6. 特殊场景
-
可执行文件:
-
若文件本身需要执行权限(如脚本),需手动添加
x:chmod +x script.sh
-
-
目录的粘滞位(
t):-
设置后(如
/tmp),即使有w权限,用户也只能删除自己的文件:chmod +t /shared_dir
-
总结:权限设计的核心逻辑
| 对象 | 起始权限 | umask 作用 | 常见默认权限 |
|---|---|---|---|
| 普通文件 | 666 | 移除 w(防止误改) | 664(用户)、644(root) |
| 目录 | 777 | 保留 x(确保可进入) | 775(用户)、755(root) |
关键点:
-
umask 不添加权限,只从起始权限中屏蔽。
-
目录必须保留
x,否则无法访问子文件。 -
权限设计遵循最小特权原则,平衡安全与便利。
5. 粘滞位(Sticky Bit)详解:保护共享目录中的用户文件
1. 问题背景
-
共享目录场景:
- 由
root创建一个目录(如/shared_tmp),供所有用户存放临时文件。 - 目录权限通常为
777(drwxrwxrwx),允许所有用户读写。
- 由
-
风险:
- 虽然文件受权限约束(如
-rw-r--r--),但任何有目录w权限的用户都能删除他人的文件! - 原因:Linux 中,删除文件需要父目录的
w权限,而非文件本身的权限。
- 虽然文件受权限约束(如
2. 粘滞位的作用
-
粘滞位(Sticky Bit) 是一种特殊的目录权限,设定后:
- 用户只能删除自己创建的文件,即使目录是
777。 - 典型应用:
/tmp目录(所有用户可写,但无法随意删别人的文件)。
- 用户只能删除自己创建的文件,即使目录是
查看 /tmp 的权限:
ls -ld /tmp # 输出示例:drwxrwxrwt
注意最后的 t,表示粘滞位已设置。
3. 如何设置粘滞位?
方法 1:符号模式(推荐)
chmod +t /shared_dir
方法 2:数字模式
chmod 1777 /shared_dir # 1xxx 中的 1 表示粘滞位
验证:
ls -ld /shared_dir # 输出应包含 `... rwt` 或 `... rwT`
t:粘滞位 + 其他人有x权限。T:粘滞位 + 其他人无x权限(罕见,可能配置错误)。
4. 粘滞位的规则
| 操作 | 无粘滞位(普通 777 目录) | 有粘滞位(1777 目录) |
|---|---|---|
| 用户创建文件 | 可以 | 可以 |
| 用户删除自己的文件 | 可以 | 可以 |
| 用户删除他人文件 | 可以(只要有目录 w 权限) | 禁止 |
| root 用户删除文件 | 可以 | 可以(root 不受限制) |
关键点:
-
粘滞位仅影响文件删除,不影响读取或修改文件内容(文件自身的
rw权限仍有效)。 -
谁可以删除文件?
-
文件所有者、目录所有者、
root。
-
5. 为什么需要粘滞位?
-
共享目录的权限矛盾:
-
若目录无
w权限 → 用户无法创建文件。 -
若目录有
w权限 → 用户可删除他人文件。
-
-
粘滞位的平衡:
-
允许所有人创建文件(
777),但禁止随意删除他人文件(+t)。
-
6. 实际应用示例
场景:创建一个共享临时目录 /shared_tmp,要求:
-
所有用户可读写。
-
用户只能删除自己的文件。
步骤:
# 1. 创建目录并设置权限
sudo mkdir /shared_tmp
sudo chmod 1777 /shared_tmp # 或 chmod a+rwxt /shared_tmp# 2. 验证权限
ls -ld /shared_tmp # 应显示 drwxrwxrwt# 3. 测试(用户A和用户B)
# 用户A创建文件
touch /shared_tmp/userA_file# 用户B尝试删除(失败)
rm /shared_tmp/userA_file # 报错:Operation not permitted
7. 常见问题
Q1:粘滞位对文件有效吗?
-
无效!粘滞位仅适用于目录。对文件设置
+t会被忽略(显示为T)。
Q2:为什么 /tmp 默认有粘滞位?
-
因为
/tmp是系统级共享目录,需防止用户互相删除文件导致安全问题。
Q3:如何移除粘滞位?
chmod -t /shared_dir
总结:粘滞位的核心逻辑
| 权限 | 作用 |
|---|---|
目录 w | 控制能否在目录内创建/删除文件。 |
粘滞位 t | 限制删除权限(仅允许所有者删除)。 |
6. 使用系统自带的包管理工具(推荐)
- 在 Linux 服务器上安装软件,主要通过 包管理工具 来实现,类似于手机上的应用商店。以下是详细的操作流程和常见方法:
不同的 Linux 发行版有不同的包管理工具,最常见的是:
| Linux 发行版 | 包管理工具 | 安装命令示例 |
|---|---|---|
| Ubuntu/Debian | apt (Advanced Package Tool) | sudo apt install 软件名 |
| CentOS/RHEL | yum 或 dnf | sudo yum install 软件名 或 sudo dnf install 软件名 |
| Arch Linux | pacman | sudo pacman -S 软件名 |
| openSUSE | zypper | sudo zypper install 软件名 |
示例(Ubuntu/Debian 系统)
# 1. 更新软件包列表(获取最新软件信息)
sudo apt update# 2. 安装软件(如 nginx)
sudo apt install nginx# 3. 卸载软件
sudo apt remove nginx
优点:
自动解决依赖关系(类似手机应用商店一键安装)。
官方软件库,安全稳定。
相关文章:
六十天Linux从0到项目搭建(第五天)(file、bash 和 shell 的区别、目录权限、默认权限umask、粘滞位、使用系统自带的包管理工具)
1. file [选项] 文件名 用于确定文件类型的实用工具。它会通过分析文件内容(而不仅仅是文件扩展名)来判断文件的实际类型 示例输出解析 $ file /bin/bash /bin/bash: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, i…...
信源的分类及数学模型
信源的分类及数学模型 按照信源发出的时间和消息分布分为离散信源和连续信源 按照信源发出符号之间的关系分为无记忆信源和有记忆信源 单符号离散信源(一维离散信源) 信源输出的消息数有限或可数,且每次只输出符号集的一个消息 样本空间&…...
嵌入式硬件工程师从小白到入门-PCB绘制(二)
PCB绘制从小白到入门:知识点速通与面试指南 一、PCB设计核心流程 需求分析 明确电路功能(如电源、信号处理、通信)。确定关键参数(电压、电流、频率、接口类型)。 原理图设计 元器件选型:匹配封装、电压、…...
抽象工厂设计模式及应用案例
引言 在软件开发中,合理的设计模式可以有效地提高代码的可维护性、可扩展性和可重用性。抽象工厂模式(Abstract Factory Pattern)便是一个重要的创建型设计模式,它允许我们在不指定具体类的情况下,创建一系列相关或相…...
LVS NAT模式实现三台RS的轮询访问
节点规划: 配置RS: RS1-RS3的网关配置均为 192.168.163.8 配置RS1: [rootlocalhost ~]# hostnamectl hostname rs1 [rootlocalhost ~]# nmcli c modify ens160 ipv4.method manual ipv4.addresses 192.168.163.7/24 ipv4.gateway 192.168.163.8 conne…...
LSM-Tree(Log-Structured Merge-Tree)详解
1. 什么是 LSM-Tree? LSM-Tree(Log-Structured Merge-Tree)是一种 针对写优化的存储结构,广泛用于 NoSQL 数据库(如 LevelDB、RocksDB、HBase、Cassandra)等系统。 它的核心思想是: 写入时只追加写(Append-Only),将数据先写入内存缓冲区(MemTable)。内存数据满后…...
uni-app jyf-parser将字符串转化为html 和 rich-text
uni-app jyf-parser将字符串转化为html-CSDN博客 方法二: rich-text | uni-app...
Docker+Ollama+Xinference+RAGFlow+Dify部署及踩坑问题
目录 一、Xinference部署 (一)简介 (二)部署 (三)参数 (四)错误问题 (五)Xinference配置Text-embedding模型 (六)Xinference配…...
CentOS 7 搭建基于匿名用户的 FTP 服务
1. 安装 VSFTPD yum install vsftpd -y 2. 配置 VSFTPD 编辑主配置文 vi /etc/vsftpd/vsftpd.conf 以下配置项存在或修改为对应值 anonymous_enableYES # 启用匿名用户 local_enableNO # 禁用本地用户 write_enableYES # 允许写入(若需要匿名上传࿰…...
【机器学习】什么是线性回归?
什么是线性回归? 线性回归是一种 监督学习算法,它通过拟合一个直线(或平面,高维空间下是超平面)来建立 输入特征 和 输出目标 之间的关系。简单来说,线性回归就是找出一个数学方程(通常是线性方…...
零、ubuntu20.04 安装 anaconda
1.anaconda下载 地址:Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 选择:Anaconda3-2023.07-2-Linux-x86_64.sh 2.anaconda安装 选择下载目录,选在在终端中打开,然后在终端输入安装命…...
Web纯前端实现在线打开编辑保存PPT幻灯片
很多项目中有时会需要在线打开PPT并编辑保存到服务器。猿大师办公助手可以完美调用本地office在线打开ppt文件,跟本地打开效果一样。还可以在线打开word、excel、pdf等文件,支持本机OFFICE完整嵌入模式,本机OFFICE所有功能基本都可以在网页上…...
LeetCode热题100精讲——Top3:最长连续序列【哈希】
你好,我是安然无虞。 文章目录 题目背景最长连续序列C解法Python解法 题目背景 如果大家对于 哈希 类型的概念并不熟悉, 可以先看我之前为此专门写的算法详解: 蓝桥杯算法竞赛系列第九章巧解哈希题,用这3种数据类型足矣 最长连续序列 题目链接&#x…...
vue2相关 基础命令
vue2 基础命令 vue简介,Vue 2 已于 2023 年 12 月 31 日停止维护。详见 Vue 2 终止支持 (EOL)。 安装完 Visual Studio Code后,打开项目目录, 在目录位置输入cmd,然后在命令行输入 code . 就可以在VScode打开项目。 公司的前后端…...
2025年渗透测试面试题总结-某 长亭(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 长亭 一、Spring SpEL表达式注入漏洞 1. 技术原理 2. 利用条件 3. 攻击方法 4. 防御策略 二、Jav…...
【web3】
检测钱包是否安装 方法一 // npm install metamask/detect-provider import detectEthereumProvider from metamask/detect-provider// 检测钱包是否安装 const isProvider await detectEthereumProvider() if(!isProvider) {proxy.$modal.msgError("请安装钱包")…...
Ubuntu部署Dufs文件服务器
安装dufs 安装cargo apt install cargo升级rust工具链 apt install rustup rustup update stable查看rust版本,需要>1.81 rustc --version安装dufs cargo install dufs将dufs加入环境变量 sudo vim ~/.bashrc export PATH"$HOME/.cargo/bin:$PATH" sou…...
速卖通API数据清洗实战:从原始JSON到结构化商品数据库
下面将详细介绍如何把速卖通 API 返回的原始 JSON 数据清洗并转换为结构化商品数据库。 1. 数据获取 首先要借助速卖通 API 获取商品数据,以 Python 为例,可使用requests库发送请求并得到 JSON 数据。 import requests# 替换为你的 API Key 和 Secret …...
前端模拟 websocket 请求小工具
背景: 后端写好websocket 接口后,用postman的某些版本无法直接模拟websocket请求,所以想着自制一个小工具。 使用方法: 直接复制以下代码到文本文件中,修改服务端端地址,保存为 .html的后缀名,…...
docker安装hyperf环境,连接本机redis问题处理
错误信息显示“Connection refused”,这通常说明 Docker 容器内的 Hyperf 项目无法连接到你本机的 Redis 服务。 1. 容器内的 127.0.0.1 指向问题 在 Docker 容器中,127.0.0.1 指的是容器本身,而不是宿主机(你的 Mac)…...
【极速版 -- 大模型入门到进阶】快速了解大型语言模型
文章目录 🌊 大模型作为一种生成式人工智慧,厉害在哪儿?-> 通用能力🌊 LLM 如何生成输出:简而言之就是文字接龙🌊 GPT 之前 ...:模型规模和数据规模概览🌊 ChatGPT 有三个训练阶段…...
精选10个好用的WordPress免费主题
10个好用的WordPress免费主题 1. Astra Astra 是全球最受欢迎的 WordPress 主题。它功能丰富,易于使用,SEO友好,是第一个安装量突破100万的非默认主题,并获得了5000多个五星好评。 它完美集成了Elementor、Beaver,古…...
算法日常刷题笔记(6)
重整旗鼓 第六篇笔记 第一天 使字符串平衡的最小交换次数 给你一个字符串 s ,下标从 0 开始 ,且长度为偶数 n 。字符串 恰好 由 n / 2 个开括号 [ 和 n / 2 个闭括号 ] 组成。 只有能满足下述所有条件的字符串才能称为 平衡字符串 : 字符串…...
【Unity3D脚本与系统设计6】鼠标触摸超时待机实现
实现步骤 在Unity中实现一个功能,当鼠标或触摸超过一定时间没有操作时,自动返回待机界面。 检测输入 首先,我需要检测用户的输入,无论是鼠标还是触摸。Unity的Input系统可以检测到鼠标和触摸事件,比如Input.GetAxis…...
【Spring篇】Spring的生命周期
一、Bean 生命周期的核心阶段 1. 实例化(Instantiation) • 触发时机:容器启动时(单例 Bean)或请求时(原型 Bean)。 • 实现方式: 通过反射(Class.newInstance() 或构造…...
C# 的Lambda表达式常见用法和示例
C# 的 Lambda 表达式是一种强大的语法糖,能够极大简化代码并增强灵活性。以下是它的主要功能和应用场景,结合具体示例说明: 1. 简化委托实例化 Lambda 可以快速定义委托(如 Func、Action),无需显式…...
C++学习之路:从头搞懂配置VScode开发环境的逻辑与步骤
目录 编辑器与IDE基于vscode的C开发环境配置1. 下载vscode、浅尝编译。番外篇 2. 安装插件,赋能编程。3. 各种json文件的作用。c_cpp_properties.jsontask.jsonlaunch.json 总结&&彩蛋 编辑器与IDE 上一篇博客已经介绍过了C程序的一个编译流程,从…...
Web3与网络安全:如何确保去中心化应用的安全性
Web3与网络安全:如何确保去中心化应用的安全性 随着区块链技术的蓬勃发展,Web3的概念逐渐成为互联网发展的新趋势。Web3强调去中心化、用户主权和数据隐私,它的核心是构建一个更加开放、透明和安全的网络环境。然而,随着去中心化…...
插值法笔记 ——武汉理工统计 周
第二章 插值法 插值法定义 插值函数定义 设函数 y f ( x ) y f(x) yf(x) 在区间 [a,b] 上有定义,且满足节点排列: a ≤ x 0 < x 1 < ⋯ < x n ≤ b a \leq x_0 < x_1 < \cdots < x_n \leq b a≤x0<x1<⋯<xn≤b …...
23种设计模式-命令(Command)设计模式
命令设计模式 🚩什么是命令设计模式?🚩命令设计模式的特点🚩命令设计模式的结构🚩命令设计模式的优缺点🚩命令设计模式的Java实现🚩代码总结🚩总结 🚩什么是命令设计模式…...
